কীভাবে একজন অ্যান্ড্রয়েডে বিমান মোড সনাক্ত করতে পারে?


93

আমার অ্যাপ্লিকেশনটিতে আমার কাছে এমন কোড রয়েছে যা Wi-Fi সক্রিয়ভাবে সংযুক্ত রয়েছে কিনা তা সনাক্ত করে। বিমান কোডটি সক্ষম করা থাকলে সেই কোডটি একটি রানটাইম এক্সসেপশন ট্রিগার করে। যাইহোক এই মোডে থাকাকালীন আমি একটি পৃথক ত্রুটি বার্তা প্রদর্শন করতে চাই। কোনও অ্যান্ড্রয়েড ডিভাইস বিমান মোডে থাকলে আমি কীভাবে নির্ভরযোগ্যভাবে সনাক্ত করতে পারি?


: কিভাবে আপনি আপনার চেক করতে উপর নির্ভর করে, ভালো করে জেনে রাখুন যে এটি উভয় বিমান মোড ও Wi-Fi একই সময়ে সক্রিয় করা সম্ভব হতে heresthethingblog.com/2013/08/28/...
nibarius

উত্তর:


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
জেলি বিন ৪.২ এ, এই সেটিংটি সরানো হয়েছে Settings.Global
ক্রিস ফিস্ট

4
android.intent.action.AIRPLANE_MODEমোড পরিবর্তনটি সম্পূর্ণ হতে সময় লাগে বলে আমি যখন উদ্দেশ্যটির প্রতিক্রিয়ায় এটি বলেছিলাম তখন এটি অনির্দিষ্ট ফলাফল প্রদান করে । Intent.ACTION_AIRPLANE_MODE_CHANGEDআপনি যদি এটি করতে চান তবে তার বিরুদ্ধে পরীক্ষা করুন ।
নুমেনন

7
কেবল একটি ইঙ্গিত
:!

এটি কি নেটওয়ার্ক ডেটা সক্ষম হিসাবে একই? যদি তা না হয় - ব্যবহারকারী কি ডেটা সক্ষম করেছে কিনা তা জানতে কি অন্য সেটিংসের স্থিতি রয়েছে?
আরশ

সংকলক বলেছেন যে 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;
    }       
}

4
আপনি @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)পদ্ধতির আগে যোগ না করা হলে গ্রহণটি এটি সংকলন করবে না ।
নুমেনন

4
আমি এই কাজটি ইন্টেলিজে করতে পারি না। আমি ২.২ সরবরাহ করি, সুতরাং আমার কাছে মিনিএসডিকি = ৮ রয়েছে এবং এর জন্য একটি প্রকল্প এসডিকে হিসাবে "অ্যান্ড্রয়েড ২.২" রয়েছে। এটির অর্থ, "সেটিংস.গ্লোবাল" কোডটি লাল এবং সংকলিত হবে না I টি ৪.২ কে প্রজেক্ট এসডিকে হিসাবে সেট করতে চান না কারণ আমি সম্ভবত ২.২-তে পাওয়া যায় না এমন কিছু মিস করতে পারি ... এটি আমাকে পাগল করে তোলে, এখানে সেরা অনুশীলন কী? কোন ধারণা?
ম্যাথিয়াস

4
আপনার টার্গেট এসডিকে
লুই সিএডি

54

এবং আপনি যদি এয়ারপ্লেন মোডটি সক্রিয় রয়েছে বা না জরিপ করতে না চান তবে আপনি SERVICE_STATE ইচ্ছার জন্য একটি ব্রডকাস্টার্সিভার নিবন্ধন করতে পারেন এবং এটিতে প্রতিক্রিয়া জানাতে পারেন।

হয় আপনার অ্যাপ্লিকেশনমেনিফেস্টে (প্রাক অ্যান্ড্রয়েড 8.0):

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

বা প্রোগ্রামগতভাবে (সমস্ত অ্যান্ড্রয়েড সংস্করণ):

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

এবং অন্যান্য সমাধানগুলিতে বর্ণিত হিসাবে, আপনার রিসিভারটি অবহিত হওয়ার পরে আপনি বিমান মোডটি পোল করতে পারেন এবং আপনার ব্যতিক্রম নিক্ষেপ করতে পারেন।


4
দ্রষ্টব্য: যেহেতু অন্যান্য SERVICE_STATE বিজ্ঞপ্তি রয়েছে, আপনাকে SERVICE_STATE বিজ্ঞপ্তি পাওয়ার আগে বিমান মোডের অবস্থাটি পরীক্ষা করে সংরক্ষণ করতে হবে এবং তারপরে পরিষেবা রাষ্ট্রের বিজ্ঞপ্তি পাওয়ার সময় এর স্থিতিটি পরীক্ষা করতে হবে, তারপরে দু'টি তুলনা করুন - জানার জন্য যদি বিমান মোডটি আসলে পরিবর্তিত হয়।
ম্যাটোরব

11
mpstx: অথবা ব্যবহার: IntentFilter intentFilter = new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED);/<action android:name="android.intent.action.AIRPLANE_MODE" />
কড়া

4
এই সমাধানের জন্য আপনার অনুমতি দরকার: <ব্যবহার-অনুমতি অ্যান্ড্রয়েড: নাম = "android.permission.READ_PHONE_STATE" />
টমাস ডিগানান

4
অভিপ্রায় ব্যবহার করুন CTIONঅ্যাকশন_এআরপিএলএনএমএমডিএইচএনএইজেডি
জ্যান্ত কুমার

4
এয়ার প্লেন মোডটি চালু বা বন্ধ করা আছে কিনা তা পেতে, আমরা যে অভিপ্রায় পেয়েছি তাতে বুলিয়ান অতিরিক্ত মান ব্যবহার করতে পারি। boolean isPlaneModeOn = intent.getBooleanExtra("state", false); বুলিয়ান isPlaneModeOnহতে হবে trueতাহলে ব্যবহারকারী সমতল মোড চালু করা হয়েছে বা falseযদি এটি বন্ধ হয়ে যায়
Sudara

20

বিমান মোডটি নিবন্ধকরণ করার সময় BroadcastReceiver(@ স্যাক্সোস উত্তর) আমি মনে করি 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
    }
}

4
আসল বিমান মোডের অবস্থাটি পুনরুদ্ধার করার পক্ষে এটি সবচেয়ে কার্যকর উপায়। এটিতে ভোট পাওয়া উচিত এবং নতুন গ্রহণযোগ্য উত্তর হওয়া উচিত। দস্তাবেজগুলি পড়ার জন্য +1 যা এই "রাজ্য" এর উদ্দেশ্য সম্পর্কে অতিরিক্ত আলোচনা করে। আমি পরীক্ষা করেছি এবং এটি সঠিকভাবে কাজ করে।
লুই সিএডি

7

থেকে এখানে :

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

"সেটিংস.সিসটেম.এ.আর.পি.এল.এল.এন.এম.ডি। ও" "নেটওয়ার্ক ডেটা সক্ষম করা একই? যদি তা না হয় - ব্যবহারকারী কি ডেটা সক্ষম করেছে কিনা তা জানতে কি অন্য সেটিংসের স্থিতি রয়েছে? -
আরশ


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

4
সেটিংস.গ্লোবাল.আরপিএলএন.এম.ডি.ডন এটি কেবল এপিআই 17+, fyi
জোসেফ

4
পশ্চাদপদ সামঞ্জস্যতা যুক্ত করেছে - যদিও এটি এখন উপরের উদাহরণের মতো প্রায় একই।
মার্টিন জিটলার 14

"সেটিংস.সিসটেম.এ.আর.পি.এল.এল.এন.এম.ডি। ও" "নেটওয়ার্ক ডেটা সক্ষম করা একই? যদি তা না হয় - ব্যবহারকারী কি ডেটা সক্ষম করেছে কিনা তা জানতে কি অন্য সেটিংসের স্থিতি রয়েছে?
আরশ

2

ওরিওতে দয়া করে বিমান মোড ব্রডকাস্টরিসিভার ব্যবহার করবেন না। এটি একটি অন্তর্নিহিত উদ্দেশ্য। এটি সরানো হয়েছে। এখানে বর্তমান ব্যতিক্রম তালিকা রয়েছে । এটি বর্তমানে তালিকায় নেই তাই ডেটা পেতে ব্যর্থ হওয়া উচিত। এটি মৃত বিবেচনা করুন।

উপরে অন্য ব্যবহারকারীর দ্বারা বর্ণিত হিসাবে নিম্নলিখিত কোডটি ব্যবহার করুন:

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

বা

ডায়নামিক ব্রডকাস্ট রিসিভার

জাভা কোড: ক্রিয়াকলাপ জাভা ফাইল

অ্যাপ্লিকেশনটিতে ব্রডকাস্ট রিসিভারটি নিবন্ধভুক্ত করুন প্রকাশ্যে কোড যুক্ত করার দরকার নেই খালি আপনার ক্রিয়াকলাপ তখনই চালু হয় যখন আপনি ইন্টারনেট অ্যাক্সেস করার সময় চেক বিমান মোড চালু বা বন্ধ থাকে or

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) থেকে, এই ক্ষেত্রটি বিশ্বব্যাপী সেটিংসে স্থানান্তরিত হয়েছে। সুতরাং, সর্বোত্তম সামঞ্জস্যতা এবং দৃust়তা অর্জন করতে আমাদের উভয় ক্ষেত্রেই যত্ন নিতে হবে। নিম্নলিখিত উদাহরণটি কোটলিনে লেখা আছে।

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

}


উপরোক্ত পদ্ধতির সমস্যাটি হ'ল অন্যান্য অ্যাপ্লিকেশন সংযোগটি পরিবর্তন করে এমন পরিস্থিতিতে বিবেচনা করে না। উদাহরণস্বরূপ যদি কোনও ব্যবহারকারী বিমান বিমান মোড চালু করে তবে সঠিক সুযোগ সুবিধা সহ অন্য একটি অ্যাপ্লিকেশন একটি রেডিও সক্ষম করে। এবং আরও, ধরুন রেডিও চালু আছে তবে তারপরে কোনও সংযোগ নেই ... উপরের উত্তরটি সত্যিই আমাদের জানায় না যে বিশেষত বিমান মোডটি চালু আছে বা বন্ধ রয়েছে, কেবল যদি ডিভাইসটির কোনও সংযোগ থাকে। দুটি ভিন্ন জিনিস।
লগ্রে করুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.