96

アプリケーションに、Wi-Fi がアクティブに接続されているかどうかを検出するコードがあります。機内モードが有効になっている場合、そのコードは RuntimeException をトリガーします。とにかくこのモードでは別のエラーメッセージを表示したいと思います。Android デバイスが機内モードになっているかどうかを確実に検出するにはどうすればよいですか?

4

13 に答える 13

145
/**
* 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;

}
于 2010-11-30T22:16:55.760 に答える
98

SDK のバージョン チェックを含めるように Alex の回答を拡張すると、次のようになります。

/**
 * 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;
    }       
}
于 2013-06-11T17:02:51.313 に答える
55

また、機内モードがアクティブかどうかをポーリングしたくない場合は、SERVICE_STATE インテントの BroadcastReceiver を登録して、それに反応することができます。

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

また、他のソリューションで説明されているように、受信者に通知されたときに機内モードをポーリングして、例外をスローできます。

于 2010-11-30T22:24:51.673 に答える
7

ここから:

 public static boolean isAirplaneModeOn(Context context){
   return Settings.System.getInt(
               context.getContentResolver(),
               Settings.System.AIRPLANE_MODE_ON, 
               0) != 0;
 }
于 2010-11-30T22:18:51.250 に答える
3

Oreo では、機内モードのブロードキャストレシーバーを使用しないでください。それは暗黙の意図です。それは削除されました。これが現在の例外リストです。現在リストにないため、データの受信に失敗するはずです。死んでいると考えてください。

上記の別のユーザーが述べたように、次のコードを使用します。

 @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;
        }
    }
于 2017-11-29T11:34:24.460 に答える