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 2012

1
android.intent.action.AIRPLANE_MODE모드 변경이 완료되는 데 시간이 걸리기 때문에 인 텐트에 대한 응답으로 호출했을 때 불확실한 결과를 제공했습니다 . Intent.ACTION_AIRPLANE_MODE_CHANGED그렇게 하려는지 확인하십시오 .
Noumenon

7
힌트 :! = 0은 false (비행기 모드가 꺼져 있음)를 반환하고 == 0은 true (비행기 모드가 켜져 있음)를 반환합니다
jfmg

활성화 된 네트워크 데이터와 동일합니까? 그렇지 않은 경우-사용자가 데이터를 활성화했는지 알 수있는 다른 설정 상태가 있습니까?
ransh

컴파일러는 AIRPLANE_MODE_ON가되지 않습니다 말한다
진 레이몬드 Daher를

96

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

5
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)메소드 앞에 추가하지 않는 한 Eclipse는 이것을 컴파일하지 않습니다 .
Noumenon 2013 년

1
Intellij에서이 작업을 수행 할 수 없습니다. 저는 2.2를 지원하므로 minSdk = 8이 있고 그에 따라 "Android 2.2"가 프로젝트 SDK "입니다. 그러나 이것은"Settings.Global "코드가 빨간색이고 컴파일되지 않음을 의미합니다. ? 내가 나를 미치게 ... 2.2이 드라이브를 사용할 수없는 무언가를 놓칠 수 있으므로 t는, 무슨 일이 가장 좋은 방법은 여기에 어떤 생각이 프로젝트 SDK 4.2을 설정할
마티아스

1
targetSDK 변경
Louis CAD

54

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


2
참고 : 다른 SERVICE_STATE 알림이 있으므로 SERVICE_STATE 알림을 수신하기 전에 비행기 모드의 상태를 확인하고 저장해야합니다. 그런 다음 서비스 상태 알림을받을 때 상태를 확인한 다음 두 가지를 비교해야합니다. 비행기 모드가 실제로 변경된 경우.
mattorb 2011 년

11
mpstx : 또는 사용 : IntentFilter intentFilter = new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED);/<action android:name="android.intent.action.AIRPLANE_MODE" />
Nappy

3
이 솔루션의 경우 다음 권한이 필요합니다. <uses-permission android : name = "android.permission.READ_PHONE_STATE"/>
Thomas Dignan

4
사용 Intent.ACTION_AIRPLANE_MODE_CHANGED
Jeyanth 쿠마

4
또한 비행기 모드가 켜져 있는지 꺼져 있는지 확인하기 위해 수신 한 인 텐트에 부울 추가 값을 사용할 수 있습니다. boolean isPlaneModeOn = intent.getBooleanExtra("state", false); 부울이 isPlaneModeOn될 것입니다 true사용자가 비행기 모드에 설정되어있는 경우 또는 false이 꺼져있는 경우
Sudara

20

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

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"이 네트워크 데이터 활성화와 동일합니까? 그렇지 않은 경우-사용자가 데이터를 활성화했는지 알 수있는 다른 설정 상태가 있습니까? –
ransh


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만을 참고로, 17 세 이상 API에 대한 작동합니다
조셉 케이시에게

1
이전 버전과의 호환성 추가-지금 위의 예와 거의 동일합니다.
Martin Zeitler 2015

"Settings.System.AIRPLANE_MODE_ON"이 네트워크 데이터 활성화와 동일합니까? 그렇지 않은 경우-사용자가 데이터를 활성화했는지 알 수있는 다른 설정 상태가 있습니까?
ransh

2

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

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>

자바 코드 : 브로드 캐스트 수신기 자바 파일

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

또는

동적 방송 수신기

자바 코드 : 활동 자바 파일

인터넷에 액세스 할 때 비행기 모드가 켜져 있거나 꺼져있을 때와 같은 활동이 열려있을 때만 조치를 취하면 애플리케이션 열기에 브로드 캐스트 수신기를 등록 할 필요가 없습니다.

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

자바 코드 : 브로드 캐스트 수신기 자바 파일

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_ONGlobal에서 찾은 값 과 동일합니다. *

    /**
     * @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
}

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

}


위 방법의 문제점은 다른 앱이 연결을 수정하는 상황을 고려하지 않는다는 것입니다. 사용자가 비행기 모드를 켰지 만 적절한 권한이있는 다른 앱이 라디오를 활성화하는 경우의 예입니다. 또한 라디오가 켜져 있지만 연결이 없다고 가정하겠습니다. 어쨌든 위의 대답은 장치가 연결되어있는 경우 비행기 모드가 특별히 켜져 있는지 여부를 알려주지 않습니다. 두 가지가 있습니다.
logray
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.