首页 > 编程知识 正文

蓝牙一直断开连接断开自动连接,手机充电自动断开又自动连接

时间:2023-05-06 04:11:37 阅读:225183 作者:4681

说明:本文主要说明扫码之后自动连接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. * <p/> * 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. * <b>Compatibility Note:</b> 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);}  

 

 

 

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。