如何更改Android的飞行模式的行为,以便它不会关闭蜂窝无线电?

时间:2010-11-28 16:35:12

标签: java android android-intent action

我一直在尝试创建一个简单的应用程序,让用户自定义Android中飞行模式的行为。这样做的动机来自于拥有三星Fascinate的亲戚,在通话过程中他会意外打开飞机模式。这种情况发生在他拿着手机时,不小心按住侧面电源/锁定按钮,这会打开一个对话框,其中包含“静音模式”,“飞行模式”和“关机”菜单。他不小心通过触摸他的脸颊来触发飞机模式。这会使电话掉线,对他来说是一种烦恼。

最终,我想创建一个应用程序,防止在用户处于通话过程中关闭蜂窝无线电。但是,对于第一次迭代,我认为让用户手动选择哪种无线电被飞机模式关闭是有意义的。

希望修改Android源代码或执行需要root权限的操作。我正在寻找标准框架内的解决方案

我首次尝试解决此问题的方法是创建一个可以修改System.AIRPLANE_MODE_RADIOS的应用程序:

System.putString(getApplication().getContentResolver(), System.AIRPLANE_MODE_RADIOS, "");

According to the API docs,此常量为“以飞机模式开启时需要禁用的以逗号分隔的无线电列表”。似乎飞机模式实际上并不使用此常量,并且在更改后它将继续正常工作。

我的下一次尝试是创建一个BroadCastReceiver,接收AIRPLANE_MODE操作,然后发出一个Intent来反转它:

Intent am = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", 0);
context.sendBroadcast(am);

激活后,这会关闭飞行模式。但是,如果用户处于呼叫中间,它仍将被丢弃(这是有道理的)。所以,这不是解决我问题的方法。

有谁知道如何防止飞机模式禁用手机无线电?

6 个答案:

答案 0 :(得分:6)

据我所知,你无法做到这一点,因为如果第三方应用程序能够访问设备上启用了飞行模式的塔,则选项本身(飞行模式)将毫无用处。

答案 1 :(得分:2)

PhoneApp.java的来源

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

明确说明为什么这不起作用。

与仅在飞机模式无线电列表中为Intent.ACTION_AIRPLANE_MODE_CHANGED注册接收器的wifi和蓝牙实现相比,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);
}

鉴于飞机模式的目的,我确信这是一个故意的功能,而不是一个错误。

答案 2 :(得分:0)

如果飞机模式由物理按钮触发,则可以覆盖按钮按下操作。虽然要实现这一目标,但我认为它需要root用户访问系统。

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

答案 3 :(得分:0)

某些应用程序修改了实际的呼入进度屏幕,我知道我的Fascinate上预先安装的CityID事件(告诉我与正在拨打或传入的号码的区号相关联的城市)能够在拨打号码之前中断呼叫,告诉我注册软件。如果你可以制作自己的(全屏)通话视图,那么听起来你有一个解决方案。也许不是最优雅的,但它解决了这个问题。

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

答案 4 :(得分:0)

我在市场上有一款名为“飞机模式Wi-Fi工具”的应用, 它允许用户使用以下方法执行此操作:

Settings.System.putString(getContentResolver(), 
        Settings.System.AIRPLANE_MODE_RADIOS, "cell,bluetooth");

默认RADIOS是“cell,bluetooth,wifi”(这些是启用飞行模式时关闭的无线电。

答案 5 :(得分:0)

我认为你无法做到这一点,因为它会使飞机模式变得多余。人们会认为有可能不允许飞机模式以某种方式开始。我认为你正在寻找的解决方案是一个坏主意,因为它修改了一个应用程序,使它无用,同时仍允许它运行。问题是设计问题应该由电话创建者解决。我没有使用android的真实经验(但是)我会想象你在标准框架中寻找的那种功能不会存在。

我确信这个问题有一个合理的方法,但它不太可能朝着你的方向发展。