على أجهزة Android 10 (مستوى واجهة برمجة التطبيقات 29) والإصدارات الأحدث، يمكنك استخدام واجهة برمجة تطبيقات جديدة من نظير إلى نظير لتهيئة إعدادات الأجهزة الثانوية، مثل أجهزة Chromecast وأجهزة Google Home. تتيح هذه الميزة لتطبيقك مطالبة المستخدم بتغيير نقطة الوصول التي يتصل بها الجهاز باستخدام
WifiNetworkSpecifier
لوصف خصائص الشبكة المطلوبة.
لاستخدام واجهة برمجة التطبيقات هذه، اتّبِع الخطوات التالية:
أنشئ أداة تحديد شبكة Wi-Fi باستخدام
WifiNetworkSpecifier.Builder.اضبط فلتر شبكة لمطابقة الشبكات التي تريد الاتصال بها، بالإضافة إلى بيانات الاعتماد المطلوبة.
حدِّد مجموعة من
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 OUI هو "10:03:23":
Kotlin
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)
Java
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);