Как отключить РЕЖИМ САМОЛЕТА Планшет поддерживает 4.4.2

Мне нужно отключить AIRPLANE MODE и DATE TIME SETTINGS в моем приложении, для этого я использовал эти фильтры намерений, но none из них works для меня

        <uses-permission android:name="android.permission.WRITE_SETTINGS" />

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.HOME" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

        <intent-filter>
           <action android:name="android.settings.AIRPLANE_MODE_SETTINGS" />
           <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>

        <intent-filter>
           <action android:name="android.settings.DATE_SETTINGS" />
           <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>

Но ранее я успешно отключил Settings, используя ниже intent-filter

        <intent-filter >
            <action android:name="android.settings.SETTINGS" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>

person Sun    schedule 14.10.2014    source источник
comment
Что значит отключить режим полета в самолете? Вы хотите отключить его программно? Вы хотите, чтобы пользователь не отключал его при использовании вашего приложения?   -  person Stephane Mathis    schedule 21.10.2014
comment
Могу я спросить вас, почему вы хотите отключить режим полета? Кроме того, почему вы хотите отключить основные системные функции?   -  person Leon Joosse    schedule 21.10.2014
comment
@StephaneMathis Нет, я хочу запретить пользователю включать его при использовании моего приложения.   -  person Sun    schedule 21.10.2014


Ответы (2)


Что касается версии 4.2 и выше, вы не можете программно управлять режимом полета.

Вы можете сделать это, только если у пользователя есть рутированное устройство.

Как написано в API DOC:

"Некоторые настройки устройства, определенные в Settings.System, теперь имеют значение read-only. Если ваше приложение попытается записать изменения в настройки, определенные в Settings.System, которые были перенесены в Settings.Global, операция записи автоматически завершится ошибкой при работе на Android 4.2 и более поздних версиях. Даже если ваше значение для android:targetSdkVersion и android:minSdkVersion ниже 17, ваше приложение не сможет изменить настройки, которые были перемещены в Settings.Global при работе на Android 4.2 и более поздних версиях."

person gilonm    schedule 21.10.2014
comment
Есть ли способ программно включить/выключить режим полета в Android 4.4.2? - person Sun; 21.10.2014
comment
Как указано выше - начиная с версии 4.2 и выше - нет никакого способа, если ваше устройство не рутировано - person gilonm; 21.10.2014

TLDR: не делайте этого.

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

Я рекомендую:

  1. Проверьте, отключен ли режим полета
  2. Если включено, подсказка «это приложение не работает в режиме полета. открыть приложение системных настроек?» с диалогом "да/отмена"
  3. Закройте приложение и/или откройте приложение системных настроек.

EDIT: это выглядит так:

@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
private void checkAirplaneMode() {
    int mode;
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        Log.v(TAG, "work with new api.");
        mode = Settings.Global.getInt(getActivity().getContentResolver(),
                Settings.Global.AIRPLANE_MODE_ON, 0);
    } else {
        Log.v(TAG, "work with old api.");
        mode = Settings.System.getInt(getActivity().getContentResolver(),
                Settings.System.AIRPLANE_MODE_ON, 0);
    }
    Log.v(TAG, "airplane mode: " + mode);

    if(mode == 1 /* airplane mode is on */) {
        new AlertDialog.Builder(getActivity()).setTitle("Sorry!")
                .setMessage("This app doesn't work with Airplane mode.\n"
                        + "Please disable Airplane mode.\n")
                .setPositiveButton("Open Settings", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        startActivity(new Intent(Settings.ACTION_AIRPLANE_MODE_SETTINGS));
                        getActivity().finish();
                    }
                })
                .setNegativeButton("Close app", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        getActivity().finish();
                    }
                })
                .show();
    }
}

вот какой момент.

  • Установите флажок Build.VERSION.SDK_INT, чтобы использовать Settings.Global для более новых устройств. Режим полета перенесен сюда.
  • Если mode == 1, устройство находится в авиарежиме.
  • Открыть настройку режима "В самолете" Activity by
    startActivity(new Intent(Settings.ACTION_AIRPLANE_MODE_SETTINGS));
person ytRino    schedule 21.10.2014
comment
Я попробовал это решение: compiletimeerror.com/2014 /01/ и я могу включить/выключить режим полета на Android версии 4.0.4, но получаю сообщение об ошибке при использовании на Android 4.4.2, так что вы можете показать мне, как это сделать? - person Sun; 21.10.2014