در دستگاههای اندروید ۱۰ (API سطح ۲۹) و بالاتر، میتوانید از یک API جدید نظیر به نظیر برای پیکربندی بوتاسترپ دستگاههای ثانویه مانند Chromecast و سختافزار Google Home استفاده کنید. این ویژگی به برنامه شما این امکان را میدهد که با استفاده از WifiNetworkSpecifier برای توصیف ویژگیهای شبکه درخواستی، از کاربر بخواهد نقطه دسترسی که دستگاه به آن متصل است را تغییر دهد.
برای استفاده از این API، مراحل زیر را انجام دهید:
با استفاده از
WifiNetworkSpecifier.Builderیک مشخصکننده شبکه وایفای ایجاد کنید.یک فیلتر شبکه تنظیم کنید تا با شبکههایی که میخواهید به آنها متصل شوید، به همراه اطلاعات احراز هویت مورد نیاز، مطابقت داشته باشد.
با توجه به الزامات زیر، ترکیبی از
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 برابر با "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);