एंड्रॉइड पर हवाई जहाज मोड का पता कैसे लगा सकता है?


92

मेरे पास मेरे आवेदन में कोड है जो पता लगाता है कि वाई-फाई सक्रिय रूप से जुड़ा हुआ है या नहीं। यदि हवाई जहाज मोड सक्षम है तो यह कोड एक RuntimeException को ट्रिगर करता है। मैं इस मोड में वैसे भी एक अलग त्रुटि संदेश प्रदर्शित करना चाहूंगा। अगर एंड्रॉइड डिवाइस हवाई जहाज मोड में है, तो मैं विश्वसनीय तरीके से कैसे पता लगा सकता हूं?


आप अपनी जाँच कैसे करते हैं, इसके आधार पर, यह जानकर अच्छा होगा कि एक ही समय में हवाई जहाज मोड और वाई-फाई दोनों सक्षम होना संभव है: 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
जेली बीन 4.2 में, यह सेटिंग चली गई है Settings.Global
क्रिस फिस्ट

1
इसने अनिश्चित परिणाम दिया जब मैंने इसे इरादे के जवाब में बुलाया android.intent.action.AIRPLANE_MODE, क्योंकि मोड परिवर्तन को पूरा होने में समय लगता है। Intent.ACTION_AIRPLANE_MODE_CHANGEDयदि आप ऐसा करना चाहते हैं तो जाँच करें ।
नौमेनन

7
बस एक संकेत:! = 0 रिटर्न गलत (हवाई जहाज मोड बंद है) और == 0 रिटर्न सही (हवाई जहाज मोड चालू है)
jfmg

क्या यह नेटवर्क डेटा के समान ही सक्षम है? यदि नहीं - क्या उपयोगकर्ता द्वारा डेटा सक्षम किया गया था, यह जानने के लिए अन्य सेटिंग्स स्थिति है?
ransh

संकलक का कहना है कि AIRPLANE_MODE_ON को पदावनत कर दिया गया है
जीन रेमंड डाहर

96

एसडीके संस्करण को शामिल करने के लिए एलेक्स के उत्तर का विस्तार करके हमारे पास:

/**
 * 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)विधि से पहले नहीं जोड़ते, तब तक ग्रहण इसका संकलन नहीं करेगा ।
नौमेनन

1
मैं इंटेलीज में यह काम नहीं कर सकता। मैं 2.2 को पूरा करता हूं, इसलिए मेरे पास minSdk = 8 है, और उसके पास एक प्रोजेक्ट एसडीके के रूप में "एंड्रॉइड 2.2" है। हालांकि, इसका मतलब है कि "Settings.Global" कोड लाल है और संकलन नहीं करेगा। मैं डॉन नहीं। ' टी परियोजना के रूप में 4.2 सेट करना चाहते हैं SDK क्योंकि मैं 2.2 में कुछ उपलब्ध नहीं होने से चूक सकता हूं ... यह मुझे पागल बना देता है, यहां सबसे अच्छा अभ्यास क्या है? कोई विचार?
मथियास

1
अपने लक्ष्य को बदलें
लुइस सीएडी

53

और यदि आप हवाई जहाज मोड सक्रिय है या नहीं, तो आप चुनाव नहीं करना चाहते हैं, तो आप SERVICE_STATE इरादे के लिए एक ब्रॉडकास्टर को पंजीकृत कर सकते हैं और उस पर प्रतिक्रिया कर सकते हैं।

या तो आपके ApplicationManifest (पूर्व-एंड्रॉइड 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 अधिसूचना प्राप्त करने से पहले हवाई जहाज मोड की स्थिति की जांच और भंडारण करना होगा, और फिर सेवा की राज्य अधिसूचना प्राप्त करते समय इसकी स्थिति की जांच करें, फिर दोनों की तुलना करें - जानने के लिए अगर हवाई जहाज मोड वास्तव में बदल गया है।
मटॉरब

11
एमपीस्टेक्स: या उपयोग: IntentFilter intentFilter = new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED);/<action android:name="android.intent.action.AIRPLANE_MODE" />
लंगोट

3
इस समाधान के लिए आपको अनुमति की आवश्यकता होगी: <उपयोग-अनुमति एंड्रॉइड: नाम = "android.permission.READ_PHONE_STATE" />
थॉमस डिगन

4
Intent.ACTION_AIRPLANE_MODE_CHANGED का उपयोग करें
Jeyanth Kumar

4
यह भी प्राप्त करने के लिए कि क्या एयर प्लेन मोड चालू या बंद है, हम प्राप्त इरादे में बूलियन अतिरिक्त मान का उपयोग कर सकते हैं। boolean isPlaneModeOn = intent.getBooleanExtra("state", false); बूलियन isPlaneModeOnहोगा trueयदि उपयोगकर्ता ने विमान मोड चालू किया है या falseयदि इसे बंद कर दिया गया है
सुदरा

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 उन डॉक्स को पढ़ने के लिए जो इस "राज्य" इरादे के बारे में अतिरिक्त बात करते हैं। मैंने परीक्षण किया और यह ठीक से काम करता है।
लुई कैड

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" नेटवर्क डेटा के समान ही सक्षम है? यदि नहीं - क्या उपयोगकर्ता द्वारा डेटा सक्षम किया गया था, यह जानने के लिए अन्य सेटिंग्स स्थिति है? -
रंसह


5

मूल्यह्रास की शिकायत से छुटकारा पाने के लिए (जब एपीआई 17 को लक्षित करना और पिछड़ी अनुकूलता के बारे में बहुत अधिक ध्यान न रखना), तो किसी से तुलना करनी होगी 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);
}

निम्न एपीआई पर विचार करते समय:

/** 
 * @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+ के लिए काम करेगा, फी
जोसेफ केसी

1
पिछड़ी हुई संगतता को जोड़ा - जबकि यह अब तक के उदाहरण के समान है।
मार्टिन ज़ेटलर

क्या "Settings.System.AIRPLANE_MODE_ON" नेटवर्क डेटा के समान ही सक्षम है? यदि नहीं - क्या उपयोगकर्ता द्वारा डेटा सक्षम किया गया था, यह जानने के लिए अन्य सेटिंग्स स्थिति है?
रंश २४'१

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

एपीआई स्तर से - 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

यहाँ केवल एक चीज है जो मेरे लिए काम करती है (एपीआई 27):

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

कहाँ brहै आपका ब्रॉडकास्टर। मेरा मानना ​​है कि अब अनुमति में हालिया बदलावों के साथ ConnectivityManager.CONNECTIVITY_ACTIONऔर दोनों की Intent.ACTION_AIRPLANE_MODE_CHANGEDजरूरत है।


0

जेली बीन (बिल्ड कोड 17) के बाद से, इस क्षेत्र को वैश्विक सेटिंग्स में ले जाया गया है। इस प्रकार, सबसे अच्छी संगतता और मजबूती हासिल करने के लिए हमें दोनों मामलों का ध्यान रखना होगा। निम्नलिखित उदाहरण कोटलिन में लिखा गया है।

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
}

नोट: यदि आप जेली बीन से पहले संस्करणों के लिए समर्थन नहीं रखते हैं, तो आप खंड को छोड़ सकते हैं।
संदर्भ के दौरान आपको जो मूल्य मिलता 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;

यह पिछले कोड का उपरोक्त जेली बीन संस्करण है।

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

}


उपरोक्त विधि के साथ समस्या यह है कि उन स्थितियों को ध्यान में नहीं रखा जाता है जहां अन्य एप्लिकेशन कनेक्टिविटी को संशोधित करते हैं। उदाहरण यदि कोई उपयोगकर्ता हवाई जहाज मोड को चालू करता है, लेकिन तब उचित विशेषाधिकार वाला एक अन्य ऐप रेडियो को सक्षम करता है। और आगे, मान लीजिए कि रेडियो चालू है, लेकिन तब कोई संबंध नहीं है ... किसी भी तरह उपरोक्त उत्तर वास्तव में हमें यह नहीं बताता है कि क्या हवाई जहाज मोड विशेष रूप से चालू या बंद है, अगर डिवाइस में कनेक्शन है। दो अलग बातें।
लॉग्रे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.