【发布时间】:2020-05-29 13:43:47
【问题描述】:
我正在尝试按照文档中的描述实现 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 的模式,应该记住这一点,并且应该绕过用户批准。 我错过了什么,为什么我一直得到用户批准窗口?
我认为这可能仅限于 Activity/Service,但即使我从 Activity 调用它,我也会遇到相同的行为。
【问题讨论】:
标签: android android-wifi