web-dev-qa-db-ja.com

Androidで機内モードを検出するにはどうすればよいですか?

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

87
Sean W.
/**
* 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;

}
127
Alex Volovoy

Alexの答えを拡張して、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;
    }       
}
92
Tiago

また、機内モードがアクティブかどうかをポーリングしたくない場合は、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);

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

49
saxos

飛行機モードBroadcastReceiver(@saxos answer)を登録するとき、飛行機モード設定の状態を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
    }
}
18
eldjon

ここ から:

 public static boolean isAirplaneModeOn(Context context){
   return Settings.System.getInt(
               context.getContentResolver(),
               Settings.System.AIRPLANE_MODE_ON, 
               0) != 0;
 }
7
Preet Sangha

減価償却の苦情を取り除くために(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;
    }
}
4
Martin Zeitler

オレオでは、機内モード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;
        }
    }
2
j2emanue

静的放送受信機

マニフェストコード:

<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コード:Broadcast Receiver Java file

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

OR

ダイナミックブロードキャストレシーバー

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コード:Broadcast Receiver Java file

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;

    }
1
Vineesh TP

これが私のために働いた唯一のことです(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が必要です。

0
Gus

役に立つかもしれないこのクラスを書きました。飛行機モードが有効か無効かを示すブール値を直接返すことはありませんが、飛行機モードが一方から他方に変更されると通知します。

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();
}
0
Nathan F.