与 Android Q 一样,一些 WiFi API 受到限制。我正在尝试使用备用 API 连接到不同的 Wifi AP 以上网。
下面是我的代码:
WifiNetworkSpecifier.Builder builder = new WifiNetworkSpecifier.Builder();
builder.setSsid("wifi-ap-ssid");
builder.setWpa2Passphrase("wifi-ap-password");
WifiNetworkSpecifier wifiNetworkSpecifier = builder.build();
NetworkRequest.Builder networkRequestBuilder1 = new NetworkRequest.Builder();
networkRequestBuilder1.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
networkRequestBuilder1.setNetworkSpecifier(wifiNetworkSpecifier);
NetworkRequest nr = networkRequestBuilder1.build();
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
cm.requestNetwork(nr, callback);
这允许我连接,但 Internet 被禁用。这是按照 Android 文档中的定义工作的。
我尝试的替代方法如下:
WifiNetworkSuggestion.Builder wifiNetworkSuggestionBuilder1 = new WifiNetworkSuggestion.Builder();
wifiNetworkSuggestionBuilder1.setSsid("wifi-ap-ssid");
wifiNetworkSuggestionBuilder1.setWpa2Passphrase("wifi-ap-password");
WifiNetworkSuggestion wifiNetworkSuggestion = wifiNetworkSuggestionBuilder1.build();
List<WifiNetworkSuggestion> list = new ArrayList<>();
list.add(wifiNetworkSuggestion);
wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
wifiManager.removeNetworkSuggestions(new ArrayList<WifiNetworkSuggestion>());
wifiManager.addNetworkSuggestions(list);
在 list 中声明权限:
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
使用它不会改变任何行为。
请告知成功连接到具有互联网功能的不同 Wifi AP 的 API 序列。
最佳答案
尝试在 onAvailable() 回调中调用 bindProcessToNetwork() 以重新获得网络连接,对我来说效果很好。
连接到网络:
WifiNetworkSpecifier.Builder builder = new WifiNetworkSpecifier.Builder();
builder.setSsid("wifi-ap-ssid");
builder.setWpa2Passphrase("wifi-ap-password");
WifiNetworkSpecifier wifiNetworkSpecifier = builder.build();
NetworkRequest.Builder networkRequestBuilder1 = new NetworkRequest.Builder();
networkRequestBuilder1.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
networkRequestBuilder1.setNetworkSpecifier(wifiNetworkSpecifier);
NetworkRequest nr = networkRequestBuilder1.build();
ConnectivityManager cm = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
ConnectivityManager.NetworkCallback networkCallback = new
ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
super.onAvailable(network);
Log.d(TAG, "onAvailable:" + network);
cm.bindProcessToNetwork(network);
}
});
cm.requestNetwork(nr, networkCallback);
断开绑定(bind)网络:
cm.unregisterNetworkCallback(networkCallback);
关于Android Q,以编程方式连接到不同的 WiFi AP 以上网,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56831023/