অ্যান্ড্রয়েডে কখন ওয়াইফাই সংযোগ প্রতিষ্ঠিত হবে তা কীভাবে সনাক্ত করবেন?


140

আমার কখন ওয়াইফাইয়ের সাথে নেটওয়ার্ক সংযোগ আছে তা সনাক্ত করতে হবে। বৈধ নেটওয়ার্ক সংযোগ তৈরি হয়েছে তা প্রতিষ্ঠিত করতে কী সম্প্রচার পাঠানো হয়। HTTP- র জন্য একটি বৈধ নেটওয়ার্ক সংযোগ বিদ্যমান তা আমাকে যাচাই করতে হবে। বৈধ সংযোগ বিদ্যমান কিনা তা জানতে আমার কী শুনতে হবে এবং কী অতিরিক্ত পরীক্ষাগুলি করা দরকার।



1
তবে এখনও এই শর্তগুলি পরীক্ষা করতে WHEN এর প্রশ্ন রয়েছে?
অ্যান্ড্রয়েডার

1
আমি যদি এখানে সম্প্রচারগুলি ঘটে যা কোনও সম্প্রচার গ্রহণকারী দ্বারা ধরা পড়তে পারে সে সম্পর্কে প্রতিক্রিয়া জানাতে চাই?
অ্যান্ড্রয়েডারে

1
Android.net.wifi.STATE_CHANGE এর মতো অন্তর্নিহিত ব্রডকাস্ট রিসিভার হিসাবে অ্যান্ড্রয়েড ওয়ে আমি কীভাবে এটি করতে পারি তা আর ম্যানিফেস্টে নিবন্ধভুক্ত হতে দেওয়া হবে না (দেখুন ডেভেলপার.অ্যান্ড্রয়েড . com/guide/compferences/… )। যদি আমরা এটিকে অ্যাপ্লিকেশন ক্রিয়াকলাপে (অনক্রিটে বলুন) নিবন্ধভুক্ত করি, তবে এটি অনস্টপ () এ নিবন্ধভুক্ত হতে হবে এবং আমরা আর ওয়াইফাই সম্পর্কিত ইভেন্টগুলি গ্রহণ করব না
জাফর142003

উত্তর:


126

আপনি BroadcastReceiverযখন ওয়াইফাই সংযোগ স্থাপন করা হবে (বা সংযোগটি পরিবর্তিত হয়েছে) তখন আপনাকে অবহিত করার জন্য একটি রেজিস্ট্রেশন করতে পারেন ।

নিবন্ধন করুন BroadcastReceiver:

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
registerReceiver(broadcastReceiver, intentFilter);

এবং তারপরে আপনার BroadcastReceiverএইরকম কিছু করুন:

@Override
public void onReceive(Context context, Intent intent) {
    final String action = intent.getAction();
    if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) {
        if (intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false)) {
            //do stuff
        } else {
            // wifi connection was lost
        }
    }
}

আরও তথ্যের জন্য, BroadcastReceiverএবং এর জন্য ডকুমেন্টেশন দেখুনWifiManager

অবশ্যই আপনার ডিভাইসটি এর আগে ওয়াইফাইয়ের সাথে সংযুক্ত আছে কিনা তা যাচাই করা উচিত।

সম্পাদনা: নিষেধাজ্ঞাগুলি-বিজ্ঞানের জন্য ধন্যবাদ, ডিভাইসটি ইতিমধ্যে সংযুক্ত কিনা তা যাচাই করার জন্য এখানে একটি পদ্ধতি রয়েছে:

private boolean isConnectedViaWifi() {
     ConnectivityManager connectivityManager = (ConnectivityManager) appObj.getSystemService(Context.CONNECTIVITY_SERVICE);
     NetworkInfo mWifi = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);     
     return mWifi.isConnected();
}

1
SUPPLICANT_CONECTION_CHANGE_ACTION কেন? আমি ভেবেছিলাম এটি কেবলমাত্র সংযোগের পরিবর্তন সম্প্রচার করে। কেনো সুপারিপ্যান্ট ??? ধন্যবাদ
অ্যান্ড্রয়েডার 5:51

2
তাই না? আমি কানেকশন_চেঞ্জ নামে একটি অ্যাকশন দেখছি না ...? আমি কেবলমাত্র ওয়াইফাই রাষ্ট্রের পরিবর্তিত দেখতে পাচ্ছি কিন্তু সেই ক্রিয়াটি কেবলমাত্র ওয়াইফাই সক্ষম হয়েছে কিনা তা নির্দেশ করে (বা en- / অক্ষম করা হচ্ছে) এটি সংযুক্ত কিনা ... অনুরোধ_ সংযোগ_চঞ্চল_অ্যাকশন আপনার যা প্রয়োজন তা করছে না?
জেএমএম

9
আমার জন্য WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION কোনও ওয়াইফাই স্টেশনের সংযোগ স্থাপন / হারিয়ে গেলে সেই ক্ষেত্রে কাজ করে না। তবে WifiManager.NETWORK_STATE_CHANGED_ACTION কাজ করে।
ইয়ার

1
"android.net.wifi.STATE_CHANGE" আমার পক্ষে কাজ করেছে। আমার উত্তরটি নীচে দেখুন
এম উসমান খান

1
"অবশ্যই আপনার ডিভাইসটি এর আগে ওয়াইফাইয়ের সাথে সংযুক্ত আছে কিনা তা যাচাই করা উচিত।" - সুতরাং, প্রাথমিক ওয়াই-ফাই রাষ্ট্র পেতে, আপনি এই পদ্ধতিটি ব্যবহার করতে পারেন ...private boolean isConnectedViaWifi() { ConnectivityManager connectivityManager = (ConnectivityManager) appObj.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo mWifi = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); return mWifi.isConnected(); }
নিষিদ্ধ-জিওঞ্জিনিয়ারিং

106

আমার পক্ষে সবচেয়ে ভাল কাজ করেছে:

AndroidManifest

<receiver android:name="com.AEDesign.communication.WifiReceiver" >
   <intent-filter android:priority="100">
      <action android:name="android.net.wifi.STATE_CHANGE" />
   </intent-filter>
</receiver>

ব্রডকাস্টরিসিভার ক্লাস

public class WifiReceiver extends BroadcastReceiver {

   @Override
   public void onReceive(Context context, Intent intent) {

      NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
      if(info != null && info.isConnected()) {
        // Do your work. 

        // e.g. To check the Network Name or other info:
        WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        String ssid = wifiInfo.getSSID();
      }
   }
}

অনুমতিসমূহ

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

1
আমি মনে করি এটি বিশেষত ওয়াইফাই রাষ্ট্রের জন্য সবচেয়ে ভাল উত্তর। ধন্যবাদ
মাইকেল

4
ভবিষ্যতের সহজ রেফারেন্সের জন্য, সেই হার্ডকোডযুক্ত ক্রিয়াটি হল WifiManager.NETWORK_STATE_CHANGED_ACTION
অন্যাসেজ করুন

3
যদি (তথ্য! = নাল && তথ্য.আইস সংযুক্ত ()) = কোনও স্প্যাগেটি নেই।
gswierczynski

1
মূল ক্রিয়াকলাপে সম্প্রচার পাঠানোর জন্য আমাদের কি কোনও কোড লিখতে হবে ??
নিসারি বালাকৃষ্ণন

1
Android.net.wifi.STATE_CHANGE এর মতো অন্তর্নিহিত ব্রডকাস্ট রিসিভার হিসাবে অ্যান্ড্রয়েড ওয়ে আমি কীভাবে এটি করতে পারি তা আর ম্যানিফেস্টে নিবন্ধভুক্ত হতে দেওয়া হবে না (দেখুন ডেভেলপার.অ্যান্ড্রয়েড . com/guide/compferences/… )। যদি আমরা এটিকে অ্যাপ্লিকেশন ক্রিয়াকলাপে (অনক্রিটে বলুন) নিবন্ধভুক্ত করি, তবে এটি অনস্টপ () এ নিবন্ধভুক্ত হতে হবে এবং আমরা আর ওয়াইফাই সম্পর্কিত ইভেন্টগুলি গ্রহণ করব না।
জাফর142003

18

আমার জন্য শুধুমাত্র WifiManager.NETWORK_STATE_CHANGED_ACTIONকাজ করে।

একটি সম্প্রচার গ্রহণকারী নিবন্ধ করুন:

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
registerReceiver(broadcastReceiver, intentFilter);

এবং গ্রহণ:

@Override
public void onReceive(Context context, Intent intent) {

    final String action = intent.getAction();

    if(action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)){
        NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
        boolean connected = info.isConnected();

        //call your method
    }      
}

1
আমার জন্য পাশাপাশি কেবলমাত্র WifiManager.NETWORK_STATE_CHANGED_ACTION কাজ করেছে, কেবল কারণ এটি কেন কাজ করবে তার কোনও ব্যাখ্যা?
বেঞ্চুক

11

ব্যবহারকারী @JPM এবং @usman দ্বারা প্রদত্ত উত্তরগুলি সত্যই খুব দরকারী। এটি দুর্দান্ত কাজ করে তবে আমার ক্ষেত্রে এটি আমার ক্ষেত্রে onReceiveএকাধিকবার 4 বার আসে তাই আমার কোডটি একাধিকবার কার্যকর করে।

আমি আমার প্রয়োজনীয়তা অনুসারে কিছু সংশোধন করি এবং তৈরি করি এবং এখন এটি কেবল 1 বার আসে

ব্রডকাস্টের জন্য জাভা ক্লাস এখানে।

public class WifiReceiver extends BroadcastReceiver {

String TAG = getClass().getSimpleName();
private Context mContext;

@Override
public void onReceive(Context context, Intent intent) {

    mContext = context;


    if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {

        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = cm.getActiveNetworkInfo();

        if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI &&
                networkInfo.isConnected()) {
            // Wifi is connected
            WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
            WifiInfo wifiInfo = wifiManager.getConnectionInfo();
            String ssid = wifiInfo.getSSID();

            Log.e(TAG, " -- Wifi connected --- " + " SSID " + ssid );

        }
    }
    else if (intent.getAction().equalsIgnoreCase(WifiManager.WIFI_STATE_CHANGED_ACTION))
    {
        int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN);
        if (wifiState == WifiManager.WIFI_STATE_DISABLED)
        {
            Log.e(TAG, " ----- Wifi  Disconnected ----- ");
        }

    }
}
}

অ্যান্ড্রয়েড ম্যানিফেস্টে

<receiver android:name=".util.WifiReceiver" android:enabled="true">
        <intent-filter>
            <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
        </intent-filter>
    </receiver>


<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

1
ওয়াইফাইস্টেট কী?
23

1
ওয়াইফাইস্টেট কী, এটি কীভাবে উত্পন্ন হয়েছিল তাও জানতে চাইবেন
ইভান পার্সনস

1
@ বিহেলিট এখন সম্পাদিত উত্তরে আছে "ওয়াইফাইস্টেট"।
যোগ গুরু

8

আপনি যদি প্রত্যেকবার জিজ্ঞাসার স্বাভাবিক আচরণকে ওভাররাইড করার জন্য ব্যবহারকারীকে কোনও পছন্দ দেন তবে আপনি একটি ওয়াইফাই সংযোগ শুরু করতে পারেন

আমি তিনটি পদ্ধতি ব্যবহার করা পছন্দ করি ...

public boolean isOnline() 
{
 ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
 NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
 return (networkInfo != null && networkInfo.isConnected());
}  

ওয়াইফাই বা সেলডেটা কোনও ইন্টারনেট সংযোগ আছে কিনা তা এই দ্রুত পরীক্ষা করে দেখুন। আপনি কী পদক্ষেপ নিতে চান তা এখান থেকে চয়ন করতে পারেন। এটি কি এয়ারপ্লেন মোডে রয়েছে তাও পরীক্ষা করা দরকার।

আলাদা থ্রেডে। আমি একটি পরিবর্তনশীল IpAddress সেট করে = "" এবং আমার বৈধ আইপি ঠিকানা না পাওয়া পর্যন্ত পোল করে।

  WifiManager wifi;
  wifi = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
  WifiInfo wifiInfo = wifi.getConnectionInfo();
  int ipAddress = wifiInfo.getIpAddress();
  String ip = null;
  ip = String.format("%d.%d.%d.%d",
  (ipAddress & 0xff),
  (ipAddress >> 8 & 0xff),
  (ipAddress >> 16 & 0xff),
  (ipAddress >> 24 & 0xff));
  Log.e(" >>IP number Begin ",ip);

অন্য কোড স্নিপেট ... এটি চালু না হলে এটি চালু করা (ব্যবহারকারীদের পূর্ব অনুমতি সহ)

   if(wifi.isWifiEnabled()!=true)wifi.setWifiEnabled(true);  

7

ওয়াইফাই সংযোগের অবস্থা সনাক্ত করতে, আমি সংযোগ ব্যবস্থাপনার শ্রেণি থেকে CONNECTIVITY_ACTION ব্যবহার করেছি তাই:

    IntentFilter filter=new IntentFilter();
    filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
    registerReceiver(receiver, filter);

এবং আপনার ব্রডকাস্টআরসিভার থেকে:

    if (ConnectivityManager.CONNECTIVITY_ACTION.equals(action)) {
        int networkType = intent.getIntExtra(
                android.net.ConnectivityManager.EXTRA_NETWORK_TYPE, -1);
        if (ConnectivityManager.TYPE_WIFI == networkType) {
            NetworkInfo networkInfo = (NetworkInfo) intent
                    .getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
            if (networkInfo != null) {
                if (networkInfo.isConnected()) {

                    // TODO: wifi is connected
                } else {
                    // TODO: wifi is not connected
                }
            }
        }

    }

PS: আমার জন্য কাজ করে :)


1
ফাই, অ্যান্ড্রয়েড 6 এর সাথে আপনার যখন একটি বৈধ সেল ডেটা সংযোগ থাকবে, ওয়াইফাই রাষ্ট্রের পরিবর্তনগুলি সংযুক্তি_আ্যাকশনকে ট্রিগার করবে না। তাদের একমাত্র কারণ সংযোগ স্থিতিকে প্রভাবিত করেছিল, এখন তা নয়।
ব্রুস

5

এই কোডটি মোটেই অনুমতি প্রয়োজন হয় না। এটি কেবলমাত্র ওয়াই-ফাই নেটওয়ার্ক সংযোগের স্থিতি পরিবর্তনের জন্য সীমাবদ্ধ (অন্য কোনও নেটওয়ার্ক আমলে নেওয়া হয় না)। রিসিভারটি স্থিরভাবে অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল ফাইলে প্রকাশিত হয় এবং এটি রফতানি করার প্রয়োজন হয় না কারণ এটি সিস্টেমের দ্বারা আহবান করা হবে protected broadcast,NETWORK_STATE_CHANGED_ACTION , যে নেটওয়ার্ক সংযোগ স্থিতি পরিবর্তন করেন।

AndroidManifest:

<receiver
    android:name=".WifiReceiver"
    android:enabled="true"
    android:exported="false">

    <intent-filter>
        <!--protected-broadcast: Special broadcast that only the system can send-->
        <!--Corresponds to: android.net.wifi.WifiManager.NETWORK_STATE_CHANGED_ACTION-->
        <action android:name="android.net.wifi.STATE_CHANGE" />
    </intent-filter>

</receiver>

ব্রডকাস্টার্সিভার ক্লাস:

public class WifiReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
/*
 Tested (I didn't test with the WPS "Wi-Fi Protected Setup" standard):
 In API15 (ICE_CREAM_SANDWICH) this method is called when the new Wi-Fi network state is:
 DISCONNECTED, OBTAINING_IPADDR, CONNECTED or SCANNING

 In API19 (KITKAT) this method is called when the new Wi-Fi network state is:
 DISCONNECTED (twice), OBTAINING_IPADDR, VERIFYING_POOR_LINK, CAPTIVE_PORTAL_CHECK
 or CONNECTED

 (Those states can be obtained as NetworkInfo.DetailedState objects by calling
 the NetworkInfo object method: "networkInfo.getDetailedState()")
*/
    /*
     * NetworkInfo object associated with the Wi-Fi network.
     * It won't be null when "android.net.wifi.STATE_CHANGE" action intent arrives.
     */
    NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);

    if (networkInfo != null && networkInfo.isConnected()) {
        // TODO: Place the work here, like retrieving the access point's SSID

        /*
         * WifiInfo object giving information about the access point we are connected to.
         * It shouldn't be null when the new Wi-Fi network state is CONNECTED, but it got
         * null sometimes when connecting to a "virtualized Wi-Fi router" in API15.
         */
        WifiInfo wifiInfo = intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO);
        String ssid = wifiInfo.getSSID();
    }
}
}

অনুমতিসমূহ:

None

1
ডিভাইসে কাজ চলমান <এপিআই 26. হিসেবে @Isham প্রস্তাব কর্ম আর Android হে সমর্থিত
tiagocarvalho92

3

এখানে আমার কোডের একটি উদাহরণ দেওয়া আছে, যা ওয়াইফাইয়ের সাথে সংযুক্ত থাকাকালীন কেবল কমগুলি অনুমতি দেওয়ার ব্যবহারকারীদের পছন্দকে বিবেচনা করে।

IntentServiceস্টাফ ডাউনলোড করার চেষ্টা করার আগে আমি এই কোডটি একটি ভিতর থেকে কল করছি ।

মনে রাখবেন যে কোনও ধরণের নেটওয়ার্ক সংযোগ NetworkInfoনা nullথাকলে তা হবে ।

private boolean canConnect()
{
    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

    boolean canConnect = false;
    boolean wifiOnly = SharedPreferencesUtils.wifiOnly();

    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    if(networkInfo != null)
    {
        if(networkInfo.isConnected())
        {
            if((networkInfo.getType() == ConnectivityManager.TYPE_WIFI) ||
               (networkInfo.getType() != ConnectivityManager.TYPE_WIFI && !wifiOnly))
            {
                canConnect = true;
            }
        }
    }

    return canConnect;
}

3

অ্যান্ড্রয়েড ও ওয়াইফাই রাষ্ট্র পরিবর্তনের জন্য অন্তর্ভুক্ত সম্প্রচার পাওয়ার সম্ভাবনা সরিয়ে ফেলে removed সুতরাং আপনার অ্যাপটি যদি বন্ধ থাকে তবে আপনি সেগুলি গ্রহণ করতে সক্ষম হবেন না। নতুনWorkManager তাই আমি এটা দিয়ে একটু পরীক্ষানিরীক্ষা করেছি এবং এটা কাজ বেশ ভাল বলে মনে হয়, যখন আপনার অ্যাপ্লিকেশন বন্ধ করা হয় চালানোর ক্ষমতা রয়েছে:

এটি আপনার নির্ভরতার সাথে যুক্ত করুন:

implementation "android.arch.work:work-runtime:1.0.0-alpha08"

WifiConnectWorker.kt

class WifiConnectWorker : Worker() {

    override fun doWork(): Result {
        Log.i(TAG, "I think we connected to a wifi")
        return Result.SUCCESS
    }
}

MainActivity.kt

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)

        val workManager = WorkManager.getInstance()

        // Add constraint to start the worker when connecting to WiFi
        val request = OneTimeWorkRequest.Builder(WifiConnectWorker::class.java)
            .setConstraints(Constraints.Builder()
                .setRequiredNetworkType(UNMETERED)
                .build())
            .build()

        // The worker should be started, even if your app is closed
        workManager.beginUniqueWork("watch_wifi", REPLACE, request).enqueue()
    }
}

মনে রাখবেন যে এটি এককালীন বিজ্ঞপ্তির জন্য কেবলমাত্র দ্রুত পরীক্ষা ছিল। ওয়াইফাই চালু এবং বন্ধ থাকা অবস্থায় সর্বদা অবহিত হওয়ার জন্য আরও কাজ করার দরকার আছে।

পিএস: অ্যাপ্লিকেশনটি যখন জোর করে ছেড়ে দেওয়া হয় , তখন কর্মী শুরু হয় না, মনে WorkManagerহয় তখন অনুরোধগুলি বাতিল করে দিচ্ছে।


আমার অ্যাপ্লিকেশনটি বলপূর্বক অব্যাহত অবস্থায় থাকলেও কর্মী শুরু করার কোনও উপায় আছে কি? ওয়ার্ক ম্যানেজার কেবল অ্যাপটি খোলা থাকলেই .setRequiredNetworkType (UNMETERED) এর সাথে কাজ করছেন। কর্মীদের ট্রিগার করার কোনও উপায় কি এমন কি অ্যাপ হত্যার মধ্যে রয়েছে (জোর করে বন্ধ অবস্থা)। কারণ অন্তর্নিহিত ব্রড কাস্ট রিসিভারটি কিছুটা সীমাবদ্ধ। সেরা বিকল্পটি কী হবে?
সুরেশ

2

আমি এই কোডটি ব্যবহার করেছি:

public class MainActivity extends Activity
    {
    .
    .
    .
    @Override
    protected void onCreate(Bundle savedInstanceState)
        {
        super.onCreate(savedInstanceState);
        .
        .
        .
        }

    @Override
    protected void onResume()
        {
        super.onResume();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
        registerReceiver(broadcastReceiver, intentFilter);  
        }

    @Override
    protected void onPause()
        {
        super.onPause();
        unregisterReceiver(broadcastReceiver);
        }

    private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver()
        {
        @Override
        public void onReceive(Context context, Intent intent)
            {
            final String action = intent.getAction();
            if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION))
                {
                if (intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false))
                    {
                    // wifi is enabled
                    }
                else
                    {
                    // wifi is disabled
                    }
                }
            }
        };
    }

2

অ্যাপ্লিকেশন প্রসঙ্গটি গ্রহণ করে আমার কাছে দুটি ওয়াইফাই সংযোগ সনাক্ত করার পদ্ধতি রয়েছে:

1) আমার পুরানো পদ্ধতি

public boolean isConnectedWifi1(Context context) {
    try {
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();           
        if (networkInfo != null) {
            NetworkInfo[] netInfo = connectivityManager.getAllNetworkInfo();
            for (NetworkInfo ni : netInfo) {
                if ((ni.getTypeName().equalsIgnoreCase("WIFI"))
                        && ni.isConnected()) {
                    return true;
                }                   
            }
        }
        return false;
    } catch (Exception e) {
        Log.e(TAG, e.getMessage());
    }
    return false;
}

2) আমার নতুন পদ্ধতি (বর্তমানে আমি এই পদ্ধতিটি ব্যবহার করছি):

public boolean isConnectedWifi(Context context) {
         ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
         NetworkInfo networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);     
         return networkInfo.isConnected();
}

Android.net.wifi.STATE_CHANGE এর মতো অন্তর্নিহিত ব্রডকাস্ট রিসিভার হিসাবে অ্যান্ড্রয়েড ওয়ে আমি কীভাবে এটি করতে পারি তা আর ম্যানিফেস্টে নিবন্ধভুক্ত হতে দেওয়া হবে না (দেখুন ডেভেলপার.অ্যান্ড্রয়েড . com/guide/compferences/… )। যদি আমরা এটিকে অ্যাপ্লিকেশন ক্রিয়াকলাপে (অনক্রিটে বলুন) নিবন্ধভুক্ত করি, তবে এটি অনস্টপ () এ নিবন্ধভুক্ত হতে হবে এবং আমরা আর ওয়াইফাই সম্পর্কিত ইভেন্টগুলি গ্রহণ করব না
জাফর142003

2

যারা CONNECTIVITY_CHANGE সম্প্রচার উপভোগ করছেন তাদের জন্য , অনুগ্রহ করে নোট করুন অ্যাপটি অ্যান্ড্রয়েড ও-এর পটভূমিতে থাকাকালীন এটিকে আর বরখাস্ত করা হবে না

https://developer.android.com/about/versions/o/background.html


2

1) আমি ব্রডকাস্ট রিসিভার পদ্ধতির চেষ্টা করেছিলাম যদিও আমি সংযুক্তি_অ্যাকশন / সংযোগ_চ্যাঞ্জি জানি এপিআই 28-এ অবজ্ঞা করা হয়েছে এবং প্রস্তাবিত নয়। সুস্পষ্ট রেজিস্টার ব্যবহার করতে বাধ্য, এটি যতক্ষণ অ্যাপ চলছে ততক্ষণ তা শোনে s

2) আমি ফায়ারবেস ডিসপ্যাচারও চেষ্টা করেছিলাম যা কাজ করে তবে অ্যাপ্লিকেশন মারা যায় না।

3) প্রস্তাবিত উপায়টি হ'ল ওয়ার্ক ম্যানেজারটি নিহত প্রক্রিয়া ছাড়িয়েও অভ্যন্তরীণভাবে নিবন্ধন নেটওয়ার্কের অনুরোধ () ব্যবহারের বাইরে গ্যারান্টি দেয়

# 3 পদ্ধতির পক্ষে বৃহত্তম প্রমাণ অ্যান্ড্রয়েড ডক দ্বারা নিজেই উল্লেখ করা হয়। বিশেষত পটভূমির অ্যাপ্লিকেশনগুলির জন্য।

এছাড়াও এখানে

অ্যান্ড্রয়েড .0.০-তে আমরা তিনটি সাধারণভাবে ব্যবহৃত অন্তর্নিহিত সম্প্রচারগুলি সরিয়ে দিচ্ছি - CONNECTIVITY_ACTION, ACTION_NEW_PICTURE, এবং ACTION_NEW_VIDEO - যেহেতু এগুলি একসাথে একাধিক অ্যাপ্লিকেশনের পটভূমি প্রক্রিয়াগুলি জাগ্রত করতে পারে এবং মেমরি এবং ব্যাটারি স্ট্রেন করতে পারে। যদি আপনার অ্যাপ্লিকেশনগুলি এগুলি গ্রহণ করে তবে তার পরিবর্তে জবশেডুলার এবং সম্পর্কিত এপিআইগুলিতে মাইগ্রেট করতে অ্যান্ড্রয়েড 7.0 এর সুবিধা নিন।

পর্যায়ক্রমিক ওয়ার্ক ম্যানেজার অনুরোধটি ব্যবহার করে এখন পর্যন্ত এটি আমাদের পক্ষে ঠিক কাজ করে।

আপডেট: আমি এটি সম্পর্কে 2 সিরিজের মাঝারি পোস্ট লিখে শেষ করেছি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.