Android ১০ (API লেভেল ২৯) এবং তার পরবর্তী ভার্সনে চলা ডিভাইসে আপনার অ্যাপকে নেটওয়ার্কের ক্রেডেনশিয়াল যোগ করার অনুমতি দেয় যাতে ডিভাইসটি ওয়াই-ফাই অ্যাক্সেস পয়েন্টের সাথে অটোমেটিক কানেক্ট হতে পারে। WifiNetworkSuggestion ব্যবহার করে কোন নেটওয়ার্কে কানেক্ট করতে হবে সেই সম্পর্কে আপনি সাজেশন দিতে পারেন।
আপনার অ্যাপ ও অন্যান্য সোর্স থেকে পাওয়া ইনপুটের ভিত্তিতে প্ল্যাটফর্ম শেষ পর্যন্ত বেছে নেয় যে কোন অ্যাক্সেস পয়েন্ট গ্রহণ করা হবে।
Android 11 (API লেভেল ৩০) এবং তার পরবর্তী যেকোনও ভার্সনে:
PasspointConfiguration-এর প্রভিশনিং সাজেশন API-এর মাধ্যমে করা যায়। Android 11-এর আগে,PasspointConfiguration-এর প্রভিশনিংয়ের জন্যaddOrUpdatePasspointConfiguration()API ব্যবহার করতে হয়।- ফ্রেমওয়ার্কটি TLS-ভিত্তিক এন্টারপ্রাইজ সাজেশন (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(): নিয়ম ও শর্তাবলী হল একটি Passpoint ফিচার যা নেটওয়ার্ক ডেপ্লয়মেন্টকে অসুরক্ষিত ক্যাপটিভ পোর্টাল, যা ওপেন নেটওয়ার্ক ব্যবহার করে, সেটিকে একটি সুরক্ষিত Passpoint নেটওয়ার্ক দিয়ে পরিবর্তন করার অনুমতি দেয়। নিয়ম ও শর্তাবলীতে সম্মতি জানানোর প্রয়োজন হলে, ব্যবহারকারীকে একটি বিজ্ঞপ্তি দেখানো হয়। যেসব অ্যাপ নিয়ম ও শর্তাবলী দ্বারা গেট করা পাসপয়েন্ট নেটওয়ার্কের সাজেশন দেয়, ডিভাইসটি এই ক্ষমতাকে সাপোর্ট করে কিনা তা নিশ্চিত করতে প্রথমে এই API-কে কল করতে হবে। ডিভাইসে এই ক্ষমতা না থাকলে, এটি এই নেটওয়ার্কে কানেক্ট করতে পারবে না এবং বিকল্প বা লিগ্যাসি নেটওয়ার্ক সাজেস্ট করতে হবে।isDecoratedIdentitySupported(): প্রিফিক্স ডেকোরেশন সহ নেটওয়ার্কে যাচাইকরণ করার সময়, ডেকোরেট করা আইডেন্টিটি প্রিফিক্স নেটওয়ার্ক অপারেটরকে নেটওয়ার্ক অ্যাক্সেস আইডেন্টিফায়ার (NAI) আপডেট করার অনুমতি দেয় যাতে AAA নেটওয়ার্কের মধ্যে একাধিক প্রক্সির মাধ্যমে এক্সপ্লিসিট রাউটিং করা যায় (এই বিষয়ে আরও জানতে RFC 7542 দেখুন)।PPS-MO এক্সটেনশনের জন্য WBA স্পেসিফিকেশন মেনে চলার জন্য Android 12 এই ফিচার প্রয়োগ করে। যেসব অ্যাপ পাসপয়েন্ট নেটওয়ার্ক সাজেস্ট করে এবং যেগুলির জন্য সাজানো পরিচয় প্রয়োজন, সেগুলিকে প্রথমে এই API কল করতে হবে যাতে ডিভাইসটি এই ক্ষমতা সমর্থন করে কিনা তা নিশ্চিত করা যায়। ডিভাইসে এই ক্ষমতা না থাকলে, পরিচয় ডেকোরেট করা হবে না এবং নেটওয়ার্কে যাচাইকরণ সম্পূর্ণ নাও হতে পারে।
পাসপয়েন্ট সাজেশন তৈরি করতে, অ্যাপকে অবশ্যই
PasspointConfiguration,
Credential এবং
HomeSp ক্লাস ব্যবহার করতে হবে। এই
ক্লাসগুলি পাসপয়েন্ট প্রোফাইল বর্ণনা করে, যা Wi-Fi Alliance
পাসপয়েন্ট
স্পেসিফিকেশনে সংজ্ঞায়িত করা হয়েছে।
নিম্নলিখিত কোড স্যাম্পেল থেকে জানা যায় যে কীভাবে একটি ওপেন, একটি WPA2, একটি WPA3 নেটওয়ার্ক এবং একটি পাসপয়েন্ট নেটওয়ার্কের জন্য ক্রেডেনশিয়াল প্রদান করতে হয়:
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);
জাভা
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 (API লেভেল 30) এবং এর পরবর্তী ভার্সনে, অ্যাপটি ফোরগ্রাউন্ডে চললে ব্যবহারকারী একটি ডায়ালগ দেখতে পান এবং অ্যাপটি ব্যাকগ্রাউন্ডে চললে একটি বিজ্ঞপ্তি দেখতে পান।
- Android 10 (API লেভেল ২৯)-এ, অ্যাপটি ফোরগ্রাউন্ডে বা ব্যাকগ্রাউন্ডে চলছে কিনা তা নির্বিশেষে ব্যবহারকারী একটি বিজ্ঞপ্তি দেখতে পান।
প্ল্যাটফর্মটি নেটওয়ার্ক সাজেশনগুলির একটির সাথে কানেক্ট হলে, সেটিংস এমন টেক্সট দেখায় যা নেটওয়ার্ক কানেকশনকে সংশ্লিষ্ট সাজেস্টার অ্যাপের সাথে অ্যাট্রিবিউট করে।
ব্যবহারকারীর ডিসকানেক্ট হওয়া ম্যানেজ করা
ব্যবহারকারী যদি ওয়াই-ফাই পিকার ব্যবহার করে নেটওয়ার্ক সাজেশন থেকে কোনও একটি নেটওয়ার্কের সাথে কানেক্ট করার পরে সেটি থেকে ডিসকানেক্ট করেন, তাহলে সেই নেটওয়ার্ক রেঞ্জের মধ্যে থাকলেও সেটিকে উপেক্ষা করা হয়। এই সময়সীমা চলাকালীন, অটোমেটিক কানেকশনের জন্য সেই নেটওয়ার্ক বিবেচনা করা হবে না, এমনকি অ্যাপটি নেটওয়ার্কের সাথে সম্পর্কিত নেটওয়ার্ক সাজেশন সরিয়ে দিয়ে আবার যোগ করলেও। ব্যবহারকারী যদি ওয়াই-ফাই পিকার ব্যবহার করে আগে ডিসকানেক্ট করা কোনও নেটওয়ার্কে কানেক্ট করেন, তাহলে সেই নেটওয়ার্কটি অটোমেটিক কানেকশনের জন্য অবিলম্বে বিবেচনা করা হবে।
অ্যাপের জন্য অনুমোদনের স্ট্যাটাস পরিবর্তন করা হচ্ছে
কোনও ব্যবহারকারী নেটওয়ার্ক সাজেশন সংক্রান্ত বিজ্ঞপ্তি প্রত্যাখ্যান করলে, অ্যাপ থেকে
CHANGE_WIFI_STATE অনুমতি সরিয়ে দেওয়া হয়। ব্যবহারকারী পরে ওয়াই-ফাই কন্ট্রোল মেনুতে (সেটিংস >
অ্যাপ ও বিজ্ঞপ্তি > বিশেষ অ্যাপ
অ্যাক্সেস > ওয়াই-ফাই কন্ট্রোল > App name) গিয়ে এই অনুমোদন দিতে পারবেন।