清单中的飞行模式接收器?

2024-03-24

我正在开发一个 Android 应用程序,该应用程序将在工业环境中用作手持控制器。为了让平板电脑不太适合带回家,我本来打算一直尝试以编程方式打开飞行模式,但这在 4.2 中已被弃用,这也是我们为了拥有 Android Open Accessory 而使用的版本。但是我在想,是否可以在清单中注册一个接收器,以便在更改飞行模式时启动我的应用程序,然后检查它是否关闭并提示用户重新打开它。

我尝试过以下解决方案,也找到了答案this https://stackoverflow.com/questions/2294971/intent-action-for-network-events-in-android-sdk问题。

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<receiver android:name=".receiver.ConnectivityReceiver">
<intent-filter>
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>

我也尝试过这段代码:

<receiver android:enabled="true" android:name=".ConnectivityReceiver">
<intent-filter>
    <action android:name="android.intent.action.SERVICE_STATE"/>
</intent-filter>
</receiver>

撒克逊人也找到了答案here https://stackoverflow.com/questions/4319212/how-can-one-detect-airplane-mode-on-android.

现在,这些解决方案都不会导致我的应用程序在更改飞行模式时启动。

是否可以在清单文件中注册用于飞行模式的 BroadcaseReceiver 并让该意图启动应用程序?

编辑1:我确实在java代码中工作了BroadcastReceiver,这样我就可以在我的应用程序处于活动状态时检测到这种情况。但这不是我想要的。谢谢。

编辑2:这是我当前的整个清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.i2c"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="17"
    android:targetSdkVersion="17" 
    android:maxSdkVersion="17"/>
    <!-- SDK 14 = 4.0 ICS
         SDK 17 = 4.2 JB -->             

<!-- Assures software is not loaded onto unsupported screen size, i.e. phones -->
<supports-screens android:xlargeScreens="true"
    android:largeScreens="true"
    android:normalScreens="false"
    android:smallScreens="false"
    android:anyDensity="true"/>

<uses-feature android:name="android.hardware.usb.accessory"/>

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.i2c.mainActivity"
        android:label="@string/app_name"  
        android:configChanges="keyboardHidden|orientation|screenSize"
        android:launchMode="singleTask">
        <intent-filter>
            <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"/>
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.AIRPLANE_MODE" />
        </intent-filter>
        <meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
            android:resource="@xml/accessory_filter"/>
    </activity>
</application>

The USB_ACCESSORY ATTACHEDMAIN启动器工作得很好,并从onCreate观点。但是,那AIRPLANE_MODE似乎什么也没做。

这是我的 BroadcastReceiver,它位于 java 代码中:

    private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver(){
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("I2CActivity", "onReceive of BroadcastReceiver()");
        String action = intent.getAction();
        if(ACTION_USB_PERMISSION.equals(action)) {
            Log.d("ACTION_USB_PERMISSION", action.toString());
            synchronized (this) {
                Log.d("syncronized", this.toString());
                UsbAccessory accessory = (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
                if(intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                    if (accessory != null) {
                        OpenAccessory(accessory);
                    }
                }
                else {
                    Log.d("mUsbReceiver", "permission denied for accessory " + accessory);
                }
            }
        }
        else if(UsbManager.ACTION_USB_ACCESSORY_ATTACHED.equals(action)) {
            Log.d("ACTION_USB_ACCESSORY_ATTACHED", action.toString());
            UsbAccessory accessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
            if (accessory != null) {
                resumeAccessory();
            }
        }
        else if(UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)) {
            Log.d("ACTION_USB_ACCESSORY_DETACHED", action.toString());
            UsbAccessory accessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
            if (accessory != null) {
                closeAccessory();
            }
        }
        else if(Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(action)) {
            Log.e("Airplane Mode", "Airplane mode changed");
            airplaneMode = Settings.Global.getInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
        }
    }
};

然而,根据我的理解,这仅在应用程序运行时注册,我想要一个即使应用程序未运行时也注册的接收器。


随着更好的理解Intents和 XML 定义的接收器我能够弄清楚这一点。仅在 API 17 上进行了测试。这是清单的代码:

<receiver android:name="com.example.i2c.AirplaneModeReceiver">
     <intent-filter>
         <action android:name="android.intent.action.AIRPLANE_MODE"/>
     </intent-filter>
</receiver>

然后创建一个java类文件,名为飞行模式接收器并将以下内容放入其中:

public class AirplaneModeReceiver extends BroadcastReceiver {
   public void onReceive(Context context, Intent intent) {
       Intent startActivityIntent = new Intent(context, MainActivity.class);
       startActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
       context.startActivity(startActivityIntent);
   }    
}

现在,只要飞行模式发生变化(无论是打开还是关闭),就会启动该活动。自从切换到主屏幕启动器样式应用程序以来,我没有继续编写代码来检查飞行模式是否关闭,然后进一步启动活动。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

清单中的飞行模式接收器? 的相关文章

随机推荐

  • groovy 执行时参数包含空格

    如何向 groovy 中字符串的执行方法提供包含空格的参数 仅仅像在 shell 中那样添加空格并没有帮助 println ls tmp folder with spaces execute text 这会给 ls 调用带来三个错误的参数
  • 如何从这些输出中获取实际的函数名称

    我使用 boost 测试进行单元测试 使用 gcov 和 lcov 来测量覆盖范围 不幸的是 genhtml 生成类似函数覆盖率的报告 我现在想知道有什么功能 ZN7UtilLib11ProgressBarC2EjdRSo实际上是 到目前为
  • java.lang.SecurityException:需要 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION 权限

    我正在开发一个 android 我想使用 NETWORK PROVIDER 获取用户位置 我没有使用 GPS 来实现此目的 我收到以下异常 java lang SecurityException 需要 ACCESS FINE LOCATIO
  • 从 void* 到 char** 的转换无效

    自从我搞乱 C 代码以来已经有一段时间了 在 Ubuntu 下使用 gcc 编译 C 代码时出现以下错误 我用来编译代码的命令是 如果这些错误是由于我使用的编译器造成的 请让我知道如何消除该错误 gcc o runnable mycode
  • C 中的 sizeof(array):分段错误 [重复]

    这个问题在这里已经有答案了 嗨 我从这段代码中得到了一个奇怪的分段错误 int main void int array1 10000000 int n sizeof array1 printf d n n return 0 但是如果我改变
  • 数据绑定编译器错误:“无法解析 SafeVarargs 的类型”

    我已经尝试让 Android 数据绑定正常工作两天了 编译器问题接二连三地出现 现在我完全碰壁了 我用谷歌搜索了这个 但没有找到任何东西 这是完整的日志 java lang RuntimeException failure see logs
  • Visual Studio 2015 调用堆栈显示

    最近在我的计算机上全新安装了 Windows 10 Pro 后 我注意到每当我中断程序并打开调用堆栈时 调用堆栈都会显示应用程序名称和行号 但函数名称显示为
  • 寻找 2 个以上整数的 GCD(最大公约数)?

    我已经有一个函数可以找到 2 个数字的 GCD function getGCDBetween a b while b 0 m a b a b b m return a 但现在 我想扩展这个函数来找到 N 点的 GCD 有什么建议吗 有一种更
  • 概述 div 和图像

    我正在开发我的作品集网站 但遇到了问题 一旦我想要多层 你必须看到才能理解这一点 它们的排列完全不同 我对图像使用了相同的像素大小 重要提示 我只能对图像和内容周围的 div 使用像素 因为我需要使用 media 来更改我手机的页面 所以我
  • 使用自定义 url_path 在 @list_route 上反向

    如果我有一个包含以下代码的视图集 class ExtraRouteViewset viewsets GenericViewSet list route methods get def somefunction self request re
  • 函数内相加后结果不正确

    我有一个 java 程序没有返回正确的答案 我不明白为什么 这是代码 public class hello public static void main String args int a 5 doubleNumbers a System
  • PLSQL 错误 - ORA-00984:此处不允许列

    我写了一个 PL SQL 块 DECLARE SchemaName VARCHAR2 50 REQ SUNIL 5750 userpassword VARCHAR2 50 XYZ stmt VARCHAR2 5000 BEGIN stmt
  • Perl 的哪个版本引入了 try/catch?

    我知道 Perl 最近得到了try catch 附带的 Perl 版本是什么 最被忽视的预实验 https perldoc perl org perlexperiment页面列出了添加的功能以及 有时 后来从实验类别中毕业的功能 您还可以查
  • 如何将两个 AngularJS 应用程序合并为一个主应用程序的模块?

    另一个基本的 AngularJS 问题 我有两个 AngularJS 应用程序 slider js 角度用户界面 json js Here s slider js作为一个笨蛋 http plnkr co edit zySArHvqZgJHH
  • SVN 并重命名其运行的服务器

    我运行 VisualSVN 作为我的 SVN 服务器并使用 TortoiseSVN 作为客户端 我刚刚将服务器从 mach1 重命名为 mach2 现在无法使用 SVN 因为它正在寻找以下位置的存储库http mach1 81 http m
  • 概率密度函数 numpy 直方图/scipy stats

    我们有数组a range 10 Using numpy histogram hist bins numpy histogram a bins np max a np min a 1 range np min a np max a densi
  • Google Chrome 开发者工具中的自定义堆栈跟踪?

    我希望自定义 Google Chrome 开发人员工具 脚本 选项卡中 strack 跟踪面板中显示的项目 具体来说 我想过滤掉堆栈跟踪中的项目 并向堆栈跟踪中的某些项目添加更多描述性名称 而不必重命名我的对象和函数 我在以下位置找到了 V
  • 关闭 VTK 窗口 (Python)

    考虑以下脚本 import vtk ren vtk vtkRenderer renWin vtk vtkRenderWindow renWin AddRenderer ren iren vtk vtkRenderWindowInteract
  • Linux内核如何中断应用程序?

    首先 我是一名设备驱动程序人员 这是我第一次处理用户模式程序 我曾经有一个中断服务程序来响应硬件中断 换句话说 硬件使用中断服务程序来通知驱动程序进行服务 我现在使用 ioctl 作为应用程序和设备驱动程序之间通信的通道 并轮询它以等待响应
  • 清单中的飞行模式接收器?

    我正在开发一个 Android 应用程序 该应用程序将在工业环境中用作手持控制器 为了让平板电脑不太适合带回家 我本来打算一直尝试以编程方式打开飞行模式 但这在 4 2 中已被弃用 这也是我们为了拥有 Android Open Access