Приемник режима полета в манифесте?

Я работаю над разработкой приложения для Android, которое будет использоваться в качестве портативного контроллера в промышленной среде. Чтобы сделать планшет менее желательным для дома, я собирался попытаться программно включить режим полета все время, но это устарело в версии 4.2, которую мы также используем для того, чтобы иметь Android Open Accessory. Однако я подумал, что если бы я мог зарегистрировать приемник в манифесте, чтобы он запускал мое приложение в любое время при изменении режима полета, а затем проверял, выключен ли он, и предлагал пользователю снова включить его.

Я пробовал это следующее решение, также найденное как ответ на это проблема.

<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 здесь.

Теперь ни одно из этих решений не приводит к запуску моего приложения при изменении режима полета.

Можно ли зарегистрировать BroadcaseReceiver для режима "В самолете" в файле манифеста, чтобы это намерение запускало приложение?

Редактировать 1: у меня есть BroadcastReceiver, работающий в коде Java, чтобы я мог обнаружить эту ситуацию, пока мое приложение активно. Это не то, что я ищу, хотя. Спасибо.

Редактировать 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 ATTACHED and the MAIN launcher work just fine and start my app from an onCreate point. However the AIRPLANE_MODE does not seem to do anything.

И вот мой 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;
        }
    }
};

однако, насколько я понимаю, это регистрируется только тогда, когда приложение работает, я хочу, чтобы приемник был зарегистрирован, даже когда приложение не запущено.


person TronicZomB    schedule 06.03.2013    source источник
comment
да, возможно использование ‹action android:name=android.intent.action.AIRPLANE_MODE /›   -  person DjHacktorReborn    schedule 06.03.2013
comment
@DjHacktorReborn Нужны ли мне теги uses-permission? Спасибо.   -  person TronicZomB    schedule 06.03.2013
comment
@DjHacktorReborn Спасибо за ответ, но, похоже, мое приложение не запускается при изменении режима полета.   -  person TronicZomB    schedule 06.03.2013
comment
выложи ресивер который нужно поменять   -  person DjHacktorReborn    schedule 06.03.2013
comment
Я разместил свой полный файл манифеста   -  person TronicZomB    schedule 06.03.2013
comment
Есть ли какой-либо класс приемника или какой-либо класс расширяет приемник вещания?   -  person DjHacktorReborn    schedule 06.03.2013
comment
вам нужно иметь широковещательный приемник, который будет получать намерение приемника при выстреле   -  person DjHacktorReborn    schedule 06.03.2013
comment
Я поставил свой BroadcastReceiver. Дело в том, что приемник USB_ACCESSORY_ATTACHED в манифесте никогда не входит в BroadcastReceiver, но запускает мое приложение так, как я хочу. Я хочу что-то подобное с AIRPLANE_MODE. Теперь, когда логическое значение airplaneMode в BroadcastReceiver(BR) изменяется, поток в моей активности, который расширяет I2CActivity, где находится BR, затем запускает AlertDialog, чтобы предложить пользователю.   -  person TronicZomB    schedule 06.03.2013


Ответы (2)


Благодаря лучшему пониманию приемников, определенных 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 с именем AirplaneModeReceiver и поместите в него следующее:

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

Теперь это будет запускать действие всякий раз, когда происходит изменение режима полета, будь то включен или выключен. Я не стал писать код для проверки того, отключен ли режим полета, а затем запускать действие дальше, поскольку вместо этого переключился на приложение в стиле запуска на домашнем экране.

person TronicZomB    schedule 21.05.2013
comment
Может ли кто-нибудь подтвердить, работает ли вышеизложенное в более ранних версиях API (например, Android 2.3), поскольку у меня есть приемник, настроенный идентично вышеописанному, и хотя аналогичные приемники работают нормально, режим полета, похоже, вообще не срабатывает, и я понятия не имею, почему. - person Haravikk; 14.01.2014

Вот фрагмент для приемника

public void onReceive(Context context, Intent intent) {
        if (intent.getAction().intern() == Intent.ACTION_AIRPLANE_MODE_CHANGED) {
// Launch your app here
}
person DjHacktorReborn    schedule 06.03.2013