【发布时间】:2020-06-01 00:42:06
【问题描述】:
用例:成功连接到其他指定的 Wi-fi 网络并断开与现有 Wi-fi 网络的连接。
我尝试使用 WifiNetworkSpecifier 和 WifiNetworkSuggestion 在 Android 中以编程方式连接到其他 Wi-fi。当我尝试使用 WifiNetworkSpecifier 时,我可以看到要求用户连接到指定网络的对话框。但是,在单击连接后,当我关闭/终止我的应用程序时,我无法访问互联网并且断开连接 Wi-fi 网络。而 WifiNetworkSuggestion 不适用于以下代码(已获得位置许可)。
用于WifiNetworkSpecifier的代码:
WifiNetworkSpecifier.Builder builder = new WifiNetworkSpecifier.Builder();
builder.setSsid(MY_SSID);
builder.setWpa2Passphrase(MY_PASSWORD);
WifiNetworkSpecifier wifiNetworkSpecifier = builder.build();
NetworkRequest.Builder networkRequestBuilder1 = new NetworkRequest.Builder();
networkRequestBuilder1.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
networkRequestBuilder1.setNetworkSpecifier(wifiNetworkSpecifier);
}
NetworkRequest networkRequest = networkRequestBuilder1.build();
ConnectivityManager cm = (ConnectivityManager)
getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
ConnectivityManager.NetworkCallback networkCallback = new
ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
super.onAvailable(network);
Log.d(TAG, "onAvailable:" + network);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
cm.bindProcessToNetwork(network);
}
}
};
cm.requestNetwork(networkRequest, networkCallback);
用于 WifiNetworkSuggestion 的代码(我认为对于我的用例,我需要根据 android 文档使用这个):
WifiNetworkSuggestion suggestion1 = new WifiNetworkSuggestion.Builder()
.setSsid(MY_SSID)
.setWpa2Passphrase(MY_PASSWORD)
.setIsAppInteractionRequired(true) // Optional (Needs location permission)
.build();
List<WifiNetworkSuggestion> suggestionsList = new ArrayList<WifiNetworkSuggestion>();
suggestionsList.add(suggestion1);
int status = wifiManager.addNetworkSuggestions(suggestionsList);
if (status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) {
showToast("Failure");
} else {
showToast("Success");
}
final IntentFilter intentFilter = new IntentFilter(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION);
final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (!intent.getAction().equals(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION)) {
return;
}
// Post connection
showToast("post connection");
}
};
getApplicationContext().registerReceiver(broadcastReceiver, intentFilter);
使用的权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
非常感谢任何建议或帮助。谢谢!
【问题讨论】:
标签: android android-wifi android-9.0-pie android-10.0 wifimanager