这是WifiManager.class中addNetwork方法的描述,注意注释中最后一行
{@link android.os.Build.VERSION_CODES#Q} or above, this API will always return {@code -1}.
android Q或者更高的版本,这个方法始终返回-1,至此问题原因分析完毕,接下来开始解决:官网一顿操作:Android 10 的新方案如下连接:https://developer.android.google.cn/guide/topics/connectivity/wifi-bootstrap
代码如下:
public void test() { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) { NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder() .setSsidPattern(new PatternMatcher("此处WiFi名称", PatternMatcher.PATTERN_PREFIX)) .setWpa2Passphrase("此处WiFi密码") .build(); NetworkRequest request = new NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .setNetworkSpecifier(specifier) .build(); ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(Network network) { // do success processing here.. } @Override public void onUnavailable() { // do failure processing here.. } }; connectivityManager.requestNetwork(request, networkCallback); // Release the request when done. // connectivityManager.unregisterNetworkCallback(networkCallback); } }注:我用的是WPA的 加密模式,亲测可用。至此完结,撒花。
更新说明:项目使用WiFi和设备传输数据,Android Q会在调用如下方法后弹出提示框,提示用户连接WiFi,如果用户连接成功,则会进入回调成功的方法中,如果用户取消或者连接失败,则会进入回调中的失败方法,里面的逻辑自行处理。
//Android 10 自动连接WiFi方案 public void testWifi(String ssid,String psw) { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) { NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder() .setSsidPattern(new PatternMatcher(ssid, PatternMatcher.PATTERN_PREFIX)) .setWpa2Passphrase(psw) .build(); NetworkRequest request = new NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .setNetworkSpecifier(specifier) .build(); ConnectivityManager connectivityManager = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); // WiFi连接回调 ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() { //WiFi连接成功 @Override public void onAvailable(Network network) { // do success processing here. //如果WiFi连接成功,下面的代码表示使用该wifi网络 connectivityManager.bindProcessToNetwork(network); } //WiFi连接失败 @Override public void onUnavailable() { // do failure processing here.. } }; connectivityManager.requestNetwork(request, networkCallback); } }1.如何使用已经连接的WiFi
在WiFi连接成功后一定要connectivityManager.bindProcessToNetwork(network);表示使用该wifi网络;
由于项目中仅仅是使用Wifi和设备间传输数据,传输数据完成后设备会关闭WiFi。
此时APP使用的依然是该WiFi网络;如果要断开该网络,仅仅使用wifiUtils.forgetNetwork()只是断开了WiFi,手机依然使用的是WiFi网络。
要不在使用该WiFi,则需要:connectivityManager.bindProcessToNetwork(null);表示不在使用该网络。
Android Q这边也是项目需求最近才在研究,大家可以互相探讨。大家可以借鉴。
2.Android 10以及以上如何断开WiFi
在升级完成之后,我们要断开与设备之间的WiFi连接
使用如下:
connectivityManager.unregisterNetworkCallback(networkCallback);注意上面为android 10 及以上的处理,android 10 以下需要判断
if(networkCallback != null){ connectivityManager.unregisterNetworkCallback(networkCallback);}