web-dev-qa-db-ja.com

WifiNetworkSpecifierはユーザー選択をバイパスします

ドキュメントに記載されているように、WiFiピアツーピアネットワークを実装しようとしています:

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

アプリの将来を保証するためにこれを行っています。古いバージョンのアプリは、大したことなしにWifiネットワークを追加しただけですが、現在非推奨になっているので、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);
                    }
                });

            }
        }

これは実際に期待どおりに機能し、利用可能なネットワークのダイアログをユーザーに表示し、ユーザーはそれを選択できます。その後、コールバックを取得し、必要に応じてネットワークにアクセスします。フォアグラウンドサービスが停止するとすぐに、WiFi接続が切断され、まさにそれが必要とされます。

ただし、次回接続しようとすると、同じウィンドウが表示され、ユーザーにネットワークの選択を求めますが、ここにあるドキュメントに基づいています https://developer.Android.com/guide/topics/connectivity/ wifi-bootstrap#bypass-approval 接続中のネットワークを忘れず、BSSIDまたはSSIDのパターンを使用していなければ、これを記憶し、ユーザーの承認をバイパスする必要があります。何が欠けているのですか、なぜユーザー承認ウィンドウが表示され続けるのですか?

アクティビティ/サービスに限定されているのではないかと思ったのですが、アクティビティから呼び出しても同じ動作が発生します。

4
Emil Borconi

問題、問題が見つかりました。私の英語かもしれないし、はっきりしないドキュメントかもしれない。

アプリがSSIDやBSSIDパターンなどの非特定のリクエストを行う場合、ユーザーはリクエストを承認する必要があります。

つまり、SSIDとBSSIDの両方を設定する必要があります。 BSSIDを設定しないことは、BSSIDパターンを設定することと同じです。 NetworkRequestビルダーにログインしたときにこれに気付きました。アプリを自動的にネットワークに再接続させるには、SSIDとBSSIDの両方の値も設定する必要があります。

1
Emil Borconi