宁波网站推广平台咨询公司,云南网站做的好的公司,网站需求流程图,住房与城市建设部网站安卓手机APP开发__Wi-Fi扫描概述
目录
概述
Wi-Fi的扫描过程
限制
权限
Android 8.0 and Android 8.1:
Android 9:
Android 10 (API 级别 29) 和 更高版本:
扫描频率的限制
Android 8.0 and Android 8.1:
Android 9:
Android 10 and higher: 概述
你能使用Wi-Fi的…安卓手机APP开发__Wi-Fi扫描概述
目录
概述
Wi-Fi的扫描过程
限制
权限
Android 8.0 and Android 8.1:
Android 9:
Android 10 (API 级别 29) 和 更高版本:
扫描频率的限制
Android 8.0 and Android 8.1:
Android 9:
Android 10 and higher: 概述
你能使用Wi-Fi的扫描能力,通过使用Wifi管理器API来得到Wi-Fi的扫描过程.
Wi-Fi的扫描过程
在扫描的过程中有三个步骤:
为SCAN_RESULTS_AVAILABLE_ACTION注册一个广播的监听器,当扫描的请求被完成时 这个监听器被调用了,提供它们成功/失败的状态.对于运行在安卓10(API级别29)以及 更高版本这个广播被发送到任何Wi-Fi扫描完成的设备上。APP能积极地监听所有的 扫描完成通过使用广播。
使用WifiManager.startScan()方法请求一个扫描。确保检查方法的返回状态因 为这个调用可能因为如下的任何一个原因而失败 因为在短时间内有太多的扫描了扫描请求被堵塞住了。 设备是空闲的但扫描被禁用了 Wi-Fi报告了一个扫描故障
使用WifiManager.getScanResults()方法得到扫描的结果。返回的扫描的结果是最新的 更新的结果如果你的扫描没有完成它可能是之前的一次的结果。这意味着 如果你在接收到一个成功的广播之前调用了这个方法你可能得到一个比较旧的结果。
如下的代码提供了一个例子它是如何实现这些步骤的 Kotlin
val wifiManager context.getSystemService(Context.WIFI_SERVICE) as WifiManagerval wifiScanReceiver object : BroadcastReceiver() {override fun onReceive(context: Context, intent: Intent) {val success intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false)if (success) {scanSuccess()} else {scanFailure()}}
}val intentFilter IntentFilter()
intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)
context.registerReceiver(wifiScanReceiver, intentFilter)val success wifiManager.startScan()
if (!success) {// scan failure handlingscanFailure()
}....private fun scanSuccess() {val results wifiManager.scanResults... use new scan results ...
}private fun scanFailure() {// handle failure: new scan did NOT succeed// consider using old scan results: these are the OLD results!val results wifiManager.scanResults... potentially use older scan results ...
}
限制
安卓8.0 (API 级别 26)引入了对权限的限制的允许的Wi-Fi扫描的频率的限制。
为了提升网络的性能安全和电池的寿命安卓9 (API 级别 28)加强了权限请求 并且进一步地限制了Wi-Fi扫描的频率。 权限
Android 8.0 and Android 8.1:
对WifiManager.getScanResults()方法的成功的调用需要如下的权限 ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION CHANGE_WIFI_STATE
如果调用时没有这三个权限这个调用是失败的并且返回了SecurityException.
Android 9:
对WifiManager.startScan()方法的成功的调用需要如下的权限 你的app 有 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION 权限. 你的 app 有 CHANGE_WIFI_STATE 权限. 在设备上的定位服务被启用设置〉定位 Android 10 (API 级别 29) 和 更高版本:
对WifiManager.startScan()方法的成功的调用需要如下的权限 你的app 有 ACCESS_FINE_LOCATION 权限. 你的 app 有 CHANGE_WIFI_STATE 权限. 在设备上的定位服务被启用设置〉定位
对WifiManager.getScanResults()方法的成功的调用需要如下的权限 你的app 有 ACCESS_FINE_LOCATION 权限. 你的 app 有 ACCESS_WIFI_STATE 权限. 在设备上的定位服务被启用设置〉定位
如果调用时没有这三个权限需求这个调用是失败的并且返回了SecurityException. 扫描频率的限制
在使用WifiManager.startScan()方法应用这个限制
Android 8.0 and Android 8.1:
每个后台的APP在30分钟的周期内能扫描一次。 Android 9:
每一个前台的APP在一个2分钟的周期内可以扫描4次。 所有的后台的APP放在一起在30分钟的周期内能扫描一次。
Android 10 and higher:
限制与安卓9时是一样的有了一个新的开发者选项在本地测试时可以关闭这个限制 开发者选项〉网络〉Wi-Fi扫描限制