1. 说明:本文主要说明扫码之后自动连接WiFi的一些处理,扫码的流程相对简单,网上教程也比较多,对于目前Android各个版本也没有太多变化。
  2. 问题描述:最近在做项目的时候,发现以前的项目有扫描二维码自动连接WiFi的功能,设备改了生成二维码的方式,然后发现手机无法自动连接WiFi了。
  3. 问题原因:经过代码调试发现:(我都是真机调试)
    wifiManager.addNetwork(WifiConfiguration);

    在添加WiFi的时候,这行代码始终返回-1,换用同事手机竟然神奇的可以连接,然后一脸蒙蔽,裂开了,不怕有问题,就怕有的有问题,有的没问题。

  4. 问题解决:
  • 区别:我测试手机 小米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}.*/@Deprecatedpublic 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() {@Overridepublic void onAvailable(Network network) {// do success processing here..}@Overridepublic 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连接成功@Overridepublic void onAvailable(Network network) {// do success processing here.//如果WiFi连接成功,下面的代码表示使用该wifi网络connectivityManager.bindProcessToNetwork(network);}//WiFi连接失败@Overridepublic 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);
}
 

Android 10自动连接WiFi问题 Android 10 断开WiFi问题相关推荐

  1. STM32开发 -- 自动连接一个未保存过的WIFI

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/90695656 上一篇文章 STM32开发 – WIFI那些事儿(一) 简单介 ...

  2. 转-Android中自动连接到指定SSID的Wi-Fi

    最近在做一个项目,其中涉及到一块"自动连接已存在的wifi热点"的功能,在网上查阅了大量资料,五花八门,但其中一些说的很简单,即不能实现傻瓜式的拿来就用,有些说的很详细,但其中不乏 ...

  3. Android开发——自动连接指定SSID的wifi热点(不加密/加密)

    最近在做一个项目,其中涉及到一块"自动连接已存在的wifi热点"的功能,在网上查阅了大量资料,五花八门,但其中一些说的很简单,即不能实现傻瓜式的拿来就用,有些说的很详细,但其中不乏 ...

  4. Android下自动连接指定SSID的WIFI的简单实现

    一.关于WiFi模块的概述: 1.在Android developer的文档中WiFi模块的信息: 首先,登记广播的监听:其次,请求扫描wifi信号:最后获取扫描到的wifi信息. 2.在广播监听到结 ...

  5. android 蓝牙自动连接,蓝牙自动连接实现

    实现的主要功能(蓝牙配对成功如何与远程设备一直连接) 1.当蓝牙配对成功连接时,断开远程端设备会自动连接 2.当设备长时间锁屏会导致CachedBluetoothDevice自动清空,如果蓝牙断开就不 ...

  6. android开发蓝牙自动连接电脑上,android – 配对设备的蓝牙自动连接

    我是新来的,我已经阅读了很多你的帖子,但仍然没有找到问题的解决方案. 我正在为Android 2.2编写一个使用蓝牙连接到终端设备的应用程序. 我有一个配对设备列表,我可以将我的Android平板电脑 ...

  7. android开发蓝牙自动连接电脑上,Android蓝牙开发之自动连接设备

    自动连接使用的是SharedPreferences这个来解决. private void Automaticconnection() { SharedPreferences sp = getShare ...

  8. android studio 自动生成对象,在Android Studio中快速导入可绘制对象的方法?

    在Android Studio中快速导入可绘制对象的方法? 在Android项目中的某个时候,您将需要在res/drawable目录中导入一些可绘制对象-工具栏图标,图像,UI功能. 大多数情况下,您 ...

  9. android蓝牙开启后会尝试自动连接,以编程方式配对后,Android会自动连接蓝牙设备...

    我找到了解决方案. 首先,我需要一个BroadcastReceiver,如: private BroadcastReceiver myReceiver = new BroadcastReceiver( ...

最新文章

  1. 来呀!AI喊你斗地主——首个搞定斗地主的深度神经网络
  2. php获取今天是几号,php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳以及当月共有多少天...
  3. HDU - 3364 Lanterns(高斯消元解方程(取模))
  4. C#中5步完成word文档打印的方法
  5. C++内存管理——指针数组
  6. stm32f407 tim4 复用_波分复用对比,CWDM、DWDM、CCWDM有何不同?
  7. 基础知识(七)opencv、python、人脸框检测
  8. SQL Server向表中插入数据
  9. php 存储过程 sqlsrv_query,php-PHP如何得用sqlsrv函数来调用MSSQL中的存储过程,并返回数据集?...
  10. 从富文本中截取图片_JS 获取富文本中的第一张图片 (正则表达式)
  11. 如何解压缩.7z 001,.7z002....
  12. 计算机大学英语值最高的3项,计算机应用基础试卷
  13. python 构建来源gis_Python语言在ArcGIS环境中的应用.pptx
  14. 怎么在html中写java代码,在html里面写java代码
  15. Code-NFine:jqgrid 数据绑定
  16. 2020光学期刊一区二区影响因子发布(科睿唯安)
  17. Java中的数据类型
  18. 服务器字体显示繁体字怎么解决,win7繁体字乱码怎么办?win7繁体字显示乱码解决方法...
  19. 贝多芬《升c小调第十四钢琴奏鸣曲》 个人浅谈
  20. PHP7.2与apache环境安装部署详细流程

热门文章

  1. 视频滤镜怎么调好看?教你如何给视频调整滤镜
  2. 关于火狐firefox不能启动解决方法
  3. 龙之战神微信登录服务器,37龙之战神服务器正式关服公告
  4. 手机APP原型(prototype)设计工具Balsamiq Mockups
  5. es命令删除索引数据_Elasticsearch-删除数据
  6. 在linux下给编辑文件在哪里设置密码,在 Linux 中用 Vim 对文件进行密码保护
  7. bootstrap的栅格系统
  8. WIFI环境下支付安全问题探析
  9. iOS经典讲解之使用instruments检测内存
  10. UP对战平台DOTA全图 炸图 踢人