安卓手机APP开发__Wi-Fi扫描概述

安卓手机APP开发__Wi-Fi扫描概述

目录

概述

Wi-Fi的扫描过程

限制

权限

[Android 8.0 and Android 8.1:](#Android 8.0 and Android 8.1:)

[Android 9:](#Android 9:)

[Android 10 (API 级别 29) 和 更高版本:](#Android 10 (API 级别 29) 和 更高版本:)

扫描频率的限制

[Android 8.0 and Android 8.1:](#Android 8.0 and Android 8.1:)

[Android 9:](#Android 9:)

[Android 10 and higher:](#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

Kotlin 复制代码
val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager

val 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 handling
  scanFailure()
}

....

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扫描限制)

相关推荐
没有了遇见14 小时前
Android 原生定位(替代高德 / 百度等三方定位)<终极版本>
android
2501_9160088915 小时前
iOS 抓包工具有哪些?全面盘点主流工具与功能对比分析
android·ios·小程序·https·uni-app·iphone·webview
2501_9159214315 小时前
iOS混淆工具实战 视频流媒体类 App 的版权与播放安全保护
android·ios·小程序·https·uni-app·iphone·webview
CYRUS_STUDIO15 小时前
LLVM 全面解析:NDK 为什么离不开它?如何亲手编译调试 clang
android·编译器·llvm
CYRUS_STUDIO16 小时前
静态分析神器 + 动态调试利器:IDA Pro × Frida 混合调试实战
android·逆向
g_i_a_o_giao18 小时前
Android8 binder源码学习分析笔记(一)
android·java·笔记·学习·binder·安卓源码分析
翻滚丷大头鱼18 小时前
android 四大组件—BroadcastReceiver
android
人生游戏牛马NPC1号19 小时前
学习 Android (二十) 学习 OpenCV (五)
android·opencv·学习
2501_9160088919 小时前
uni-app iOS 日志与崩溃分析全流程 多工具协作的实战指南
android·ios·小程序·https·uni-app·iphone·webview
文 丰19 小时前
【AndroidStudio】官网下载免安装版,AndroidStudio压缩版的配置和使用
android