ドキュメントに記載されているように、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のパターンを使用していなければ、これを記憶し、ユーザーの承認をバイパスする必要があります。何が欠けているのですか、なぜユーザー承認ウィンドウが表示され続けるのですか?
アクティビティ/サービスに限定されているのではないかと思ったのですが、アクティビティから呼び出しても同じ動作が発生します。
問題、問題が見つかりました。私の英語かもしれないし、はっきりしないドキュメントかもしれない。
アプリがSSIDやBSSIDパターンなどの非特定のリクエストを行う場合、ユーザーはリクエストを承認する必要があります。
つまり、SSIDとBSSIDの両方を設定する必要があります。 BSSIDを設定しないことは、BSSIDパターンを設定することと同じです。 NetworkRequestビルダーにログインしたときにこれに気付きました。アプリを自動的にネットワークに再接続させるには、SSIDとBSSIDの両方の値も設定する必要があります。