gpt4 book ai didi

android - list 中的飞行模式接收器?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:41:25 25 4
gpt4 key购买 nike

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

我尝试了以下解决方案,也找到了 this 的答案问题。

<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>

也被 saxos 发现为 aswer here .

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

是否可以在 list 文件中为飞行模式注册 BroadcaseReceiver 并让该 Intent 启动应用程序?

编辑 1:我确实让 BroadcastReceiver 在 java 代码中工作,这样我就可以在我的应用程序处于 Activity 状态时检测到这种情况。那不是我要找的东西。谢谢。

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

<?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>

USB_ACCESSORY ATTACHEDMAIN 启动器工作正常,并从 onCreate 点启动我的应用程序。然而 AIRPLANE_MODE 似乎没有做任何事情。

这是我在 java 代码中的 BroadcastReceiver:

    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 上进行了测试。这是 list 的代码:

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

然后创建一个名为 AirplaneModeReceiver 的 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);
}
}

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

关于android - list 中的飞行模式接收器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15250879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com