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

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

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

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

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

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

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

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

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

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

यहां दिए गए कोड सैंपल में, एक ओपन नेटवर्क, एक 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) में जाकर, बाद में यह अनुमति दे सकता है.