Переключить режим самолета в Android

Я сделал ошибку? Это не работает.

public void airplane() { boolean isEnabled = Settings.System.getInt(this.getApplicationContext().getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) == 1; Settings.System.putInt(context.getContentResolver(),Settings.System.AIRPLANE_MODE_ON,isEnabled ? 0 : 1); //Settings.System.putInt(this.getApplicationContext().getContentResolver(),Settings.System.AIRPLANE_MODE_ON,isEnabled ? 0 : 1); Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); } 

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

Адаптировано из режима управления самолетом :

 // read the airplane mode setting boolean isEnabled = Settings.System.getInt( getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) == 1; // toggle airplane mode Settings.System.putInt( getContentResolver(), Settings.System.AIRPLANE_MODE_ON, isEnabled ? 0 : 1); // Post an intent to reload Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); intent.putExtra("state", !isEnabled); sendBroadcast(intent); 

На корневом устройстве можно использовать следующее.

Из командной строки вы можете включить / выключить режим полета в следующем порядке:

 ON: settings put global airplane_mode_on 1 am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true OFF: settings put global airplane_mode_on 0 am broadcast -a android.intent.action.AIRPLANE_MODE --ez state false 

Это работает с Android 4.4.2+

Я думаю, что «Settings.System.AIRPLANE_MODE_ON» устарел, я использую:

 public class AirplaneModeService { public boolean run(Context context) { boolean isEnabled = isAirplaneModeOn(context); // Toggle airplane mode. setSettings(context, isEnabled?1:0); // Post an intent to reload. Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); intent.putExtra("state", !isEnabled); context.sendBroadcast(intent); return true; } public static boolean isAirplaneModeOn(Context context) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) { return Settings.System.getInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) != 0; } else { return Settings.Global.getInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) != 0; } } public static void setSettings(Context context, int value) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) { Settings.System.putInt( context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, value); } else { Settings.Global.putInt( context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, value); } } } 

Надеюсь, это поможет кому-то.

Работает для всех версий API.

  • коммутатор authomaticaly для API <17
  • открыть По умолчанию Активность режима самолета для действий пользователя для API> = 17

нет root, нет разрешения на системном уровне !


в AndroidManifest.xml добавить разрешение:

   

тогда:

 @SuppressWarnings("deprecation") private void initAirplanemodeBtn() { airplanemodeButton = (ToggleButton) findViewById(R.id.airplanemode_btn); airplanemodeButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (android.os.Build.VERSION.SDK_INT < 17) { try { // read the airplane mode setting boolean isEnabled = Settings.System.getInt( getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) == 1; // toggle airplane mode Settings.System.putInt( getContentResolver(), Settings.System.AIRPLANE_MODE_ON, isEnabled ? 0 : 1); // Post an intent to reload Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); intent.putExtra("state", !isEnabled); sendBroadcast(intent); } catch (ActivityNotFoundException e) { Log.e(TAG, e.getMessage()); } } else { try { Intent intent = new Intent(android.provider.Settings.ACTION_AIRPLANE_MODE_SETTINGS); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } catch (ActivityNotFoundException e) { try { Intent intent = new Intent("android.settings.WIRELESS_SETTINGS"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } catch (ActivityNotFoundException ex) { Toast.makeText(buttonView.getContext(), R.string.not_able_set_airplane, Toast.LENGTH_SHORT).show(); } } } } }); } 

После леденца вы можете использовать метод ниже, но он скрыт api, а вашему приложению требуется разрешение на уровне системы

  ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); mgr.setAirplaneMode(true); 

Как сказал @eggyal, переключение режима полета не может быть выполнено с версии 4.2 и выше.

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

Wifi можно контролировать с помощью WifiService ~ getSystemService (Context.WIFI_SERVICE). Bluetooth можно управлять с помощью BluetoothAdapter- getSystemService (Context.BLUETOOTH_SERVICE).

После некоторого исследования я обнаружил, что с помощью Java Reflection вы все равно можете управлять радиостанциями Android (Wifi, Network, Bluetooth), что в основном использует режим полета, это переключение состояния Bluetooth, Wi-Fi и сетей.

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

ПРЕДУПРЕЖДЕНИЕ: Использование Reflection может привести к сбою на некоторых устройствах (зависит от реализации производителями classов).

Этот пример кода переключает мобильную сеть:

 private void setMobileRadioEnabled(boolean enabled) { try { final ConnectivityManager conman = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); final Class conmanClass = Class.forName(conman.getClass().getName()); final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService"); iConnectivityManagerField.setAccessible(true); final Object iConnectivityManager = iConnectivityManagerField.get(conman); final Class iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName()); final Method setRadio = iConnectivityManagerClass.getDeclaredMethod("setRadio", Integer.TYPE , Boolean.TYPE); setRadio.setAccessible(true); for (NetworkInfo networkInfo : conman.getAllNetworkInfo()) { if(isNetworkTypeMobile(networkInfo.getType())) { setRadio.invoke(iConnectivityManager, networkInfo.getType(), enabled); } } } catch (Exception e) { Log.e(TAG, "Opss...", e); } } public static boolean isNetworkTypeMobile(int networkType) { switch (networkType) { case ConnectivityManager.TYPE_MOBILE: case ConnectivityManager.TYPE_MOBILE_MMS: case ConnectivityManager.TYPE_MOBILE_SUPL: case ConnectivityManager.TYPE_MOBILE_DUN: case ConnectivityManager.TYPE_MOBILE_HIPRI: case 10: case 11: case 12: case 14: return true; default: return false; } } 

здесь перед каждым настройком используйте android.provider вот так:

 public class MainActivity extends Activity implements OnClickListener { Button air; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); air = (Button) findViewById(R.id.button1); air.setOnClickListener(this); } @Override public void onClick(View arg0) { // TODO Auto-generated method stub // read the airplane mode setting boolean isEnabled = android.provider.Settings.System.getInt( getContentResolver(), android.provider.Settings.System.AIRPLANE_MODE_ON, 0) == 1; // toggle airplane mode android.provider.Settings.System.putInt( getContentResolver(), android.provider.Settings.System.AIRPLANE_MODE_ON, isEnabled ? 0 : 1); // Post an intent to reload Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); intent.putExtra("state", !isEnabled); sendBroadcast(intent); } } 

Обратите внимание, что, как описано в API Android 4.2 (выделено мной):

Новые глобальные настройки

Системные настройки были обновлены для поддержки нескольких пользователей с добавлением Settings.Global . Этот набор настроек аналогичен Settings.Secure , поскольку они доступны только для чтения, но применяются глобально во всех пользовательских пространствах на устройстве.

Несколько существующих настроек были перемещены здесь либо из Settings.System или Settings.Secure . Если ваше приложение в настоящее время вносит изменения в настройки, ранее определенные в Settings.System (например, AIRPLANE_MODE_ON ), тогда вы должны ожидать, что это не будет работать на устройстве под управлением Android 4.2 или выше, если эти настройки были перенесены в Settings.Global . Вы можете продолжить чтение настроек, которые находятся в Settings.Global , но поскольку настройки больше не считаются безопасными для приложений, чтобы сделать это, попытка сделать это не удастся, и система будет выписывать предупреждение в системный журнал при запуске приложения. Android 4.2 или выше.

Это работает для меня

 public static boolean isAirplaneModeOn() { return Settings.System.getInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) != 0; } public static void setAirPlaneMode(boolean airplaneMode) { Logger.d(LOG_TAG + "setAirPlaneMode airplaneMode: " + airplaneMode) ; int state = airplaneMode ? 1 : 0; Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, state); Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); intent.putExtra("state", state); mContext.sendBroadcast(intent); } 

Но вам нужны системные разрешения, хотя

  

Я нашел это обходное решение для 17+, если вы хотите отключить интернет, это сработает.

разрешение

  

метод

 @SuppressWarnings({ "unchecked", "rawtypes" }) private void setMobileDataEnabled(boolean state) { try { final ConnectivityManager conman = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); final Class conmanClass = Class.forName(conman.getClass().getName()); final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService"); iConnectivityManagerField.setAccessible(true); final Object iConnectivityManager = iConnectivityManagerField.get(conman); final Class iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName()); final Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE); setMobileDataEnabledMethod.setAccessible(true); setMobileDataEnabledMethod.invoke(iConnectivityManager, state); } catch (Exception e) { e.printStackTrace(); } } 
  • Предложения по предотвращению битовой карты Ошибка в памяти
  • Android: обновление версии БД и добавление новой таблицы
  • Совместное использование Wi-Fi-доступа через Bluetooth
  • Где я могу создать и использовать ScheduledThreadPoolExecutor, TimerTask или Handler?
  • Stackoverflow: вызвано вложенными представлениями?
  • андроид на прослушивателе изменения текста
  • Обнаружение входящих и исходящих SMS-сообщений
  • Разница между гравитацией и layout_gravity на Android
  • Обновите Android SDK Tool до 22.0.4 (последняя версия) с 22.0.1
  • Преобразование строк-строк с наносекундами
  • Остановить EditText от получения фокуса при запуске Activity
  • Interesting Posts

    Диалоговое окно сообщает мне, что отсутствует драйвер при установке 64-разрядной версии Windows 7

    Захват событий мыши из каждого компонента на C # WInForm

    Haskell: как оценить строку типа «1 + 2»

    Почему нет вызова конструктору?

    java, расширяющий class с конструктором основного classа имеет параметр

    Swift 2.0: «enumerate» недоступен: вызовите метод «enumerate ()» в последовательности

    Как показать несколько маркеров в MapFragment в Google Map API v2?

    Быстрее ли иметь четыре раза 2 ГБ или два раза 4 ГБ ОЗУ с двухканальной материнской платой?

    Как взорвать вектор строк в строку (элегантный способ)

    Конкатенация строк в Less

    Android: прослушиватель изменений в подключении к Интернету

    Должен ли компилятор указывать / предупреждать при передаче экземпляров объекта непосредственно в качестве параметров интерфейса const?

    Слияние свободного пространства и свободного пространства на жестком диске

    Как получить доступ к первому свойству объекта в Javascript?

    Контурный объект (обычная шкала + трафаретная маска) three.js

    Давайте будем гением компьютера.