[java] Android에서 비행기 모드를 어떻게 감지 할 수 있습니까?

내 애플리케이션에 Wi-Fi가 활발하게 연결되어 있는지 감지하는 코드가 있습니다. 이 코드는 비행기 모드가 활성화 된 경우 RuntimeException을 트리거합니다. 어쨌든이 모드에서 별도의 오류 메시지를 표시하고 싶습니다. Android 기기가 비행기 모드인지 어떻게 안정적으로 감지 할 수 있나요?



답변

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

}


답변

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


답변

비행기 모드가 활성화되어 있는지 여부를 폴링하지 않으려면 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);

다른 솔루션에 설명 된대로 수신기가 알림을 받았을 때 비행기 모드를 폴링하고 예외를 throw 할 수 있습니다.


답변

비행기 모드를 등록 할 때 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;
        }
    }