इंटरनेट कनेक्टिविटी के लिए वाई-फ़ाई सुझाव एपीआई

Android 10 (एपीआई लेवल 29) और उसके बाद के वर्शन वाले डिवाइसों पर, आपके ऐप्लिकेशन को नेटवर्क क्रेडेंशियल जोड़ने की अनुमति मिलती है. इससे, डिवाइस अपने-आप वाई-फ़ाई ऐक्सेस पॉइंट से कनेक्ट हो जाता है. WifiNetworkSuggestion का इस्तेमाल करके, यह सुझाव दिया जा सकता है कि किस नेटवर्क से कनेक्ट किया जाए. आखिर में, प्लैटफ़ॉर्म यह तय करता है कि आपके ऐप्लिकेशन और अन्य ऐप्लिकेशन के इनपुट के आधार पर, कौनसा ऐक्सेस पॉइंट स्वीकार करना है.

Android 11 (एपीआई लेवल 30) और उसके बाद के वर्शन पर:

  • सुझाव देने वाले एपीआई की मदद से, PasspointConfiguration को प्रोवाइड किया जा सकता है. Android 11 से पहले, PasspointConfiguration को उपलब्ध कराने के लिए, addOrUpdatePasspointConfiguration() एपीआई का इस्तेमाल करना ज़रूरी था.
  • यह फ़्रेमवर्क, टीएलएस पर आधारित एंटरप्राइज़ नेटवर्क के सुझावों (EAP-TLS, EAP-TTLS, और EAP-PEAP) पर सुरक्षा से जुड़ी ज़रूरी शर्तें लागू करता है. ऐसे नेटवर्क के सुझावों के लिए, Root CA certificate और server domain name सेट करना ज़रूरी है.
  • यह फ़्रेमवर्क, EAP-SIM पर आधारित एंटरप्राइज़ सुझावों (EAP-SIM, EAP-AKA, EAP-AKA-PRIME) के लिए, मालिकाना हक से जुड़ी ज़रूरी शर्तों को लागू करता है. ऐसे सुझावों को सिर्फ़ उन ऐप्लिकेशन से अनुमति मिलती है जिन पर कैरियर ने हस्ताक्षर किए हों.
  • कैरियर के हस्ताक्षर वाले ऐप्लिकेशन से मिले सुझावों के लिए, फ़्रेमवर्क अपने-आप उन्हें ऐप्लिकेशन के कैरियर साइनिंग से जुड़ा कैरियर आईडी असाइन करता है. अगर उस सिम को डिवाइस से हटा दिया जाता है, तो ऐसे सुझाव अपने-आप बंद हो जाते हैं.

Android 12 (एपीआई लेवल 31) और उसके बाद के वर्शन वाले डिवाइसों पर:

  • ज़्यादा निजता के लिए, MAC पते को बार-बार बदलने की सुविधा चालू की जा सकती है. इससे, समय-समय पर MAC पते को बदला जाता है. अपने नेटवर्क के लिए रैंडमाइज़ेशन का लेवल बताने के लिए, setMacRandomizationSetting का इस्तेमाल करें.

  • isPasspointTermsAndConditionsSupported(): शर्तें और नियम, Passpoint की एक सुविधा है. इसकी मदद से, नेटवर्क डिप्लॉयमेंट में, असुरक्षित कैप्टिव पोर्टल को सुरक्षित Passpoint नेटवर्क से बदला जा सकता है. कैप्टिव पोर्टल, ओपन नेटवर्क का इस्तेमाल करते हैं. नियम और शर्तें स्वीकार करने के लिए, उपयोगकर्ता को एक सूचना दिखाई जाती है. ऐसे ऐप्लिकेशन जो नियमों और शर्तों के तहत, पासपॉइंट नेटवर्क का सुझाव देते हैं उन्हें पहले इस एपीआई को कॉल करना होगा. इससे, यह पक्का किया जा सकेगा कि डिवाइस पर यह सुविधा काम करती है. अगर डिवाइस में यह सुविधा काम नहीं करती है, तो वह इस नेटवर्क से कनेक्ट नहीं हो पाएगा. साथ ही, उसे किसी अन्य या लेगसी नेटवर्क से कनेक्ट करने का सुझाव दिया जाएगा.

  • isDecoratedIdentitySupported(): प्रीफ़िक्स डेकोरेशन वाले नेटवर्क की पुष्टि करते समय, डेकोरेट की गई पहचान के प्रीफ़िक्स की मदद से नेटवर्क ऑपरेटर, नेटवर्क ऐक्सेस आइडेंटिफ़ायर (एनएआई) को अपडेट कर सकते हैं. इससे, एएए नेटवर्क के अंदर मौजूद कई प्रॉक्सी के ज़रिए साफ़ तौर पर रूटिंग की जा सकती है. इस बारे में ज़्यादा जानने के लिए, आरएफ़सी 7542 देखें.

    Android 12 में यह सुविधा, PPS-MO एक्सटेंशन के लिए डब्ल्यूबीए स्पेसिफ़िकेशन का पालन करने के लिए लागू की गई है. जिन ऐप्लिकेशन में ऐसे Passpoint नेटवर्क के सुझाव दिए जाते हैं जिनके लिए डेकोरेट की गई पहचान की ज़रूरत होती है उन्हें सबसे पहले इस एपीआई को कॉल करना होगा. इससे यह पक्का किया जा सकेगा कि डिवाइस इस सुविधा के साथ काम करता है या नहीं. अगर डिवाइस पर यह सुविधा काम नहीं करती है, तो पहचान को सजाने की सुविधा काम नहीं करेगी. साथ ही, नेटवर्क की पुष्टि नहीं हो पाएगी.

पासपॉइंट का सुझाव बनाने के लिए, ऐप्लिकेशन को PasspointConfiguration, Credential, और HomeSp क्लास का इस्तेमाल करना होगा. ये क्लास, पासपॉइंट प्रोफ़ाइल के बारे में बताती हैं. इस प्रोफ़ाइल के बारे में Wi-Fi Alliance के पासपॉइंट स्पेसिफ़िकेशन में बताया गया है.

यहां दिए गए कोड सैंपल में, एक ओपन, एक WPA2, एक WPA3, और एक Passpoint नेटवर्क के लिए क्रेडेंशियल देने का तरीका बताया गया है:

Kotlin

val suggestion1 = WifiNetworkSuggestion.Builder()
        .setSsid("test111111")
        .setIsAppInteractionRequired(true) // Optional (Needs location permission)
        .build();

val suggestion2 = WifiNetworkSuggestion.Builder()
        .setSsid("test222222")
        .setWpa2Passphrase("test123456")
        .setIsAppInteractionRequired(true) // Optional (Needs location permission)
        .build();

val suggestion3 = WifiNetworkSuggestion.Builder()
        .setSsid("test333333")
        .setWpa3Passphrase("test6789")
        .setIsAppInteractionRequired(true) // Optional (Needs location permission)
        .build();

val passpointConfig = PasspointConfiguration(); // configure passpointConfig to include a valid Passpoint configuration
val suggestion4 = WifiNetworkSuggestion.Builder()
        .setPasspointConfig(passpointConfig)
        .setIsAppInteractionRequired(true) // Optional (Needs location permission)
        .build();

val suggestionsList = listOf(suggestion1, suggestion2, suggestion3, suggestion4);

val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager;

val status = wifiManager.addNetworkSuggestions(suggestionsList);
if (status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) {
    // do error handling here
}

// Optional (Wait for post connection broadcast to one of your suggestions)
val intentFilter = IntentFilter(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION);

val broadcastReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        if (!intent.action.equals(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION)) {
            return;
        }
        // do post connect processing here
    }
};
context.registerReceiver(broadcastReceiver, intentFilter);

Java

final WifiNetworkSuggestion suggestion1 =
  new WifiNetworkSuggestion.Builder()
  .setSsid("test111111")
  .setIsAppInteractionRequired(true) // Optional (Needs location permission)
  .build();

final WifiNetworkSuggestion suggestion2 =
  new WifiNetworkSuggestion.Builder()
  .setSsid("test222222")
  .setWpa2Passphrase("test123456")
  .setIsAppInteractionRequired(true) // Optional (Needs location permission)
  .build();

final WifiNetworkSuggestion suggestion3 =
  new WifiNetworkSuggestion.Builder()
  .setSsid("test333333")
  .setWpa3Passphrase("test6789")
  .setIsAppInteractionRequired(true) // Optional (Needs location permission)
  .build();

final PasspointConfiguration passpointConfig = new PasspointConfiguration();
// configure passpointConfig to include a valid Passpoint configuration

final WifiNetworkSuggestion suggestion4 =
  new WifiNetworkSuggestion.Builder()
  .setPasspointConfig(passpointConfig)
  .setIsAppInteractionRequired(true) // Optional (Needs location permission)
  .build();

final List<WifiNetworkSuggestion> suggestionsList =
  new ArrayList<WifiNetworkSuggestion> {{
    add(suggestion1);
    add(suggestion2);
    add(suggestion3);
    add(suggestion4);
  }};

final WifiManager wifiManager =
  (WifiManager) context.getSystemService(Context.WIFI_SERVICE);

final int status = wifiManager.addNetworkSuggestions(suggestionsList);
if (status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) {
// do error handling here…
}

// Optional (Wait for post connection broadcast to one of your suggestions)
final IntentFilter intentFilter =
  new IntentFilter(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION);

final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    if (!intent.getAction().equals(
      WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION)) {
      return;
    }
    // do post connect processing here...
  }
};
context.registerReceiver(broadcastReceiver, intentFilter);

ऐप्लिकेशन पहली बार सुझाव देने के तुरंत बाद, उपयोगकर्ता को सूचना दी जाती है. सूचना का टाइप, डिवाइस पर चल रहे Android वर्शन पर निर्भर करता है:

  • Android 11 (एपीआई लेवल 30) और उसके बाद के वर्शन पर, अगर ऐप्लिकेशन फ़ोरग्राउंड में चल रहा है, तो उपयोगकर्ता को एक डायलॉग दिखता है. अगर ऐप्लिकेशन बैकग्राउंड में चल रहा है, तो उसे एक सूचना दिखती है.
  • Android 10 (एपीआई लेवल 29) पर, उपयोगकर्ता को सूचना दिखती है. इससे कोई फ़र्क़ नहीं पड़ता कि ऐप्लिकेशन फ़ोरग्राउंड में चल रहा है या बैकग्राउंड में.

जब प्लैटफ़ॉर्म, नेटवर्क के सुझावों में से किसी एक से कनेक्ट होता है, तो सेटिंग में ऐसा टेक्स्ट दिखता है जो नेटवर्क कनेक्शन को सुझाव देने वाले ऐप्लिकेशन को एट्रिब्यूट करता है.

उपयोगकर्ता के डिसकनेक्ट होने की समस्या को हल करना

अगर उपयोगकर्ता, वाई-फ़ाई पिकर का इस्तेमाल करके, किसी नेटवर्क से कनेक्ट होने के बाद उसे डिसकनेक्ट करता है, तो उस नेटवर्क की रेंज में होने पर भी उसे अनदेखा कर दिया जाता है. इस अवधि के दौरान, उस नेटवर्क को अपने-आप कनेक्ट होने के लिए नहीं चुना जाएगा. भले ही, ऐप्लिकेशन उस नेटवर्क से जुड़े सुझाव को हटाकर फिर से जोड़ दे. अगर उपयोगकर्ता किसी ऐसे नेटवर्क से साफ़ तौर पर कनेक्ट करने के लिए वाई-फ़ाई पिकर का इस्तेमाल करता है जिसे पहले डिसकनेक्ट किया गया था, तो उस नेटवर्क को तुरंत ऑटो-कनेक्शन के लिए माना जाएगा.

ऐप्लिकेशन के लिए अनुमति की स्थिति बदलना

नेटवर्क के सुझाव की सूचना को अस्वीकार करने पर, ऐप्लिकेशन से CHANGE_WIFI_STATE अनुमति हट जाती है. उपयोगकर्ता बाद में, वाई-फ़ाई कंट्रोल मेन्यू (सेटिंग > ऐप्लिकेशन और सूचनाएं > ऐप्लिकेशन के लिए खास ऐक्सेस > वाई-फ़ाई कंट्रोल > App name) में जाकर, यह अनुमति फिर से दे सकता है.