记录一次Android端获取WiFi列表,并实现连接的过程。

需求:

获取WiFi列表,并连接无密码的指定wifi。wifi状态连接成功之后调取第三方接口进行验证,接口请求类型GET。

牢骚:没做锅啊,小白一个。怎么办?,群里闲聊两小时,不如百度一分钟。(实际好多分钟。。。)

调查与研究:
、、、、网上关于获取wifi列表,并连接wifi的文章也有很多,每一篇都点来看看。会发现,哇,蛮有趣的,一如研究深似海,发现了各种问题,把每一条都记下来,也许会遇到。万一遇到了呢,多一个else也许死的不是太惨。

一、权限问题。

Android系统版本有那么好几个,目前太低了也估计没人再用了。最常见的从 android 6.0 开始,7.0,8.0,9.0.
区别大多都是在各个版本里的权限有所改变,比如说在网上看到的,在6.0里需要定位权限等,小白哪有时间去考虑那么多,那边催的紧啊,一股脑的把权限都加上!没有就去申请。

 //定位权限,获取app内常用权限String[] permsLocation = {"android.permission.ACCESS_WIFI_STATE", "android.permission.CHANGE_WIFI_STATE", "android.permission.ACCESS_COARSE_LOCATION", "android.permission.ACCESS_FINE_LOCATION"};

注意:并非所有基于Android的设备都提供Wi-Fi功能。如果您的应用程序使用Wi-Fi,请 在清单文件中用元素声明 uses-feature android:name=“android.hardware.wifi”
基本需要的权限 都给它加上。联网啊,定位啊,加上再说。具体细节暂不在研究细说。

等等,除了权限加上了。更恶心的是,Android手机版本太多,网上还说如小米手机,获取不到WiFi列表的原因,竟然是
小米手机的启用MIUI优化这个设置。
如果你关闭了这个设置可能就会获取不到wifi列表 (来源其他文章,我用的华为测试机)

无论怎么说,在安全这块,android系统版本越高,以后的权限限制会更加严格。隔壁ios小姐姐还在烦恼wifi权限问题还要需要向苹果写邮件申请呢。(嘤嘤嘤)

在anroid各个版本中关于wifi的相关类方法也有所改变。权限不够的极端办法
在 AndroidManifest.xml 中加入 android:sharedUserId=“android.uid.system”,并且使用系统签名后,你懂的
其各种动态申请权限的过程就飞锅。。。

二,基本知识

1.所用到的基本类

WifiManager :此类用于管理wifi连接所有方面的API。管理类.

ScanResult : 描述有关检测到的接入点信息。扫描返回信息类型。

wifiConfiguration :wifi一些网络配置信息(安全协议、密钥管理方案,组管理密码等)在API29中已弃用。

WifiInfo: 当前连接的wifi热点信息 。

2.关键词

SSID: wifi名称。

BSSID:wifi的 mac地址。(实际情况有所出入)

networkID : 数字型的id.

nettworkInfo :获取网络信息(如连接wifi)

RSSI :wifi信号强弱的值。。也叫level.等级

3,加密方式

没加密:连接的时候,只需要SSID,不需要密码。

WEP加密:连接的时候,需要SSID和password. 设置密码:config.wepKeys[0]

WPA/WPA2加密:连接的时候,需要SSID和password. 设置密码:config.preSharedKey

802.1 x EAP加密:需设置相关参数 。

具体加密方式的详细信息,可单独进行找度娘。

4,wifi状态枚举

WIFI_STATE_DISABLING wifi正在关闭
WIFI_STATE_DISABLED wifi关闭
WIFI_STATE_ENABLING wifi正在开启
WIFI_STATE_ENABLED wifi开启
WIFI_STATE_UNKNOW wifi未知

值依次为0~4

5,wifi状态改变的相关广播事件

WifiManager.WIFI_STATE_CHANGED_ACTION wifi开关变化通知
WifiManager.SCAN_RESULTS_AVAILABLE_ACTION wifi扫描结果通知
WifiManager.SUPPLICANT_STATE_CHANGED_ACTION wifi连接结果通知
WifiManager.NETWORK_STATE_CHANGED_ACTION 网络状态变化通知

只需注册相应的广播类,继承 BroadcastReceiver。就可以进行相关的逻辑处理了。

三,使用

1,首先,注册一个广播并extends BroadcastReceiver。实现onReceive方法。
wifi开关变化

 if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())) {//wifi开关变化int state = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);switch (state) {case WifiManager.WIFI_STATE_DISABLED: {//wifi关闭Log.e("=====", "已经关闭");// tv_wifiState.append("\n 打开变化:wifi已经关闭");break;}case WifiManager.WIFI_STATE_DISABLING: {//wifi正在关闭Log.e("=====", "正在关闭");//tv_wifiState.append("\n 打开变化:wifi正在关闭");break;}case WifiManager.WIFI_STATE_ENABLED: {//wifi已经打开Log.e("=====", "已经打开");// tv_wifiState.append("\n 打开变化:wifi已经打开");break;}case WifiManager.WIFI_STATE_ENABLING: {//wifi正在打开Log.e("=====", "正在打开");// tv_wifiState.append("\n 打开变化:wifi正在打开");break;}case WifiManager.WIFI_STATE_UNKNOWN: {//未知Log.e("=====", "未知状态");// tv_wifiState.append("\n 打开变化:wifi未知状态");break;}}}

wifi连接状态变化

else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())) {//监听wifi连接状态NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);Log.e("=====", "--NetworkInfo--" + info.toString());if (NetworkInfo.State.DISCONNECTED == info.getState()) {//wifi没连接上Log.e("=====", "wifi没连接上");//tv_wifiState.append("\n 连接状态:wifi没连接上");} else if (NetworkInfo.State.CONNECTED == info.getState()) {//wifi连接上了WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);WifiInfo wifiInfo = wifiManager.getConnectionInfo();//获取当前wifi名称Log.i("=========", "连接到网络 " + wifiInfo.getSSID());Log.e("=====", "wifi已连接");//ToastUtils.showShort("连接到网络 " + wifiInfo.getSSID());// tv_wifiState.append("\n 连接状态:wifi以连接,wifi名称:" + MyWifiManager.getWiFiName(mWifiManager));} else if (NetworkInfo.State.CONNECTING == info.getState()) {//正在连接Log.e("=====", "wifi正在连接");// tv_wifiState.append("\n 连接状态:wifi正在连接");}} else if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(intent.getAction())) {//监听wifi列表变化Log.e("=====", "wifi列表发生变化");}}

2,获取wifimanager的实例

3,注册前面写的广播

4,获取wifi数据
在获取数据之前,先要判断一下wifi开关是否打开。
通过wifimanager中的一个方法进行判断:isWifiEnabled()
若没打开前往设置打开开关:

然后获取wifi数据:

这里可以写一个实体来转换一下 该列表。可以自由发挥。

5.连接wifi

通过wifimanager的方法 connectwifi

分别传入四个参数,实例,SSID,密码,类型
1,注意热点和密码均包含引号,需要转义引号。
2.配置wifi信息,判断加密类型,分别进行配置。此处只列举三种。

3.连接wifi

4.断开连接

调用wifimanager的封装类中的该方法,传入实例即可。

小白记录学习过程,不足之处,请无情

Android 获取wifi列表相关推荐

  1. android wifi动画显示,Android获取WiFi列表的正确用法

    最近有个需求,需要做一个获取WiFi列表的功能,也在网上找了一些资料,但有些资料是有问题的,然后经过自己的摸索,总结如下: 本地环境: Android Studio版本:3.0.1:DEMO APK ...

  2. Android 获取Wifi列表详解(包含动态权限申请)

    WLAN 扫描流程 扫描流程分为三步: 为 SCAN_RESULTS_AVAILABLE_ACTION 注册一个广播监听器,系统会在完成扫描请求时调用此监听器,提供其成功/失败状态.对于搭载 Andr ...

  3. android 获取wifi的加密类型,Android WIFI开发:获取wifi列表,连接指定wifi,获取wifi加密方式,监听wifi网络变化等...

    下面是 Android 开发中 WiFi 的常用配置,如:获取当前 WiFi ,扫描 WiFi 获取列表,连接指定 WiFi ,监听网络变化等等. 下面是效果图: GitHub 下载地址:https: ...

  4. java 获取wifi_获取wifi列表并连接wifi

    一.获取wifi列表 获取wifi列表需要用wifiManager.startScan();进行扫描,扫描结果的列表使用List 保存 扫描步骤: wifiManager.startScan(); / ...

  5. Android7.0+ 获取WiFi列表以及连接WiFi

    获取WiFi列表并连接 这段时间项目中涉及到需要获取WiFi列表以及连接,在这里记录下 其中就有一个坑,在Android7.0以上还需要打开定位(也就是手机中"位置信息") Wif ...

  6. iOS 无法获取 WiFi 列表?一定是因为你不知道这个框架

    iOS 9 发布之后,苹果推出了 NetworkExtension,利用这个框架可以实现很多和网络相关的操作.本文主要介绍怎样使用其中的 NEHotspotHelper 进行设备 WiFi 列表的获取 ...

  7. H5获取wifi列表及当前wifi

    H5获取wifi列表及当前wifi <script type="text/javascript" src="./js/jquery.js">< ...

  8. android 获取wifi 信号质量,信号强度

    android 获取wifi 信号质量 编辑 | 删除 int strength = WifiManager.calculateSignalLevel(info.getRssi(), 5);即信号强度 ...

  9. android 获得wifi列表并连接wifi

    1.引包 implementation 'com.thanosfisherman.wifiutils:wifiutils:1.6.4' implementation 'com.thanosfisher ...

  10. python获取WiFi列表,根据密码本穷举破解,Windows

    python获取WiFi列表,根据密码本穷举破解,Windows 后附密码本 结果还是看运气 不要过度以及违法使用 单次连接时间自由调整:我自己测试时1秒够了 #wifi连接时间 time.sleep ...

最新文章

  1. Homebrew--MacOSX下的套件管理器
  2. C++中虚函数、虚指针和虚表详解
  3. python从入门到精通学习笔记_Python从入门到精通之基础概念
  4. 帮助你高效开发Ajax应用的超酷jQuery插件 - AjaxML
  5. 【One by One系列】IdentityServer4(一)OAuth2.0与OpenID Connect 1.0
  6. 一个基于Microsoft Azure、ASP.NET Core和Docker的博客系统
  7. navicat 导出的sql文件,再导入,运行SQL文件成功,数据库中却没有表
  8. mysql sql 函数大全_MySQL常用SQL/函数汇总(持续更新)
  9. ROS笔记——Create a cropped bagfile(创建一个已裁剪的包文件)
  10. jsp获取连接池的实时连接数_数据库连接池原理分析及模拟实现
  11. Codeforce 1175 D. Array Splitting
  12. windows 网络编程大汇总
  13. FreeRTOS 教程指南 学习笔记 第一章 简介
  14. 安全bios手册(5)
  15. ps一点等于多少厘米_ps像素和厘米换算(ps100像素等于多少厘米)
  16. 如何使用计算机对文件修改密码,如何给文件夹设置一个密码?(电脑怎么给文件夹设置密码?)...
  17. 外贸怎么在谷歌搜索客户?
  18. 【Todo】【读书笔记】机器学习实战(Python版)
  19. 个人用计算机配置清单,电脑配置单这么写?教你写一份合理的电脑配置清单
  20. speedoffice使用方法-Word插入的表格怎么拆分单元格

热门文章

  1. 雷神simplest_ffmpeg_player解析(四)
  2. 架构师提升技术影响力的三个阶段(一)
  3. 技术总监7年总结,如何进行正确的沟通?
  4. 面试:设计一个电商平台积分兑换系统
  5. Web of Science的正确打开方式
  6. Vue_(基础)Vue中的事件
  7. 【小白刷题之路Day26】令人虎躯一震的代码
  8. 自我认知测试软件,职业生涯测评系统在线测试
  9. 利用Python制作属于自己的炫酷二维码
  10. 戴尔-卡耐基:《人性的弱点 How to Win Friends And Influence People》总结