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


92

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


:あなたはあなたのチェックを行う方法に応じて、それの良いが、それは両方の機内モードを持つことが可能だとのWi-Fiを同時に有効にすることを意識するようにheresthethingblog.com/2013/08/28/...
nibarius

回答:


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

}

33
Jelly Bean 4.2では、この設定はに移動しましたSettings.Global
Chris Feist

1
android.intent.action.AIRPLANE_MODEモードの変更が完了するまでに時間がかかるため、これがintentに応じて呼び出したときに不確定な結果をもたらしました。チェックするIntent.ACTION_AIRPLANE_MODE_CHANGEDそれを行うかどうかをてください。
Noumenon 2013年

7
ヒント:!= 0はfalse(飛行機モードがオフ)を返し、== 0はtrue(飛行機モードがオン)を返します
jfmg

有効になっているネットワークデータと同じですか?そうでない場合-データがユーザーによって有効にされたかどうかを知るために他の設定ステータスがありますか?
荒っぽい

コンパイラはAIRPLANE_MODE_ONは非推奨であると言っています
Jean Raymond Daher

96

アレックスの回答を拡張して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;
    }       
}

5
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)メソッドの前に追加しない限り、Eclipseはこれをコンパイルしません。
Noumenon 2013年

1
Intellijではこれを機能させることができません。私は2.2に対応しているので、minSdk = 8を持っているので、「Android 2.2」をプロジェクトSDKとして持っています」これは、「Settings.Global」コードが赤でコンパイルされないことを意味します。 T iは2.2で使用できない何かを逃す可能性があるため、プロジェクトのSDKとして4.2を設定したい...このドライブは私クレイジー、任意のアイデアここでのベストプラクティスは何ですか??
マティアス・

1
targetSDKを変更する
ルイCAD

53

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

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


2
注:他のSERVICE_STATE通知があるため、SERVICE_STATE通知を受信する前に機内モードの状態を確認して保存し、サービス状態通知を受信したときにその状態を確認してから、2つを比較してください。機内モードが実際に変更された場合。
mattorb 2011年

11
mpstx:または使用:IntentFilter intentFilter = new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED);/<action android:name="android.intent.action.AIRPLANE_MODE" />
ナッピー

3
このソリューションでは、次の権限が必要です。<uses-permission android:name = "android.permission.READ_PHONE_STATE" />
Thomas Dignan

4
Intent.ACTION_AIRPLANE_MODE_CHANGEDを​​使用
Jeyanth Kumar

4
また、飛行機モードがオンまたはオフになっているかどうかを確認するために、受け取ったインテントでブール値の追加値を使用できます。boolean isPlaneModeOn = intent.getBooleanExtra("state", false); ブール値isPlaneModeOntrue、ユーザーが飛行機モードをオンにした場合、またはfalseオフにした場合
Sudara

20

機内モードBroadcastReceiver(@saxos回答)を登録するとき、やIntent Extrasを呼び出さないようにするために、からすぐに機内モード設定の状態を取得することは非常に理にかなっていると思います。Settings.GlobalSettings.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
    }
}

3
これは、実際の機内モードの状態を取得する最も効率的な方法です。これは投票を獲得し、新しい承認された答えになるはずです。+1は、この「状態」の意図に関するエクストラについて説明しているドキュメントを読むためのものです。私はテストし、それは正しく動作します。
Louis CAD

7

ここから:

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

「Settings.System.AIRPLANE_MODE_ON」は有効になっているネットワークデータと同じですか?そうでない場合-データがユーザーによって有効にされたかどうかを知るために他の設定ステータスがありますか?–
2017年


5

減価償却の不満を取り除くために(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;
    }
}

1
Settings.Global.AIRPLANE_MODE_ONこれはAPI 17 +、fyiでのみ機能します
Joseph Casey

1
下位互換性が追加されました-上の例とほとんど同じですが。
Martin Zeitler、2015

「Settings.System.AIRPLANE_MODE_ON」は有効になっているネットワークデータと同じですか?そうでない場合-データがユーザーによって有効にされたかどうかを知るために他の設定ステータスがありますか?
2017年

2

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

1

静的ブロードキャストレシーバー

マニフェストコード:

<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ファイル

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コード:Broadcast Receiver 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();
}

1

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;

    }

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

0

これが私のために働いた唯一のものです(API 27):

IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
this.registerReceiver(br, filter);

brBroadcastReceiverはどこにありますか。私は今の許可の最近の変化との両方のことを信じているConnectivityManager.CONNECTIVITY_ACTIONし、Intent.ACTION_AIRPLANE_MODE_CHANGED必要とされています。


0

Jelly Bean(ビルドコード17)以降、このフィールドはグローバル設定に移動されました。したがって、最高の互換性と堅牢性を実現するには、両方のケースに対応する必要があります。次の例はKotlinで記述されています。

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
}

注:Jelly Beanより前のバージョンのサポートを維持しない場合は、if節を省略できます。
を参照しているときに得られる値Settings.System.AIRPLANE_MODE_ONは、[グローバル]の下にある値と同じです。*

    /**
     * @deprecated Use {@link android.provider.Settings.Global#AIRPLANE_MODE_ON} instead
     */
    @Deprecated
    public static final String AIRPLANE_MODE_ON = Global.AIRPLANE_MODE_ON;

これは、前のコードのjelly beanバージョンです。

fun isInAirplane(context: Context): Boolean {
    return Settings.Global.getInt(
        context.contentResolver, Settings.Global.AIRPLANE_MODE_ON, 0
    ) != 0
}

-4

インターネットがオンになっているかどうかを確認できます

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

}


上記の方法の問題は、他のアプリが接続を変更する状況を考慮していないことです。ユーザーが機内モードをオンにしたが、適切な権限を持つ別のアプリがラジオを有効にした場合の例。さらに、無線はオンになっているのに接続がないとしましょう...とにかく、上記の回答では、機内モードがオンかオフかはわかりません。デバイスに接続がある場合のみです。2つの異なるもの。
ログレイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.