در Android 10 (سطح API 29) و دستگاههای بالاتر، میتوانید از یک 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()
بر روی شئ callback فراخوانی می شود. اگر کاربر درخواست را رد کند یا اتصال به شبکه ناموفق باشد،NetworkCallback.onUnavailable()
بر روی شئ callback فراخوانی می شود.
با شروع درخواست برای اتصال به یک دستگاه همتا، یک کادر محاوره ای در همان دستگاه راه اندازی می شود که کاربر آن دستگاه می تواند درخواست اتصال را بپذیرد.
دور زدن تایید کاربر
هنگامی که کاربر شبکه ای را برای اتصال به آن در پاسخ به درخواست یک برنامه خاص تأیید کرد، دستگاه تأییدیه نقطه دسترسی خاص را ذخیره می کند. اگر برنامه درخواست خاصی برای اتصال دوباره به آن نقطه دسترسی داشته باشد، دستگاه از مرحله تایید کاربر می گذرد و به طور خودکار به شبکه متصل می شود. اگر کاربر هنگام اتصال به شبکهای که توسط API درخواست میشود، انتخاب کند که شبکه را فراموش کند، این تأییدیه ذخیره شده برای آن ترکیب برنامه و شبکه حذف میشود و هر درخواست بعدی از برنامه باید دوباره توسط کاربر تأیید شود. اگر برنامه درخواستی غیر اختصاصی، مانند الگوی SSID یا BSSID ارائه دهد، کاربر باید درخواست را تأیید کند.
نمونه کد
نمونه کد زیر نحوه اتصال به یک شبکه باز با پیشوند SSID "test"
و BSSID OUI "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);