Android'de uçak modu nasıl tespit edilebilir?


93

Uygulamamda, Wi-Fi'nin aktif olarak bağlı olup olmadığını algılayan bir kod var. Bu kod, uçak modu etkinleştirilirse bir RuntimeException tetikler. Yine de bu moddayken ayrı bir hata mesajı görüntülemek istiyorum. Bir Android cihazının uçak modunda olup olmadığını nasıl güvenilir bir şekilde tespit edebilirim?


Kontrollerinizi nasıl yaptığınıza bağlı olarak, aynı anda hem uçak modu hem de Wi-Fi'yi etkinleştirmenin mümkün olduğunu bilmekte
fayda var

Yanıtlar:


138
/**
* 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'de bu ayar olarak değiştirildi Settings.Global.
Chris Feist

1
android.intent.action.AIRPLANE_MODEMod değişikliğinin tamamlanması zaman aldığı için, niyete yanıt olarak çağırdığımda bu belirsiz sonuçlar verdi. Intent.ACTION_AIRPLANE_MODE_CHANGEDBunu yapmak istiyorsan karşı kontrol et.
Noumenon

7
Sadece bir ipucu
:!

etkinleştirilen ağ verileriyle aynı mı? Değilse - verilerin kullanıcı tarafından etkinleştirilip etkinleştirilmediğini bilmek için başka ayar durumu var mı?
57'de ara

derleyici AIRPLANE_MODE_ON'un kullanımdan kaldırıldığını söylüyor
Jean Raymond Daher

96

Alex'in yanıtını SDK sürüm kontrolünü içerecek şekilde genişleterek elimizde:

/**
 * 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)Yöntemden önce eklemediğiniz sürece Eclipse bunu derlemez .
Noumenon

1
Bunu Intellij'de yapamıyorum. 2.2'ye hitap ediyorum, bu yüzden minSdk = 8'im var ve bu nedenle Project SDK olarak "Android 2.2" var. Ancak bu, "Settings.Global" kodunun kırmızı olduğu ve derlenmeyeceği anlamına geliyor. ?? i beni deli ... 2.2 bu sürücüler şey mevcut değildir kaçırabilir beri t ne iyi uygulama buraya Herhangi bir fikir proje SDK olarak 4.2 ayarlamak istediğiniz
Mathias

1
Hedefinizi değiştirinSDK
Louis CAD

54

Uçak Modunun etkin olup olmadığını sorgulamak istemiyorsanız, SERVICE_STATE Niyeti için bir BroadcastReceiver kaydedebilir ve buna tepki verebilirsiniz.

Ya ApplicationManifest'inizde (Android 8.0 öncesi):

<receiver android:enabled="true" android:name=".ConnectivityReceiver">
    <intent-filter>
        <action android:name="android.intent.action.AIRPLANE_MODE"/>
    </intent-filter>
</receiver>

veya programlı olarak (tüm Android sürümleri):

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

Ve diğer çözümlerde açıklandığı gibi, alıcınız bilgilendirildiğinde uçak modunu yoklayabilir ve istisnanızı atabilirsiniz.


2
not: başka SERVICE_STATE bildirimleri olduğundan, SERVICE_STATE bildirimini almadan önce uçak modunun durumunu kontrol etmeniz ve kaydetmeniz, ardından hizmet durumu bildirimini alırken durumunu kontrol etmeniz ve ardından ikisini karşılaştırmanız gerekir - bilinmesi uçak modu gerçekten değiştiyse.
mattorb

11
mpstx: veya şunu kullanın: IntentFilter intentFilter = new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED);/<action android:name="android.intent.action.AIRPLANE_MODE" />
Nappy

3
Bu çözüm için izne ihtiyacınız olacak: <uses-
allow

4
Amacı Kullanın.ACTION_AIRPLANE_MODE_CHANGED
Jeyanth Kumar

4
Ayrıca uçak modunun açılıp kapatılmadığını anlamak için, aldığımız niyetteki boolean ekstra değerini kullanabiliriz. boolean isPlaneModeOn = intent.getBooleanExtra("state", false); Boole isPlaneModeOnolacak truekullanıcı düzlemi moduna açtıysa ya falseda kapalıysa
Sudara

20

Uçak Modu kaydettirirken BroadcastReceiver(cevap @saxos) Ben Uçak Modu hemen ayarını durumunu almak için mantıklı bir çok yapar düşünmek Intent Extrasarama önlemek amacıyla Settings.Globalya 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
Bu, gerçek uçak modu durumunu almanın en verimli yoludur. Bu oy almalı ve yeni kabul edilen cevap olmalıdır. Bu "durum" amacından bahseden dokümanları okumak için +1 fazladan. Test ettim ve düzgün çalışıyor.
Louis CAD

7

Gönderen burada :

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

"Settings.System.AIRPLANE_MODE_ON", ağ verilerinin etkinleştirilmesiyle aynı mı? Değilse - verilerin kullanıcı tarafından etkinleştirilip etkinleştirilmediğini bilmek için başka ayar durumu var mı? -
57'de ransh


5

Amortisman şikayetinden kurtulmak için (API17 + hedeflenirken ve geriye dönük uyumluluk hakkında çok fazla umursamazken) aşağıdakilerle karşılaştırılmalıdır 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);
}

daha düşük API düşünüldüğünde:

/** 
 * @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 Bu yalnızca API 17+ için çalışacaktır, fyi
Joseph Casey

1
geriye dönük uyumluluk eklendi - şimdi yukarıdaki örnekle hemen hemen aynı.
Martin Zeitler

"Settings.System.AIRPLANE_MODE_ON", ağ verilerinin etkinleştirilmesiyle aynı mı? Değilse - verilerin kullanıcı tarafından etkinleştirilip etkinleştirilmediğini bilmek için başka ayar durumu var mı?
58'de ransh

2

Oreo'da lütfen broadCastReceiver uçak modunu kullanmayın. bu örtük bir niyettir. kaldırıldı. İşte mevcut istisnalar listesi . şu anda listede bulunmadığından veri alamaması gerekir. Ölü say.

yukarıda başka bir kullanıcı tarafından belirtildiği gibi aşağıdaki kodu kullanın:

 @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

Statik Yayın Alıcısı

Manifest kodu:

<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 kodu: Yayın Alıcısı java dosyası

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

VEYA

Dinamik Yayın Alıcısı

Java kodu: Etkinlik java dosyası

Yayın alıcısını uygulama açık olarak kaydedin, yalnızca etkinliğiniz kontrol uçağı modu gibi açıkken internete eriştiğinizde açık veya kapalı olduğunda bir işlem yaparsanız manifestte kod eklemenize gerek yoktur.

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 kodu: Yayın Alıcısı java dosyası

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 Seviyesinden - 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

Yardımcı olabilecek bu dersi yazdım. Uçak Modunun etkin mi yoksa devre dışı mı olduğunu size bildirmek için doğrudan bir boole döndürmez, ancak Uçak Modu birinden diğerine değiştirildiğinde sizi bilgilendirir.

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

}

Kullanım

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

İşte benim için işe yarayan tek şey (API 27):

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

brBroadcastReceiver'ınız nerede . İnanıyorum ki son zamanlarda yapılan izin değişiklikleri ile artık hem ConnectivityManager.CONNECTIVITY_ACTIONve hem Intent.ACTION_AIRPLANE_MODE_CHANGEDde gerekli.


0

Jelly Bean'den (Derleme Kodu 17) bu yana, bu alan Global ayarlara taşınmıştır. Bu nedenle, en iyi uyumluluğu ve sağlamlığı elde etmek için her iki durumu da dikkate almalıyız. Aşağıdaki örnek Kotlin'de yazılmıştır.

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
}

Not: Jelly Bean'den önceki sürümler için desteği sürdürmüyorsanız, if cümlesini atlayabilirsiniz.
Referans verirken aldığınız değer, Settings.System.AIRPLANE_MODE_ONGlobal altında bulduğunuzla aynıdır. *

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

Bu, önceki kodun yukarıdaki jöle fasulyesi versiyonudur.

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

-4

İnternetin açık olup olmadığını kontrol edebilirsiniz

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

}


Yukarıdaki yöntemle ilgili sorun, diğer uygulamaların bağlantıyı değiştirdiği durumları hesaba katmamasıdır. Örneğin, bir kullanıcının uçak modunu açması, ancak daha sonra uygun ayrıcalıklara sahip başka bir uygulamanın bir telsizi etkinleştirmesi. Ve dahası, telsizin açık olduğunu varsayalım, ancak o zaman bağlantı yok ... her neyse, yukarıdaki cevap, sadece cihazın bir bağlantısı varsa, uçak modunun özel olarak açık mı yoksa kapalı mı olduğunu gerçekten bize söylemiyor. İki farklı şey.
logray
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.