در دستگاههای دارای Android 10 (سطح API ۲۹) و بالاتر، میتوانید از میانای برنامهسازی کاربردی همتا به همتا برای راهاندازی پیکربندی دستگاههای ثانویه مثل Chromecast و سختافزار Google Home استفاده کنید. این ویژگی به برنامه شما امکان میدهد تا بااستفاده از
WifiNetworkSpecifier
برای توصیف ویژگیهای شبکه درخواستشده، از کاربر بخواهد نقطه دسترسیای را که دستگاه به آن متصل است تغییر دهد.
برای استفاده از این API، کارهای زیر را انجام دهید:
بااستفاده از
WifiNetworkSpecifier.Builder، مشخصکننده شبکه Wi-Fi ایجاد کنید.فیلتر شبکهای تنظیم کنید تا شبکههایی را که باید به آنها متصل شوید، بههمراه اعتبارنامههای لازم، مطابقت دهد.
درباره ترکیبی از
SSID،SSID pattern،BSSID، وBSSID patternتصمیم بگیرید تا فیلتر شبکه را در هر درخواست تنظیم کنید، مشروط به الزامات زیر:- هر درخواست باید حداقل یکی از
SSID،SSID pattern،BSSID، یاBSSID patternرا ارائه دهد - هر درخواست فقط میتواند یکی از
SSIDیاSSID patternرا تنظیم کند - هر درخواست فقط میتواند یکی از
BSSIDیاBSSID patternرا تنظیم کند
- هر درخواست باید حداقل یکی از
مشخصکنندهها را بههمراه نمونه
NetworkCallbackبه درخواست شبکه اضافه کنید تا وضعیت درخواست را پیگیری کنید.اگر کاربر درخواست را بپذیرد و اتصال به شبکه موفقیتآمیز باشد،
NetworkCallback.onAvailable()در شیء بازگشت تماس فراخوانی میشود. اگر کاربر درخواست را رد کند یا اگر اتصال به شبکه ناموفق باشد،NetworkCallback.onUnavailable()در شیء فراخوانی برگشتی فراخوانده میشود.
با شروع درخواست اتصال به دستگاه همتا، چارگوش گفتگویی در همان دستگاه راهاندازی میشود که کاربر آن دستگاه میتواند درخواست اتصال را ازطریق آن بپذیرد.
دور زدن تأیید کاربر
وقتی کاربر در پاسخ به درخواست برنامهای خاص، اتصال به شبکهای را تأیید میکند، دستگاه این تأیید را برای آن نقطه دسترسی خاص ذخیره میکند. اگر برنامه درخواست خاصی برای اتصال مجدد به آن نقطه دسترسی ارائه دهد، دستگاه مرحله تأیید کاربر را رد میکند و بهطور خودکار به شبکه متصل میشود. اگر کاربر انتخاب کند که شبکه را درحین اتصال به شبکه درخواستشده توسط میانای برنامهسازی کاربردی فراموش کند، این تأیید ذخیرهشده برای آن ترکیب برنامه و شبکه برداشته میشود و هرگونه درخواست آتی از برنامه باید دوباره توسط کاربر تأیید شود. اگر برنامه درخواست غیرخاصی ارائه دهد، مثلاً با الگوی SSID یا BSSID، دراینصورت کاربر باید درخواست را تأیید کند.
نمونه کد
نمونه کد زیر نحوه اتصال به شبکه باز با پیشوند SSID "test" و شناسه یکتای سازمانی BSSID "10:03:23" را نشان میدهد:
کاتلین
val specifier = WifiNetworkSpecifier.Builder() .setSsidPattern(PatternMatcher("test", PatternMatcher.PATTERN_PREFIX)) .setBssidPattern(MacAddress.fromString("10:03:23:00:00:00"), MacAddress.fromString("ff:ff:ff:00:00:00")) .build() val request = NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .setNetworkSpecifier(specifier) .build() val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val networkCallback = object : ConnectivityManager.NetworkCallback() { ... override fun onAvailable(network: Network?) { // do success processing here.. } override fun onUnavailable() { // do failure processing here.. } ... } connectivityManager.requestNetwork(request, networkCallback) ... // Release the request when done. connectivityManager.unregisterNetworkCallback(networkCallback)
جاوا
final NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder() .setSsidPattern(new PatternMatcher("test", PatternMatcher.PATTERN_PREFIX)) .setBssidPattern(MacAddress.fromString("10:03:23:00:00:00"), MacAddress.fromString("ff:ff:ff:00:00:00")) .build(); final NetworkRequest request = new NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .setNetworkSpecifier(specifier) .build(); final ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); final NetworkCallback networkCallback = new NetworkCallback() { ... @Override void onAvailable(...) { // do success processing here.. } @Override void onUnavailable(...) { // do failure processing here.. } ... }; connectivityManager.requestNetwork(request, networkCallback); ... // Release the request when done. connectivityManager.unregisterNetworkCallback(networkCallback);