代码之家  ›  专栏  ›  技术社区  ›  Eric Levine

我怎样才能改变Android的飞行模式,使其不会关闭手机广播?

  •  4
  • Eric Levine  · 技术社区  · 15 年前

    我一直在尝试创建一个简单的应用程序,让用户自定义Android中飞机模式的行为。这样做的动机来自一个对三星很着迷的亲戚,在打电话时,他会意外地打开飞机模式。当他拿着手机,不小心按住侧面的电源/锁定按钮时,就会发生这种情况,该按钮会打开一个对话框,其中包含静音模式、飞行模式和关机菜单。他不小心用手机碰了一下脸颊,就触发了飞行模式。这让他很恼火。

    最后,我想创建一个应用程序,防止手机收音机关闭时,用户正在通话。但是,在第一次迭代中,我认为让用户手动选择哪个收音机是有意义的 不 通过飞行模式关闭。

    我是 不 希望修改Android源代码或执行需要根目录的操作。我正在寻找一个标准框架内的解决方案

    我解决这个问题的第一个尝试是创建一个可以修改 System.AIRPLANE_MODE_RADIOS 就像这样:

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

    According to the API docs ,此常量是“打开飞行模式时需要禁用的无线电的逗号分隔列表”。似乎飞机模式实际上并没有使用这个常数,在改变后它继续正常工作。

    我的下一个尝试是创建一个广播接收器,接收“飞行模式”操作,并发送一个反向意图:

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

    这会在激活飞行模式后关闭飞行模式。但是,如果用户正在通话中,它仍然会被丢弃(这是有意义的)。所以,这不是解决我问题的办法。

    有人知道如何防止飞行模式禁用蜂窝无线电吗?

    6 回复  |  直到 15 年前
        1
  •  2
  •   Vadim Kotov First Zero    9 年前

    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);
    }
    

    考虑到飞行模式的目的,我确信这是一个有意的特性,而不是一个bug。

        2
  •  6
  •   DeRagan    15 年前

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

        3
  •  0
  •   emx    15 年前

    如果飞行模式是由一个物理按钮触发的,则可以覆盖按钮按下动作。尽管要实现这一点,我相信它需要对系统进行根访问。

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

        4
  •  0
  •   sova    15 年前

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

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

        5
  •  0
  •   velazcod    15 年前

    我在市场上有一个叫“飞行模式Wi-fi工具”的应用程序, 它允许用户使用以下方法执行此操作:

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

    默认收音机为“cell,bluetooth,wifi”(这些收音机在启用飞行模式时关闭)。

        6
  •  0
  •   toc777    15 年前

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

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