В моем приложении есть код, который определяет, активно ли подключен Wi-Fi. Этот код вызывает исключение RuntimeException, если включен режим полета. В любом случае я хотел бы отображать отдельное сообщение об ошибке в этом режиме. Как я могу надежно определить, находится ли устройство Android в режиме полета?
93
Ответы:
/** * Gets the state of Airplane Mode. * * @param context * @return true if enabled. */ private static boolean isAirplaneModeOn(Context context) { return Settings.System.getInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) != 0; }
источник
Settings.Global
.android.intent.action.AIRPLANE_MODE
, так как изменение режима требует времени для завершения. Проверьте против,Intent.ACTION_AIRPLANE_MODE_CHANGED
если хотите это сделать.Расширяя ответ Алекса, включив в него проверку версии SDK, мы получаем:
/** * Gets the state of Airplane Mode. * * @param context * @return true if enabled. */ @SuppressWarnings("deprecation") @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) 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; } }
источник
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
перед методом.И если вы не хотите опрашивать, активен ли режим полета или нет, вы можете зарегистрировать BroadcastReceiver для намерения SERVICE_STATE и отреагировать на него.
Либо в вашем ApplicationManifest (до Android 8.0):
<receiver android:enabled="true" android:name=".ConnectivityReceiver"> <intent-filter> <action android:name="android.intent.action.AIRPLANE_MODE"/> </intent-filter> </receiver>
или программно (все версии Android):
IntentFilter intentFilter = new IntentFilter("android.intent.action.AIRPLANE_MODE"); BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.d("AirplaneMode", "Service state changed"); } }; context.registerReceiver(receiver, intentFilter);
И, как описано в других решениях, вы можете опросить режим полета, когда ваш приемник был уведомлен, и выбросить свое исключение.
источник
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED);
/<action android:name="android.intent.action.AIRPLANE_MODE" />
boolean isPlaneModeOn = intent.getBooleanExtra("state", false);
Логическое значениеisPlaneModeOn
будет,true
если пользователь включил режим самолета илиfalse
если он выключенПри регистрации режима
BroadcastReceiver
полета (ответ @saxos) я думаю, что имеет смысл сразу же получить состояние настройки режима полета изIntent Extras
, чтобы избежать звонковSettings.Global
илиSettings.System
:@Override public void onReceive(Context context, Intent intent) { boolean isAirplaneModeOn = intent.getBooleanExtra("state", false); if(isAirplaneModeOn){ // handle Airplane Mode on } else { // handle Airplane Mode off } }
источник
От сюда :
public static boolean isAirplaneModeOn(Context context){ return Settings.System.getInt( context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) != 0; }
источник
Чтобы избавиться от претензии по износу (при ориентации на API17 + и не слишком заботясь об обратной совместимости), нужно сравнить с
Settings.Global.AIRPLANE_MODE_ON
:/** * @param Context context * @return boolean **/ private static boolean isAirplaneModeOn(Context context) { return Settings.System.getInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) != 0); }
при рассмотрении более низкого API:
/** * @param Context context * @return boolean **/ @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) @SuppressWarnings({ "deprecation" }) private static boolean isAirplaneModeOn(Context context) { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1){ /* API 17 and above */ return Settings.Global.getInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) != 0; } else { /* below */ return Settings.System.getInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) != 0; } }
источник
В Oreo не используйте режим полета BroadCastReceiver. это неявное намерение. он был удален. Вот текущий список исключений . в настоящее время его нет в списке, поэтому он не должен получать данные. Считайте это мертвым.
как указано выше другим пользователем, используйте следующий код:
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) @SuppressWarnings({ "deprecation" }) public static boolean isAirplaneModeOn(Context context) { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1){ /* API 17 and above */ return Settings.Global.getInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) != 0; } else { /* below */ return Settings.System.getInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) != 0; } }
источник
Статический широковещательный приемник
Код манифеста:
<receiver android:name=".airplanemodecheck" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.intent.action.AIRPLANE_MODE"></action> </intent-filter> </receiver>
Код Java: java-файл широковещательного приемника
if(Settings.System.getInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0)== 0) { Toast.makeText(context, "AIRPLANE MODE Off", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(context, "AIRPLANE MODE On", Toast.LENGTH_SHORT).show(); }
ИЛИ
Приемник динамического вещания
Код Java: файл активности java
Зарегистрируйте широковещательный приемник в открытом приложении, нет необходимости добавлять код в манифест, если вы выполняете действие только тогда, когда ваше действие открыто, например, проверьте, включен или выключен режим полета при доступе к Интернету и т.
airplanemodecheck reciver; @Override protected void onResume() { super.onResume(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); reciver = new airplanemodecheck(); registerReceiver(reciver, intentFilter); } @Override protected void onStop() { super.onStop(); unregisterReceiver(reciver); }
Код Java: java-файл широковещательного приемника
if(Settings.System.getInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0)== 0) { Toast.makeText(context, "AIRPLANE MODE Off", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(context, "AIRPLANE MODE On", Toast.LENGTH_SHORT).show(); }
источник
С уровня API - 17
/** * Gets the state of Airplane Mode. * * @param context * @return true if enabled. */ private static boolean isAirplaneModeOn(Context context) { return Settings.Global.getInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) != 0; }
источник
Я написал этот класс, который может быть полезным. Он не возвращает напрямую логическое значение, чтобы сообщить вам, включен ли режим полета или отключен, но он уведомит вас, когда режим полета изменится с одного на другой.
public abstract class AirplaneModeReceiver extends BroadcastReceiver { private Context context; /** * Initialize tihe reciever with a Context object. * @param context */ public AirplaneModeReceiver(Context context) { this.context = context; } /** * Receiver for airplane mode status updates. * * @param context * @param intent */ @Override public void onReceive(Context context, Intent intent) { if(Settings.System.getInt( context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0 ) == 0) { airplaneModeChanged(false); } else { airplaneModeChanged(true); } } /** * Used to register the airplane mode reciever. */ public void register() { IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); context.registerReceiver(this, intentFilter); } /** * Used to unregister the airplane mode reciever. */ public void unregister() { context.unregisterReceiver(this); } /** * Called when airplane mode is changed. * * @param enabled */ public abstract void airplaneModeChanged(boolean enabled); }
Применение
// Create an AirplaneModeReceiver AirplaneModeReceiver airplaneModeReceiver; @Override protected void onResume() { super.onResume(); // Initialize the AirplaneModeReceiver in your onResume function // passing it a context and overriding the callback function airplaneModeReceiver = new AirplaneModeReceiver(this) { @Override public void airplaneModeChanged(boolean enabled) { Log.i( "AirplaneModeReceiver", "Airplane mode changed to: " + ((active) ? "ACTIVE" : "NOT ACTIVE") ); } }; // Register the AirplaneModeReceiver airplaneModeReceiver.register(); } @Override protected void onStop() { super.onStop(); // Unregister the AirplaneModeReceiver if (airplaneModeReceiver != null) airplaneModeReceiver.unregister(); }
источник
Вот единственное, что у меня сработало (API 27):
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); this.registerReceiver(br, filter);
Где
br
ваш BroadcastReceiver. Я считаю, что с недавними изменениями в разрешении сейчас и то,ConnectivityManager.CONNECTIVITY_ACTION
и другоеIntent.ACTION_AIRPLANE_MODE_CHANGED
необходимы.источник
Начиная с Jelly Bean (код сборки 17), это поле перемещено в глобальные настройки. Таким образом, для достижения наилучшей совместимости и надежности мы должны позаботиться о обоих случаях. Следующий пример написан на Котлине.
fun isInAirplane(context: Context): Boolean { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { Settings.Global.getInt( context.contentResolver, Settings.Global.AIRPLANE_MODE_ON, 0 ) } else { Settings.System.getInt( context.contentResolver, Settings.System.AIRPLANE_MODE_ON, 0 ) } != 0 }
/** * @deprecated Use {@link android.provider.Settings.Global#AIRPLANE_MODE_ON} instead */ @Deprecated public static final String AIRPLANE_MODE_ON = Global.AIRPLANE_MODE_ON;
Это версия предыдущего кода в виде мармелада.
fun isInAirplane(context: Context): Boolean { return Settings.Global.getInt( context.contentResolver, Settings.Global.AIRPLANE_MODE_ON, 0 ) != 0 }
источник
Вы можете проверить, включен ли интернет
public class ConnectionDetector { private Context _context; public ConnectionDetector(Context context){ this._context = context; } public boolean isConnectingToInternet(){ ConnectivityManager connectivity = (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivity != null) { NetworkInfo[] info = connectivity.getAllNetworkInfo(); if (info != null) for (int i = 0; i < info.length; i++) if (info[i].getState() == NetworkInfo.State.CONNECTED) { return true; } } return false; }
}
источник