WifiNetworkSpecifier 绕过用户选择

WifiNetworkSpecifier bypass user selection

我正在尝试按照文档中的描述实现 WiFi 对等网络:

https://developer.android.com/guide/topics/connectivity/wifi-bootstrap

我这样做是为了让应用程序面向未来,旧版本的应用程序只是简单地添加了一个 Wifinetwork,没什么大不了的,但现在已被弃用,所以我正在尝试对设备使用新方法 运行 Android 10.

这是我的代码(从前台服务调用):

 if (Build.VERSION.SDK_INT == Build.VERSION_CODES.Q) {
            WifiNetworkSpecifier.Builder builder = new WifiNetworkSpecifier.Builder();

            builder.setBssid(MacAddress.fromString("00:08:22:C0:9F:4A"));
            builder.setWpa2Passphrase("password");

            WifiNetworkSpecifier wifiNetworkSpecifier = builder.build();
            NetworkRequest.Builder networkRequestBuilder = new NetworkRequest.Builder();
            networkRequestBuilder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
            networkRequestBuilder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
            networkRequestBuilder.addCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED);
            networkRequestBuilder.setNetworkSpecifier(wifiNetworkSpecifier);

            NetworkRequest networkRequest = networkRequestBuilder.build();
            final ConnectivityManager cm = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
            if (cm != null) {
                cm.requestNetwork(networkRequest, new ConnectivityManager.NetworkCallback() {
                    @Override
                    public void onAvailable(@NonNull Network network) {
                        //Use this network object to Send request.
                        //eg - Using OkHttp library to create a service request
                        InetAddress server = cm.getLinkProperties(network).getDnsServers().get(0);
                        Log.d(TAG,"Got the following address: "+server.getHostAddress());



                        super.onAvailable(network);
                    }
                });

            }
        }

这确实按预期工作,它确实向用户显示了一个可用网络的对话框,用户可以 select 它,然后我得到一个回调,并根据需要访问网络。 一旦我的前台服务停止,WiFi 连接就会被断开,这正是它所需要的。

然而,下次我尝试连接时,我得到相同的 window 要求用户 select 网络,但根据此处的文档:https://developer.android.com/guide/topics/connectivity/wifi-bootstrap#bypass-approval 只要因为我在连接到网络时没有忘记网络并且没有使用 BSSID 或 SSID 模式,所以应该记住这一点并且应该绕过用户批准。 我错过了什么,为什么我一直得到用户的认可window?

我认为它可能仅限于 Activity/Service,但即使我从 Activity.

调用它,我也会遇到相同的行为

发现问题,问题。可能是我的英语,也可能是不明显的文档。

If the app makes a non-specific request, such as with an SSID or BSSID pattern, then the user must approve the request.

这意味着必须同时设置SSID和BSSID。不设置 BSSID 等同于设置 BSSID 模式。当我登录 NetworkRequest 构建器时,我意识到了这一点。 为了让应用程序自动重新连接到网络,您还需要同时设置值 SSID 和 BSSID。