ইন্টারনেট সংযোগের জন্য Wi-Fi সাজেশন API

Android 10 (API লেভেল 29) এবং উচ্চতর চলমান ডিভাইসগুলি আপনার অ্যাপকে একটি Wi-Fi অ্যাক্সেস পয়েন্টে স্বয়ংক্রিয়ভাবে সংযোগ করার জন্য একটি ডিভাইসের জন্য নেটওয়ার্ক শংসাপত্র যোগ করার অনুমতি দেয়। আপনি WifiNetworkSuggestion ব্যবহার করে কোন নেটওয়ার্কে সংযোগ করতে হবে তার জন্য পরামর্শ সরবরাহ করতে পারেন৷ প্ল্যাটফর্মটি শেষ পর্যন্ত আপনার অ্যাপ এবং অন্যদের ইনপুটের উপর ভিত্তি করে কোন অ্যাক্সেস পয়েন্টটি গ্রহণ করবে তা বেছে নেয়।

Android 11 (API স্তর 30) এবং উচ্চতর:

  • একটি PasspointConfiguration ব্যবস্থা করা পরামর্শ API দ্বারা সমর্থিত। অ্যান্ড্রয়েড 11-এর আগে, একটি PasspointConfiguration ব্যবস্থা করার জন্য addOrUpdatePasspointConfiguration() API ব্যবহার করা প্রয়োজন।
  • ফ্রেমওয়ার্ক টিএলএস-ভিত্তিক এন্টারপ্রাইজ পরামর্শের (EAP-TLS, EAP-TTLS, এবং EAP-PEAP) নিরাপত্তার প্রয়োজনীয়তা প্রয়োগ করে; এই জাতীয় নেটওয়ার্কগুলির পরামর্শের জন্য অবশ্যই একটি Root CA certificate এবং একটি server domain name সেট করতে হবে৷
  • ফ্রেমওয়ার্ক EAP-SIM ভিত্তিক এন্টারপ্রাইজ পরামর্শের জন্য মালিকানার প্রয়োজনীয়তা প্রয়োগ করে (EAP-SIM, EAP-AKA, EAP-AKA-PRIME); এই ধরনের পরামর্শ শুধুমাত্র ক্যারিয়ার-স্বাক্ষরিত অ্যাপ দ্বারা অনুমোদিত।
  • একটি ক্যারিয়ার-স্বাক্ষরিত অ্যাপ দ্বারা প্রদত্ত পরামর্শের জন্য, ফ্রেমওয়ার্ক স্বয়ংক্রিয়ভাবে তাদের অ্যাপের ক্যারিয়ার সাইনিংয়ের সাথে সম্পর্কিত একটি ক্যারিয়ার আইডি বরাদ্দ করে৷ ডিভাইস থেকে সংশ্লিষ্ট সিম সরানো হলে এই ধরনের পরামর্শ স্বয়ংক্রিয়ভাবে অক্ষম হয়ে যায়।

Android 12 (API লেভেল 31) এবং উচ্চতর:

  • অতিরিক্ত গোপনীয়তা অ-স্থির MAC র্যান্ডমাইজেশনের মাধ্যমে সক্ষম করা যেতে পারে, যা পর্যায়ক্রমে এলোমেলো MAC ঠিকানাকে পুনরায় র্যান্ডমাইজ করে। আপনার নেটওয়ার্কের জন্য র্যান্ডমাইজেশনের স্তর নির্দিষ্ট করতে setMacRandomizationSetting ব্যবহার করুন।

  • isPasspointTermsAndConditionsSupported() : শর্তাবলী হল একটি পাসপয়েন্ট বৈশিষ্ট্য যা নেটওয়ার্ক স্থাপনাগুলিকে একটি নিরাপদ পাসপয়েন্ট নেটওয়ার্কের সাথে ওপেন নেটওয়ার্ক ব্যবহার করে এমন নিরাপদ ক্যাপটিভ পোর্টালগুলি প্রতিস্থাপন করতে দেয়। শর্তাবলী গ্রহণ করার প্রয়োজন হলে ব্যবহারকারীর কাছে একটি বিজ্ঞপ্তি প্রদর্শিত হয়। শর্তাবলী দ্বারা গেট করা পাসপয়েন্ট নেটওয়ার্কের পরামর্শ দেয় এমন অ্যাপগুলিকে ডিভাইসটি সক্ষমতা সমর্থন করে কিনা তা নিশ্চিত করতে প্রথমে এই API কল করতে হবে। ডিভাইসটি সক্ষমতা সমর্থন না করলে, এটি এই নেটওয়ার্কের সাথে সংযোগ করতে সক্ষম হবে না এবং একটি বিকল্প বা উত্তরাধিকারী নেটওয়ার্কের পরামর্শ দেওয়া আবশ্যক৷

  • isDecoratedIdentitySupported() : একটি উপসর্গ সজ্জা সহ নেটওয়ার্কগুলিতে প্রমাণীকরণ করার সময়, সজ্জিত পরিচয় উপসর্গ নেটওয়ার্ক অপারেটরদের নেটওয়ার্ক অ্যাক্সেস আইডেন্টিফায়ার (NAI) আপডেট করার অনুমতি দেয় একটি AAA নেটওয়ার্কের ভিতরে একাধিক প্রক্সির মাধ্যমে সুস্পষ্ট রাউটিং করতে (এ বিষয়ে আরও জানতে RFC 7542 দেখুন) .

    Android 12 PPS-MO এক্সটেনশনের জন্য WBA স্পেসিফিকেশনের সাথে সামঞ্জস্য করতে এই বৈশিষ্ট্যটি প্রয়োগ করে। যে অ্যাপগুলি পাসপয়েন্ট নেটওয়ার্কগুলির পরামর্শ দেয় যেগুলির জন্য একটি সজ্জিত পরিচয়ের প্রয়োজন হয় সেগুলিকে ডিভাইসটি সক্ষমতা সমর্থন করে তা নিশ্চিত করতে প্রথমে এই APIটি কল করতে হবে৷ ডিভাইসটি সক্ষমতা সমর্থন না করলে, পরিচয়টি সজ্জিত হবে না এবং নেটওয়ার্কে প্রমাণীকরণ ব্যর্থ হতে পারে।

একটি পাসপয়েন্ট পরামর্শ তৈরি করতে, অ্যাপগুলিকে অবশ্যই PasspointConfiguration , Credential এবং HomeSp ক্লাসগুলি ব্যবহার করতে হবে৷ এই ক্লাসগুলি পাসপয়েন্ট প্রোফাইল বর্ণনা করে, যা Wi-Fi অ্যালায়েন্স পাসপয়েন্ট স্পেসিফিকেশনে সংজ্ঞায়িত করা হয়েছে।

নিম্নলিখিত কোড নমুনা দেখায় কিভাবে একটি খোলা, একটি WPA2, একটি WPA3 নেটওয়ার্ক এবং একটি পাসপয়েন্ট নেটওয়ার্কের জন্য শংসাপত্র প্রদান করতে হয়:

কোটলিন

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

জাভা

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 এর সংস্করণের উপর নির্ভর করে:

  • অ্যান্ড্রয়েড 11 (এপিআই লেভেল 30) এবং তার উপরে, ব্যবহারকারী অ্যাপটি ফোরগ্রাউন্ডে চললে একটি ডায়ালগ এবং অ্যাপটি ব্যাকগ্রাউন্ডে চললে একটি বিজ্ঞপ্তি দেখতে পায়।
  • অ্যান্ড্রয়েড 10 (এপিআই লেভেল 29) এ, অ্যাপটি অগ্রভাগে বা পটভূমিতে চলছে কিনা তা বিবেচনা না করে ব্যবহারকারী একটি বিজ্ঞপ্তি দেখতে পান।

যখন প্ল্যাটফর্মটি নেটওয়ার্ক পরামর্শগুলির একটির সাথে সংযোগ করে, তখন সেটিংস টেক্সট দেখায় যা সংশ্লিষ্ট পরামর্শদাতা অ্যাপের সাথে নেটওয়ার্ক সংযোগকে দায়ী করে।

ব্যবহারকারী সংযোগ বিচ্ছিন্ন হ্যান্ডলিং

ব্যবহারকারী যদি Wi-Fi বাছাইকারী ব্যবহার করে এটির সাথে সংযুক্ত থাকাকালীন নেটওয়ার্ক প্রস্তাবনাগুলির একটি থেকে স্পষ্টভাবে সংযোগ বিচ্ছিন্ন করতে, তাহলে সেই নেটওয়ার্কটি এখনও পরিসরে থাকা অবস্থায় উপেক্ষা করা হয়৷ এই সময়ের মধ্যে, সেই নেটওয়ার্কটিকে স্বয়ংক্রিয়-সংযোগের জন্য বিবেচনা করা হবে না, এমনকি যদি অ্যাপটি নেটওয়ার্কের সাথে সম্পর্কিত নেটওয়ার্ক প্রস্তাবনাটিকে সরিয়ে দেয় এবং পুনরায় যোগ করে। ব্যবহারকারী যদি পূর্বে সংযোগ বিচ্ছিন্ন করা একটি নেটওয়ার্কে স্পষ্টভাবে সংযোগ করতে Wi-Fi পিকার ব্যবহার করে, তাহলে সেই নেটওয়ার্কটি অবিলম্বে স্বয়ংক্রিয় সংযোগের জন্য বিবেচিত হবে৷

অ্যাপের অনুমোদনের স্থিতি পরিবর্তন করা হচ্ছে

নেটওয়ার্ক সাজেশন বিজ্ঞপ্তি প্রত্যাখ্যান করা একজন ব্যবহারকারী অ্যাপ থেকে CHANGE_WIFI_STATE অনুমতি সরিয়ে দেয়। ব্যবহারকারী পরে ওয়াই-ফাই কন্ট্রোল মেনুতে গিয়ে ( সেটিংস > অ্যাপস এবং বিজ্ঞপ্তি > বিশেষ অ্যাপ অ্যাক্সেস > ওয়াই-ফাই কন্ট্রোল > App name ) এই অনুমোদন দিতে পারেন।

,

Android 10 (API লেভেল 29) এবং উচ্চতর চলমান ডিভাইসগুলি আপনার অ্যাপকে একটি Wi-Fi অ্যাক্সেস পয়েন্টে স্বয়ংক্রিয়ভাবে সংযোগ করার জন্য একটি ডিভাইসের জন্য নেটওয়ার্ক শংসাপত্র যোগ করার অনুমতি দেয়। আপনি WifiNetworkSuggestion ব্যবহার করে কোন নেটওয়ার্কে সংযোগ করতে হবে তার জন্য পরামর্শ সরবরাহ করতে পারেন৷ প্ল্যাটফর্মটি শেষ পর্যন্ত আপনার অ্যাপ এবং অন্যদের ইনপুটের উপর ভিত্তি করে কোন অ্যাক্সেস পয়েন্টটি গ্রহণ করবে তা বেছে নেয়।

Android 11 (API স্তর 30) এবং উচ্চতর:

  • একটি PasspointConfiguration ব্যবস্থা করা পরামর্শ API দ্বারা সমর্থিত। অ্যান্ড্রয়েড 11-এর আগে, একটি PasspointConfiguration ব্যবস্থা করার জন্য addOrUpdatePasspointConfiguration() API ব্যবহার করা প্রয়োজন।
  • ফ্রেমওয়ার্ক টিএলএস-ভিত্তিক এন্টারপ্রাইজ পরামর্শের (EAP-TLS, EAP-TTLS, এবং EAP-PEAP) নিরাপত্তার প্রয়োজনীয়তা প্রয়োগ করে; এই জাতীয় নেটওয়ার্কগুলির পরামর্শের জন্য অবশ্যই একটি Root CA certificate এবং একটি server domain name সেট করতে হবে৷
  • ফ্রেমওয়ার্ক EAP-SIM ভিত্তিক এন্টারপ্রাইজ পরামর্শের জন্য মালিকানার প্রয়োজনীয়তা প্রয়োগ করে (EAP-SIM, EAP-AKA, EAP-AKA-PRIME); এই ধরনের পরামর্শ শুধুমাত্র ক্যারিয়ার-স্বাক্ষরিত অ্যাপ দ্বারা অনুমোদিত।
  • একটি ক্যারিয়ার-স্বাক্ষরিত অ্যাপ দ্বারা প্রদত্ত পরামর্শের জন্য, ফ্রেমওয়ার্ক স্বয়ংক্রিয়ভাবে তাদের অ্যাপের ক্যারিয়ার সাইনিংয়ের সাথে সম্পর্কিত একটি ক্যারিয়ার আইডি বরাদ্দ করে৷ ডিভাইস থেকে সংশ্লিষ্ট সিম সরানো হলে এই ধরনের পরামর্শ স্বয়ংক্রিয়ভাবে অক্ষম হয়ে যায়।

Android 12 (API লেভেল 31) এবং উচ্চতর:

  • অতিরিক্ত গোপনীয়তা অ-স্থির MAC র্যান্ডমাইজেশনের মাধ্যমে সক্ষম করা যেতে পারে, যা পর্যায়ক্রমে এলোমেলো MAC ঠিকানাকে পুনরায় র্যান্ডমাইজ করে। আপনার নেটওয়ার্কের জন্য র্যান্ডমাইজেশনের স্তর নির্দিষ্ট করতে setMacRandomizationSetting ব্যবহার করুন।

  • isPasspointTermsAndConditionsSupported() : শর্তাবলী হল একটি পাসপয়েন্ট বৈশিষ্ট্য যা নেটওয়ার্ক স্থাপনাগুলিকে একটি নিরাপদ পাসপয়েন্ট নেটওয়ার্কের সাথে ওপেন নেটওয়ার্ক ব্যবহার করে এমন নিরাপদ ক্যাপটিভ পোর্টালগুলি প্রতিস্থাপন করতে দেয়। শর্তাবলী গ্রহণ করার প্রয়োজন হলে ব্যবহারকারীর কাছে একটি বিজ্ঞপ্তি প্রদর্শিত হয়। শর্তাবলী দ্বারা গেট করা পাসপয়েন্ট নেটওয়ার্কের পরামর্শ দেয় এমন অ্যাপগুলিকে ডিভাইসটি সক্ষমতা সমর্থন করে কিনা তা নিশ্চিত করতে প্রথমে এই API কল করতে হবে। ডিভাইসটি সক্ষমতা সমর্থন না করলে, এটি এই নেটওয়ার্কের সাথে সংযোগ করতে সক্ষম হবে না এবং একটি বিকল্প বা উত্তরাধিকারী নেটওয়ার্কের পরামর্শ দেওয়া আবশ্যক৷

  • isDecoratedIdentitySupported() : একটি উপসর্গ সজ্জা সহ নেটওয়ার্কগুলিতে প্রমাণীকরণ করার সময়, সজ্জিত পরিচয় উপসর্গ নেটওয়ার্ক অপারেটরদের নেটওয়ার্ক অ্যাক্সেস আইডেন্টিফায়ার (NAI) আপডেট করার অনুমতি দেয় একটি AAA নেটওয়ার্কের ভিতরে একাধিক প্রক্সির মাধ্যমে সুস্পষ্ট রাউটিং করতে (এ বিষয়ে আরও জানতে RFC 7542 দেখুন) .

    Android 12 PPS-MO এক্সটেনশনের জন্য WBA স্পেসিফিকেশনের সাথে সামঞ্জস্য করতে এই বৈশিষ্ট্যটি প্রয়োগ করে। যে অ্যাপগুলি পাসপয়েন্ট নেটওয়ার্কগুলির পরামর্শ দেয় যেগুলির জন্য একটি সজ্জিত পরিচয়ের প্রয়োজন হয় সেগুলিকে ডিভাইসটি সক্ষমতা সমর্থন করে তা নিশ্চিত করতে প্রথমে এই APIটি কল করতে হবে৷ ডিভাইসটি সক্ষমতা সমর্থন না করলে, পরিচয়টি সজ্জিত হবে না এবং নেটওয়ার্কে প্রমাণীকরণ ব্যর্থ হতে পারে।

একটি পাসপয়েন্ট পরামর্শ তৈরি করতে, অ্যাপগুলিকে অবশ্যই PasspointConfiguration , Credential এবং HomeSp ক্লাসগুলি ব্যবহার করতে হবে৷ এই ক্লাসগুলি পাসপয়েন্ট প্রোফাইল বর্ণনা করে, যা Wi-Fi অ্যালায়েন্স পাসপয়েন্ট স্পেসিফিকেশনে সংজ্ঞায়িত করা হয়েছে।

নিম্নলিখিত কোড নমুনা দেখায় কিভাবে একটি খোলা, একটি WPA2, একটি WPA3 নেটওয়ার্ক এবং একটি পাসপয়েন্ট নেটওয়ার্কের জন্য শংসাপত্র প্রদান করতে হয়:

কোটলিন

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

জাভা

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 এর সংস্করণের উপর নির্ভর করে:

  • অ্যান্ড্রয়েড 11 (এপিআই লেভেল 30) এবং তার উপরে, ব্যবহারকারী অ্যাপটি ফোরগ্রাউন্ডে চললে একটি ডায়ালগ এবং অ্যাপটি ব্যাকগ্রাউন্ডে চললে একটি বিজ্ঞপ্তি দেখতে পায়।
  • অ্যান্ড্রয়েড 10 (এপিআই লেভেল 29) এ, অ্যাপটি অগ্রভাগে বা পটভূমিতে চলছে কিনা তা বিবেচনা না করে ব্যবহারকারী একটি বিজ্ঞপ্তি দেখতে পান।

যখন প্ল্যাটফর্মটি নেটওয়ার্ক পরামর্শগুলির একটির সাথে সংযোগ করে, তখন সেটিংস টেক্সট দেখায় যা সংশ্লিষ্ট পরামর্শদাতা অ্যাপের সাথে নেটওয়ার্ক সংযোগকে দায়ী করে।

ব্যবহারকারী সংযোগ বিচ্ছিন্ন হ্যান্ডলিং

ব্যবহারকারী যদি Wi-Fi বাছাইকারী ব্যবহার করে এটির সাথে সংযুক্ত থাকাকালীন নেটওয়ার্ক প্রস্তাবনাগুলির একটি থেকে স্পষ্টভাবে সংযোগ বিচ্ছিন্ন করতে, তাহলে সেই নেটওয়ার্কটি এখনও পরিসরে থাকা অবস্থায় উপেক্ষা করা হয়৷ এই সময়ের মধ্যে, সেই নেটওয়ার্কটিকে স্বয়ংক্রিয়-সংযোগের জন্য বিবেচনা করা হবে না, এমনকি যদি অ্যাপটি নেটওয়ার্কের সাথে সম্পর্কিত নেটওয়ার্ক প্রস্তাবনাটিকে সরিয়ে দেয় এবং পুনরায় যোগ করে। ব্যবহারকারী যদি পূর্বে সংযোগ বিচ্ছিন্ন করা একটি নেটওয়ার্কে স্পষ্টভাবে সংযোগ করতে Wi-Fi পিকার ব্যবহার করে, তাহলে সেই নেটওয়ার্কটি অবিলম্বে স্বয়ংক্রিয় সংযোগের জন্য বিবেচিত হবে৷

অ্যাপের অনুমোদনের স্থিতি পরিবর্তন করা হচ্ছে

নেটওয়ার্ক সাজেশন বিজ্ঞপ্তি প্রত্যাখ্যান করা একজন ব্যবহারকারী অ্যাপ থেকে CHANGE_WIFI_STATE অনুমতি সরিয়ে দেয়। ব্যবহারকারী পরে ওয়াই-ফাই কন্ট্রোল মেনুতে গিয়ে ( সেটিংস > অ্যাপস এবং বিজ্ঞপ্তি > বিশেষ অ্যাপ অ্যাক্সেস > ওয়াই-ফাই কন্ট্রোল > App name ) এই অনুমোদন দিতে পারেন।

,

Android 10 (API লেভেল 29) এবং উচ্চতর চলমান ডিভাইসগুলি আপনার অ্যাপকে একটি Wi-Fi অ্যাক্সেস পয়েন্টে স্বয়ংক্রিয়ভাবে সংযোগ করার জন্য একটি ডিভাইসের জন্য নেটওয়ার্ক শংসাপত্র যোগ করার অনুমতি দেয়। আপনি WifiNetworkSuggestion ব্যবহার করে কোন নেটওয়ার্কে সংযোগ করতে হবে তার জন্য পরামর্শ সরবরাহ করতে পারেন৷ প্ল্যাটফর্মটি শেষ পর্যন্ত আপনার অ্যাপ এবং অন্যদের ইনপুটের উপর ভিত্তি করে কোন অ্যাক্সেস পয়েন্টটি গ্রহণ করবে তা বেছে নেয়।

Android 11 (API স্তর 30) এবং উচ্চতর:

  • একটি PasspointConfiguration ব্যবস্থা করা পরামর্শ API দ্বারা সমর্থিত। অ্যান্ড্রয়েড 11-এর আগে, একটি PasspointConfiguration ব্যবস্থা করার জন্য addOrUpdatePasspointConfiguration() API ব্যবহার করা প্রয়োজন।
  • ফ্রেমওয়ার্ক টিএলএস-ভিত্তিক এন্টারপ্রাইজ পরামর্শের (EAP-TLS, EAP-TTLS, এবং EAP-PEAP) নিরাপত্তার প্রয়োজনীয়তা প্রয়োগ করে; এই জাতীয় নেটওয়ার্কগুলির পরামর্শের জন্য অবশ্যই একটি Root CA certificate এবং একটি server domain name সেট করতে হবে৷
  • ফ্রেমওয়ার্ক EAP-SIM ভিত্তিক এন্টারপ্রাইজ পরামর্শের জন্য মালিকানার প্রয়োজনীয়তা প্রয়োগ করে (EAP-SIM, EAP-AKA, EAP-AKA-PRIME); এই ধরনের পরামর্শ শুধুমাত্র ক্যারিয়ার-স্বাক্ষরিত অ্যাপ দ্বারা অনুমোদিত।
  • একটি ক্যারিয়ার-স্বাক্ষরিত অ্যাপ দ্বারা প্রদত্ত পরামর্শের জন্য, ফ্রেমওয়ার্ক স্বয়ংক্রিয়ভাবে তাদের অ্যাপের ক্যারিয়ার সাইনিংয়ের সাথে সম্পর্কিত একটি ক্যারিয়ার আইডি বরাদ্দ করে৷ ডিভাইস থেকে সংশ্লিষ্ট সিম সরানো হলে এই ধরনের পরামর্শ স্বয়ংক্রিয়ভাবে অক্ষম হয়ে যায়।

Android 12 (API লেভেল 31) এবং উচ্চতর:

  • অতিরিক্ত গোপনীয়তা অ-স্থির MAC র্যান্ডমাইজেশনের মাধ্যমে সক্ষম করা যেতে পারে, যা পর্যায়ক্রমে এলোমেলো MAC ঠিকানাকে পুনরায় র্যান্ডমাইজ করে। আপনার নেটওয়ার্কের জন্য র্যান্ডমাইজেশনের স্তর নির্দিষ্ট করতে setMacRandomizationSetting ব্যবহার করুন।

  • isPasspointTermsAndConditionsSupported() : শর্তাবলী হল একটি পাসপয়েন্ট বৈশিষ্ট্য যা নেটওয়ার্ক স্থাপনাগুলিকে একটি নিরাপদ পাসপয়েন্ট নেটওয়ার্কের সাথে ওপেন নেটওয়ার্ক ব্যবহার করে এমন নিরাপদ ক্যাপটিভ পোর্টালগুলি প্রতিস্থাপন করতে দেয়। শর্তাবলী গ্রহণ করার প্রয়োজন হলে ব্যবহারকারীর কাছে একটি বিজ্ঞপ্তি প্রদর্শিত হয়। শর্তাবলী দ্বারা গেট করা পাসপয়েন্ট নেটওয়ার্কের পরামর্শ দেয় এমন অ্যাপগুলিকে ডিভাইসটি সক্ষমতা সমর্থন করে কিনা তা নিশ্চিত করতে প্রথমে এই API কল করতে হবে। ডিভাইসটি সক্ষমতা সমর্থন না করলে, এটি এই নেটওয়ার্কের সাথে সংযোগ করতে সক্ষম হবে না এবং একটি বিকল্প বা উত্তরাধিকারী নেটওয়ার্কের পরামর্শ দেওয়া আবশ্যক৷

  • isDecoratedIdentitySupported() : একটি উপসর্গ সজ্জা সহ নেটওয়ার্কগুলিতে প্রমাণীকরণ করার সময়, সজ্জিত পরিচয় উপসর্গ নেটওয়ার্ক অপারেটরদের নেটওয়ার্ক অ্যাক্সেস আইডেন্টিফায়ার (NAI) আপডেট করার অনুমতি দেয় একটি AAA নেটওয়ার্কের ভিতরে একাধিক প্রক্সির মাধ্যমে সুস্পষ্ট রাউটিং করতে (এ বিষয়ে আরও জানতে RFC 7542 দেখুন) .

    Android 12 PPS-MO এক্সটেনশনের জন্য WBA স্পেসিফিকেশনের সাথে সামঞ্জস্য করতে এই বৈশিষ্ট্যটি প্রয়োগ করে। যে অ্যাপগুলি পাসপয়েন্ট নেটওয়ার্কগুলির পরামর্শ দেয় যেগুলির জন্য একটি সজ্জিত পরিচয়ের প্রয়োজন হয় সেগুলিকে ডিভাইসটি সক্ষমতা সমর্থন করে তা নিশ্চিত করতে প্রথমে এই APIটি কল করতে হবে৷ ডিভাইসটি সক্ষমতা সমর্থন না করলে, পরিচয়টি সজ্জিত হবে না এবং নেটওয়ার্কে প্রমাণীকরণ ব্যর্থ হতে পারে।

একটি পাসপয়েন্ট পরামর্শ তৈরি করতে, অ্যাপগুলিকে অবশ্যই PasspointConfiguration , Credential এবং HomeSp ক্লাসগুলি ব্যবহার করতে হবে৷ এই ক্লাসগুলি পাসপয়েন্ট প্রোফাইল বর্ণনা করে, যা Wi-Fi অ্যালায়েন্স পাসপয়েন্ট স্পেসিফিকেশনে সংজ্ঞায়িত করা হয়েছে।

নিম্নলিখিত কোড নমুনা দেখায় কিভাবে একটি খোলা, একটি WPA2, একটি WPA3 নেটওয়ার্ক এবং একটি পাসপয়েন্ট নেটওয়ার্কের জন্য শংসাপত্র প্রদান করতে হয়:

কোটলিন

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

জাভা

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 এর সংস্করণের উপর নির্ভর করে:

  • অ্যান্ড্রয়েড 11 (এপিআই লেভেল 30) এবং তার উপরে, ব্যবহারকারী অ্যাপটি ফোরগ্রাউন্ডে চললে একটি ডায়ালগ এবং অ্যাপটি ব্যাকগ্রাউন্ডে চললে একটি বিজ্ঞপ্তি দেখতে পায়।
  • অ্যান্ড্রয়েড 10 (এপিআই লেভেল 29) এ, অ্যাপটি অগ্রভাগে বা পটভূমিতে চলছে কিনা তা বিবেচনা না করে ব্যবহারকারী একটি বিজ্ঞপ্তি দেখতে পান।

যখন প্ল্যাটফর্মটি নেটওয়ার্ক পরামর্শগুলির একটির সাথে সংযোগ করে, তখন সেটিংস টেক্সট দেখায় যা সংশ্লিষ্ট পরামর্শদাতা অ্যাপের সাথে নেটওয়ার্ক সংযোগকে দায়ী করে।

ব্যবহারকারী সংযোগ বিচ্ছিন্ন হ্যান্ডলিং

ব্যবহারকারী যদি Wi-Fi বাছাইকারী ব্যবহার করে এটির সাথে সংযুক্ত থাকাকালীন নেটওয়ার্ক প্রস্তাবনাগুলির একটি থেকে স্পষ্টভাবে সংযোগ বিচ্ছিন্ন করতে, তাহলে সেই নেটওয়ার্কটি এখনও পরিসরে থাকা অবস্থায় উপেক্ষা করা হয়৷ এই সময়ের মধ্যে, সেই নেটওয়ার্কটিকে স্বয়ংক্রিয়-সংযোগের জন্য বিবেচনা করা হবে না, এমনকি যদি অ্যাপটি নেটওয়ার্কের সাথে সম্পর্কিত নেটওয়ার্ক প্রস্তাবনাটিকে সরিয়ে দেয় এবং পুনরায় যোগ করে। ব্যবহারকারী যদি পূর্বে সংযোগ বিচ্ছিন্ন করা একটি নেটওয়ার্কে স্পষ্টভাবে সংযোগ করতে Wi-Fi পিকার ব্যবহার করে, তাহলে সেই নেটওয়ার্কটি অবিলম্বে স্বয়ংক্রিয় সংযোগের জন্য বিবেচিত হবে৷

অ্যাপের অনুমোদনের স্থিতি পরিবর্তন করা হচ্ছে

নেটওয়ার্ক সাজেশন বিজ্ঞপ্তি প্রত্যাখ্যান করা একজন ব্যবহারকারী অ্যাপ থেকে CHANGE_WIFI_STATE অনুমতি সরিয়ে দেয়। ব্যবহারকারী পরে ওয়াই-ফাই কন্ট্রোল মেনুতে গিয়ে ( সেটিংস > অ্যাপস এবং বিজ্ঞপ্তি > বিশেষ অ্যাপ অ্যাক্সেস > ওয়াই-ফাই কন্ট্রোল > App name ) এই অনুমোদন দিতে পারেন।

,

Android 10 (API লেভেল 29) এবং উচ্চতর চলমান ডিভাইসগুলি আপনার অ্যাপকে একটি Wi-Fi অ্যাক্সেস পয়েন্টে স্বয়ংক্রিয়ভাবে সংযোগ করার জন্য একটি ডিভাইসের জন্য নেটওয়ার্ক শংসাপত্র যোগ করার অনুমতি দেয়। আপনি WifiNetworkSuggestion ব্যবহার করে কোন নেটওয়ার্কে সংযোগ করতে হবে তার জন্য পরামর্শ সরবরাহ করতে পারেন৷ প্ল্যাটফর্মটি শেষ পর্যন্ত আপনার অ্যাপ এবং অন্যদের ইনপুটের উপর ভিত্তি করে কোন অ্যাক্সেস পয়েন্টটি গ্রহণ করবে তা বেছে নেয়।

Android 11 (API স্তর 30) এবং উচ্চতর:

  • একটি PasspointConfiguration ব্যবস্থা করা পরামর্শ API দ্বারা সমর্থিত। অ্যান্ড্রয়েড 11-এর আগে, একটি PasspointConfiguration ব্যবস্থা করার জন্য addOrUpdatePasspointConfiguration() API ব্যবহার করা প্রয়োজন।
  • ফ্রেমওয়ার্ক টিএলএস-ভিত্তিক এন্টারপ্রাইজ পরামর্শের (EAP-TLS, EAP-TTLS, এবং EAP-PEAP) নিরাপত্তার প্রয়োজনীয়তা প্রয়োগ করে; এই জাতীয় নেটওয়ার্কগুলির পরামর্শের জন্য অবশ্যই একটি Root CA certificate এবং একটি server domain name সেট করতে হবে৷
  • ফ্রেমওয়ার্ক EAP-SIM ভিত্তিক এন্টারপ্রাইজ পরামর্শের জন্য মালিকানার প্রয়োজনীয়তা প্রয়োগ করে (EAP-SIM, EAP-AKA, EAP-AKA-PRIME); এই ধরনের পরামর্শ শুধুমাত্র ক্যারিয়ার-স্বাক্ষরিত অ্যাপ দ্বারা অনুমোদিত।
  • একটি ক্যারিয়ার-স্বাক্ষরিত অ্যাপ দ্বারা প্রদত্ত পরামর্শের জন্য, ফ্রেমওয়ার্ক স্বয়ংক্রিয়ভাবে তাদের অ্যাপের ক্যারিয়ার সাইনিংয়ের সাথে সম্পর্কিত একটি ক্যারিয়ার আইডি বরাদ্দ করে৷ ডিভাইস থেকে সংশ্লিষ্ট সিম সরানো হলে এই ধরনের পরামর্শ স্বয়ংক্রিয়ভাবে অক্ষম হয়ে যায়।

Android 12 (API লেভেল 31) এবং উচ্চতর:

  • অতিরিক্ত গোপনীয়তা অ-স্থির MAC র্যান্ডমাইজেশনের মাধ্যমে সক্ষম করা যেতে পারে, যা পর্যায়ক্রমে এলোমেলো MAC ঠিকানাকে পুনরায় র্যান্ডমাইজ করে। আপনার নেটওয়ার্কের জন্য র্যান্ডমাইজেশনের স্তর নির্দিষ্ট করতে setMacRandomizationSetting ব্যবহার করুন।

  • isPasspointTermsAndConditionsSupported() : শর্তাবলী হল একটি পাসপয়েন্ট বৈশিষ্ট্য যা নেটওয়ার্ক স্থাপনাগুলিকে একটি নিরাপদ পাসপয়েন্ট নেটওয়ার্কের সাথে ওপেন নেটওয়ার্ক ব্যবহার করে এমন নিরাপদ ক্যাপটিভ পোর্টালগুলি প্রতিস্থাপন করতে দেয়। শর্তাবলী গ্রহণ করার প্রয়োজন হলে ব্যবহারকারীর কাছে একটি বিজ্ঞপ্তি প্রদর্শিত হয়। শর্তাবলী দ্বারা গেট করা পাসপয়েন্ট নেটওয়ার্কের পরামর্শ দেয় এমন অ্যাপগুলিকে ডিভাইসটি সক্ষমতা সমর্থন করে কিনা তা নিশ্চিত করতে প্রথমে এই API কল করতে হবে। ডিভাইসটি সক্ষমতা সমর্থন না করলে, এটি এই নেটওয়ার্কের সাথে সংযোগ করতে সক্ষম হবে না এবং একটি বিকল্প বা উত্তরাধিকারী নেটওয়ার্কের পরামর্শ দেওয়া আবশ্যক৷

  • isDecoratedIdentitySupported() : একটি উপসর্গ সজ্জা সহ নেটওয়ার্কগুলিতে প্রমাণীকরণ করার সময়, সজ্জিত পরিচয় উপসর্গ নেটওয়ার্ক অপারেটরদের নেটওয়ার্ক অ্যাক্সেস আইডেন্টিফায়ার (NAI) আপডেট করার অনুমতি দেয় একটি AAA নেটওয়ার্কের ভিতরে একাধিক প্রক্সির মাধ্যমে সুস্পষ্ট রাউটিং করতে (এ বিষয়ে আরও জানতে RFC 7542 দেখুন) .

    Android 12 PPS-MO এক্সটেনশনের জন্য WBA স্পেসিফিকেশনের সাথে সামঞ্জস্য করতে এই বৈশিষ্ট্যটি প্রয়োগ করে। যে অ্যাপগুলি পাসপয়েন্ট নেটওয়ার্কগুলির পরামর্শ দেয় যেগুলির জন্য একটি সজ্জিত পরিচয়ের প্রয়োজন হয় সেগুলিকে ডিভাইসটি সক্ষমতা সমর্থন করে তা নিশ্চিত করতে প্রথমে এই APIটি কল করতে হবে৷ ডিভাইসটি সক্ষমতা সমর্থন না করলে, পরিচয়টি সজ্জিত হবে না এবং নেটওয়ার্কে প্রমাণীকরণ ব্যর্থ হতে পারে।

একটি পাসপয়েন্ট পরামর্শ তৈরি করতে, অ্যাপগুলিকে অবশ্যই PasspointConfiguration , Credential এবং HomeSp ক্লাসগুলি ব্যবহার করতে হবে৷ এই ক্লাসগুলি পাসপয়েন্ট প্রোফাইল বর্ণনা করে, যা Wi-Fi অ্যালায়েন্স পাসপয়েন্ট স্পেসিফিকেশনে সংজ্ঞায়িত করা হয়েছে।

নিম্নলিখিত কোড নমুনা দেখায় কিভাবে একটি খোলা, একটি WPA2, একটি WPA3 নেটওয়ার্ক এবং একটি পাসপয়েন্ট নেটওয়ার্কের জন্য শংসাপত্র প্রদান করতে হয়:

কোটলিন

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

জাভা

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 এর সংস্করণের উপর নির্ভর করে:

  • অ্যান্ড্রয়েড 11 (এপিআই লেভেল 30) এবং তার উপরে, ব্যবহারকারী অ্যাপটি ফোরগ্রাউন্ডে চললে একটি ডায়ালগ এবং অ্যাপটি ব্যাকগ্রাউন্ডে চললে একটি বিজ্ঞপ্তি দেখতে পায়।
  • অ্যান্ড্রয়েড 10 (এপিআই লেভেল 29) এ, অ্যাপটি অগ্রভাগে বা পটভূমিতে চলছে কিনা তা বিবেচনা না করে ব্যবহারকারী একটি বিজ্ঞপ্তি দেখতে পান।

যখন প্ল্যাটফর্মটি নেটওয়ার্ক পরামর্শগুলির একটির সাথে সংযোগ করে, তখন সেটিংস টেক্সট দেখায় যা সংশ্লিষ্ট পরামর্শদাতা অ্যাপের সাথে নেটওয়ার্ক সংযোগকে দায়ী করে।

ব্যবহারকারী সংযোগ বিচ্ছিন্ন হ্যান্ডলিং

ব্যবহারকারী যদি Wi-Fi বাছাইকারী ব্যবহার করে এটির সাথে সংযুক্ত থাকাকালীন নেটওয়ার্ক প্রস্তাবনাগুলির একটি থেকে স্পষ্টভাবে সংযোগ বিচ্ছিন্ন করতে, তাহলে সেই নেটওয়ার্কটি এখনও পরিসরে থাকা অবস্থায় উপেক্ষা করা হয়৷ এই সময়ের মধ্যে, সেই নেটওয়ার্কটিকে স্বয়ংক্রিয়-সংযোগের জন্য বিবেচনা করা হবে না, এমনকি যদি অ্যাপটি নেটওয়ার্কের সাথে সম্পর্কিত নেটওয়ার্ক প্রস্তাবনাটিকে সরিয়ে দেয় এবং পুনরায় যোগ করে। ব্যবহারকারী যদি পূর্বে সংযোগ বিচ্ছিন্ন করা একটি নেটওয়ার্কে স্পষ্টভাবে সংযোগ করতে Wi-Fi পিকার ব্যবহার করে, তাহলে সেই নেটওয়ার্কটি অবিলম্বে স্বয়ংক্রিয় সংযোগের জন্য বিবেচিত হবে৷

অ্যাপের অনুমোদনের স্থিতি পরিবর্তন করা হচ্ছে

নেটওয়ার্ক সাজেশন বিজ্ঞপ্তি প্রত্যাখ্যান করা একজন ব্যবহারকারী অ্যাপ থেকে CHANGE_WIFI_STATE অনুমতি সরিয়ে দেয়। ব্যবহারকারী পরে ওয়াই-ফাই কন্ট্রোল মেনুতে গিয়ে ( সেটিংস > অ্যাপস এবং বিজ্ঞপ্তি > বিশেষ অ্যাপ অ্যাক্সেস > ওয়াই-ফাই কন্ট্রোল > App name ) এই অনুমোদন দিতে পারেন।