Android 10自动连接WiFi问题 Android 10 断开WiFi问题 | 您所在的位置:网站首页 › 华为怎样让热点不自动关闭 › Android 10自动连接WiFi问题 Android 10 断开WiFi问题 |
说明:本文主要说明扫码之后自动连接WiFi的一些处理,扫码的流程相对简单,网上教程也比较多,对于目前Android各个版本也没有太多变化。问题描述:最近在做项目的时候,发现以前的项目有扫描二维码自动连接WiFi的功能,设备改了生成二维码的方式,然后发现手机无法自动连接WiFi了。问题原因:经过代码调试发现:(我都是真机调试) wifiManager.addNetwork(WifiConfiguration); 在添加WiFi的时候,这行代码始终返回-1,换用同事手机竟然神奇的可以连接,然后一脸蒙蔽,裂开了,不怕有问题,就怕有的有问题,有的没问题。问题解决:
区别:我测试手机 小米10 android Q(andorid 10)的系统,同事手机荣耀 android P的系统,大胆猜测是不是android 10又搞了什么奇怪的东西根因:皇天不负有心人,上代码: /**
* Add a new network description to the set of configured networks.
* The {@code networkId} field of the supplied configuration object
* is ignored.
*
* The new network will be marked DISABLED by default. To enable it,
* called {@link #enableNetwork}.
*
* @param config the set of variables that describe the configuration,
* contained in a {@link WifiConfiguration} object.
* If the {@link WifiConfiguration} has an Http Proxy set
* the calling app must be System, or be provisioned as the Profile or Device Owner.
* @return the ID of the newly created network description. This is used in
* other operations to specified the network to be acted upon.
* Returns {@code -1} on failure.
*
* @deprecated
* a) See {@link WifiNetworkSpecifier.Builder#build()} for new
* mechanism to trigger connection to a Wi-Fi network.
* b) See {@link #addNetworkSuggestions(List)},
* {@link #removeNetworkSuggestions(List)} for new API to add Wi-Fi networks for consideration
* when auto-connecting to wifi.
* Compatibility Note: For applications targeting
* {@link android.os.Build.VERSION_CODES#Q} or above, this API will always return {@code -1}.
*/
@Deprecated
public int addNetwork(WifiConfiguration config) {
if (config == null) {
return -1;
}
config.networkId = -1;
return addOrUpdateNetwork(config);
} 这是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); }
|
CopyRight 2018-2019 实验室设备网 版权所有 |