Android获取Wifi的数据
在anndroid中使用系統功能SystemService获取当前wifi状态。
常用获取办法
WifiManager wifiManager = (WifiManager) context.getSystemService(context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
String ssid = wifiInfo.getSSID();
然后可以使用currectWIfi的getSSID,getBSSID(Mac),getNetId等。
注意:getAddress这个函数被弃用,现在应该只能返回02:00:00:00:00:00
Unknown ssid 和 02:00:00:00:00:00 问题
获取wifi 的ssid出现 ,获取bssid和mac获得 02:00:00:00:00:00 的问题,本质上是权限的缺失,Android的系统权限总体来说是处于不断收紧的状态,使用android的系统功能越来越复杂,在android 8.0 后,必须要打开定位的权限该App才能够使用权限,权限的申请如下所示:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
当然,即使在Manfiest中进行了权限的申请也不一定可以,因为我在小米的机型上测出了不会弹出权限询问弹窗的问题,这个时候就只能手动开启定位权限了吗?//TODO: 跟进权限请求弹窗不弹的问题
WifiManager
此对象为Android的系统功能,一般只能从Context#getApplicationContext()获取,而不能从任何其他派生上下文获取,以避免调用过程中内存泄漏(参考文档1)。 这是执行Wi-Fi特定操作时要使用的API,它的作用主要有:
- 获取已配置网络的列表(曾经连接过的保存的wifi) ,获取当前所连wifi的数据
- 断开当前连接或连接任意一个已配置网络(为配置网络因为没有netid应该无法在App中自动连接)
- 定义了在Wi-Fi状态发生任何变化时广播的各种意图动作的名称。
ConnectivityManager
值得一提的是,在API29中,NetworkInfo这个类被弃用,所以ConnectivityManager的API发生了巨大的变化,例如getActiveNetworkInfo等返回值为NetworkInfo的API全部被弃用,转而使用getActiveNetwork等返回值是Network类的API,具体可以参考官方文档。
参考文献
- 浅析Context及可能带来的内存泄漏问题 : https://blog.csdn.net/u012403246/article/details/46285151
- ConnectivityManager Android 官方文档:https://developer.android.google.cn/reference/kotlin/android/net/ConnectivityManager.html