على الأجهزة التي تعمل بنظام التشغيل 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" ومعرّف OUI لعنوان BSSID بقيمة "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);