mYoungs' Blog

I love, therefore I am.

0%

Android 6.0之后 WIFI和蓝牙扫描问题

Android 6.0增加了对附近设备扫描的权限限制,如下三个API在调用前都需要先获取ACCESS_FINE_LOCATION 或者 ACCESS_COARSE_LOCATION权限。

  1. WifiManager.getScanResults()
  2. BluetoothDevice.ACTION_FOUND
  3. BluetoothLeScanner.startScan() 例如,通过BluetoothAdapter.startDiscovery()来搜索附近的蓝牙设备,在Android 6.0之前只需要在AndroidManifest中声明BLUETOOTH和BLUETOOTH_ADMIN权限即可,从Android 6.0之后还需要在AndroidManifest中声明ACCESS_FINE_LOCATION 或者ACCESS_COARSE_LOCATION权限。由于这两个权限属于dangerous permission,所以还需要在运行时申请该权限,等用户授权后才可以通过BluetoothAdapter.startDiscovery()来搜索附近的蓝牙设备。如果没有在AndroidManifest中声明ACCESS_FINE_LOCATION 或者 ACCESS_COARSE_LOCATION权限,或者没有得到用户授权就调用BluetoothAdapter.startDiscovery(),那么定义的BroadcastReceiver在Android 6.0系统上中是不会收到任何消息的。

参考:
1.https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-hardware-id
2.http://stackoverflow.com/questions/33052811/since-marshmallow-update-bluetooth-discovery-using-bluetoothadapter-getdefaultad