咸鱼

咸鱼是以盐腌渍后,晒干的鱼

0%

Android P(9.0) WiFi信息获取变更

在开发IoT App往往需要WiFi配网功能,所以需要用到获取当前SSID的API接口,在Android9.0上获取的权限更加严格。

android9-wifi.png

权限

  • ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION (需要动态申请)

  • ACCESS_WIFI_STATE 和 ACCESS_NETWORK_STATE

1
2
3
4
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

如果需要App进入后台时依然能获取到WiFi信息,需要增加一条动态权限

1
android.permission.ACCESS_BACKGROUND_LOCATION

没有这个权限,进入后台,WifiManager获取到的SSID值是 <unknown ssid> ,在后台时间长或者频繁获取WiFi信息,也会SSID值是 <unknown ssid>

接口

不要再从广播里面获取SSID,调用 WifiManagergetConnectionInfo() 函数,注意先请求申请权限。

1
2
3
val mWifiManager = context?.getSystemService(WifiManager::class.java)
val ssid = mWifiManager?.connectionInfo?.ssid
Log.e(TAG, "mWifiManager = $ssid")

另外,还需要在设备上启用位置服务(在 Settings > Location 下)。

监听网络

  1. 订阅系统广播(规范)
  2. 启动一个Timer检查(方便简单,但不可靠),时间长会获取不到SSID值。