如何更改Android飞行模式的行为,使其不会关闭移动网络信号?

4
我一直在尝试创建一个简单的应用程序,让用户可以自定义Android中飞行模式的行为。这个想法来自于我的一个亲戚,他有一部三星Fascinate手机,在通话过程中会意外打开飞行模式。这是因为他握住手机时不小心按住了侧面的电源/锁定按钮,然后就会弹出一个对话框,其中包含“静音模式”、“飞行模式”和“关机”菜单选项。他的脸碰到手机时会意外触发飞行模式,导致通话中断,给他带来了麻烦。
最终,我想创建一个应用程序,防止在用户正在通话时关闭蜂窝网络。但是,作为第一次迭代,我认为让用户手动选择哪些无线电设备不会被飞行模式关闭是有意义的。
想修改Android源代码或进行需要root权限的操作。我正在寻找标准框架内的解决方案。
我尝试解决这个问题的第一步是创建一个应用程序,以以下方式修改System.AIRPLANE_MODE_RADIOS:
System.putString(getApplication().getContentResolver(), System.AIRPLANE_MODE_RADIOS, "");

根据API文档,这个常量是“需要在飞行模式下禁用的一组无线电”,但似乎飞行模式实际上并没有使用这个常量,在更改后仍然正常工作。
我的下一个尝试是创建一个广播接收器,接收AIRPLANE_MODE操作,并发送一个意图来撤销它:
Intent am = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", 0);
context.sendBroadcast(am);

这确实可以在激活飞行模式后关闭它。但是,如果用户正在通话中,通话仍将被中断(这很合理)。因此,这并不完全解决我的问题。
有人知道如何防止飞行模式禁用蜂窝网络吗?

5
难道更明智的解决方案不是改变按钮配置,使其不会启用飞行模式吗? - John Carter
5
这样做会不会完全违背手机飞行模式存在的意义? - jonmorgan
@spookyjon - 是的,这正是用户所要求的。 - Eric Levine
@therefromhere - 如果可能的话,那当然是一个解决方案。我没有三星Fascinate手机,所以我不知道这个按钮是否可以重新映射。 - Eric Levine
6个回答

6
据我所知,如果第三方应用程序能够在设备上启用飞行模式并访问基站,则选项本身(飞行模式)将无效,因此您将无法实现此操作。

我理解并同意安全性的重要性。虽然我不认为这是为了破坏平台的任何安全措施,而是允许用户自定义操作系统的行为。如果他们希望飞行模式有所不同(或根本没有),那就是他们的权利。如果这在技术上不可能,那也没关系。但是,我想知道为什么根据文档,更改System.AIRPLANE_MODE_RADIOS应该可以实现这一点。 - Eric Levine
仔细思考后,我的反驳是文档中并没有说明不能或不应该这样做。如果你能指出类似的内容,我会接受它作为答案。此外,System.AIRPLANE_MODE_RADIOS似乎提供了我想要的功能。System.AIRPLANE_MODE_RADIOS显然无法正常工作,我认为这可能是一个错误或误导性的文档。 - Eric Levine
3
你误解了谷歌所称的开放平台的意思。不幸的是,他们指的是该平台向创建设备的原始设备制造商开放(尽管如果这些制造商想在设备上使用谷歌应用程序,则在某些方面,他们进行更改的自由受到限制)。 - Chris Stratton
@chris-stratton 我理解你的观点,但我认为我们过度使用了“开放”这个术语。当我说它对开发人员是开放的时候,我的意思是第三方应用程序被视为一等公民。它们可以像任何其他应用程序一样与框架以及彼此交互,并享有相同的特权。我坚信这种开放性是Android的核心价值观之一(我刚听到Tim Bray在演讲中提到了它)。对于这个问题,我不想修改Android源代码或做一些需要root权限的事情。我正在寻找标准框架内的解决方案。 - Eric Levine
这可能是因为在某些航班上,WiFi已获准并提供,而AFAIK移动网络从未被允许(尽管随着微型基站的出现,这种情况可能会改变)。 - Chris Stratton
显示剩余6条评论

2

PhoneApp.java的源代码

https://android.googlesource.com/platform/packages/apps/Phone/+/gingerbread-release/src/com/android/phone/PhoneApp.java

这就是为什么它不起作用的原因。

与wifi和蓝牙实现不同,它们只在飞行模式电台列表中注册了一个接收器来接收Intent.ACTION_AIRPLANE_MODE_CHANGED,而PhoneApp则一直运行:

IntentFilter intentFilter =
new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED);

然后无条件地对其进行操作:

if (action.equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)) {
    boolean enabled = System.getInt(getContentResolver(),
            System.AIRPLANE_MODE_ON, 0) == 0;
    phone.setRadioPower(enabled);
}

考虑到飞行模式的作用,我相信这是一个有意的特性,而不是一个错误。


感谢您对PhoneApp如何处理飞行模式进行技术解释。 - Eric Levine
不用谢。但是如果你决定更改Android安装,我强烈建议你这样做,以防止意外激活飞行模式,而不是修改飞行模式以保持蜂窝网络开启。 - Chris Stratton
不值得花那么多时间和精力去做到那一步。看起来很多人都遇到了飞行模式的问题:http://androidforums.com/samsung-moment/14206-phone-enters-airplane-mode-random.html - Eric Levine

0

我认为你不可能做到这一点,因为这会使飞行模式变得无用。人们可能认为可以以某种方式禁止启动飞行模式。我认为你正在寻找的解决方案是一个坏主意,因为它修改了一个应用程序,使其无用,同时仍然允许其运行。问题是一个设计问题,应该由手机制造商来解决。我没有真正的安卓经验(但)我想象标准框架中你所寻找的功能不会存在。

我相信有一个合理的方法来解决这个问题,但它不太可能是你所走的方向。


我很感激你的努力,但我正在寻找一个技术性的答案。我一直在讨论你在其他答案评论中提出的观点。 - Eric Levine
你可能不喜欢这个答案,但它是一个明智的解释,为什么你想要做的事情是不被允许的。 - Chris Stratton
这不是一个好的答案,因为它完全是猜测,而不是基于技术的 - “我还没有真正接触过安卓,但我想象……” - Eric Levine

0

如果飞行模式是由物理按钮触发的,则可以覆盖按钮按下操作。但是,我认为要实现这一点需要对系统进行根访问。

但是,通过物理按钮触发飞行模式是一个奇怪的想法。如果该按钮在软件中,并且在通话中,也许您可以创建一个电话应用程序,在呼叫屏幕内没有飞行模式按钮。


这并不仅仅是按下按钮那么简单。我在原始帖子中添加了更多详细信息。我认为由侧面按钮打开的对话框不是特定于应用程序的,因此创建自定义拨号器应用程序无法解决问题。 - Eric Levine

0

有些应用程序会修改实际的通话进程屏幕,我知道预装在我的Fascinate上的CityID(告诉我与拨打或接收电话号码区号相关联的城市)能够在拨打号码之前中断通话,告诉我注册软件。如果您可以制作自己的(全屏)通话进程视图,那么看起来您已经有了解决方案。也许不是最优雅的,但它解决了问题。

我知道这是可能的,因为Opera-mini可以进入“全屏”模式,而您无法从顶部拖动任务菜单;在“全屏”模式下,用户看不到它。


在Fascinate手机上,如果你按住手机侧面的电源/锁定按钮,它会弹出一个菜单,包括“静音模式”、“飞行模式”和“关机”,对吧?但是,当你处于全屏应用程序中时,这个菜单不会出现吗? - Eric Levine
请告诉他开始用左手拿手机?我认为无论使用哪个应用程序,菜单肯定会出现。 - sova
无论是什么应用程序,这个问题似乎都会出现 - 但也许你的亲戚可以用左手拿手机? - sova
那仍然无法回答我的最初问题 - 如何防止飞行模式禁用蜂窝网络? :) - Eric Levine
我注意到 AIRPLANE_MODE_RADIOS 是 android.provider.Settings.System 的一部分... "provider" 是否真的指的是您的手机服务提供商?您是否尝试使用其完全限定(静态)名称 android.provider.Settings.System.AIRPLANE_MODE_RADIOS 进行引用? - sova
显示剩余3条评论

0
我在市场上有一个名为“飞行模式Wi-Fi工具”的应用程序,它允许用户使用以下方法进行操作:
Settings.System.putString(getContentResolver(), 
        Settings.System.AIRPLANE_MODE_RADIOS, "cell,bluetooth");

默认的无线电是“蜂窝,蓝牙,wifi”(这些是在启用飞行模式时关闭的无线电)。


正如我在问题中所述,我已经尝试过使用它。然而,从该列表中删除“cell”(这就是我想要的)没有任何效果。无线电将仍然会被飞行模式启用/禁用。 - Eric Levine
实际上,我的错,我没有完全注意到你说的话...移除wifi或蓝牙可以解决问题,但是移动网络不行,而且它永远不会起作用。当您告诉系统进入飞行模式时,无论如何它都会关闭移动网络,这是硬编码的。 - velazcod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接