关于Android12新蓝牙权限问题总结

2022-01-04 20:02:07 浏览数 (1)

最近有好几个用户反馈了TRTC在Android 12的系统上,连接使用蓝牙设备出现了crash,堆栈如下:

看到堆栈其中有一行

就都跑过来问为什么会出现这个崩溃?询问客户是否有给蓝牙权限,回答都是有给到的。好奇怎么就会导致crash呢?(其实在Android 12之前就算不给蓝牙权限去连接使用蓝牙也不会出现crash)。

经过网上一番查找,原来是因为最近Google发布的Android 12,新引入了 BLUETOOTH_SCANBLUETOOTH_ADVERTISEBLUETOOTH_CONNECT 权限。

之前的Android系统中有一个很奇怪的现象,当我们在应用中使用蓝牙扫描附件设备的时候,需要申请地理位置权限

蓝牙权限并不是运行时权限,但地理位置权限却是。明明只是想要使用蓝牙的功能,却让用户误以为想要定位设备的地理位置。这个设计连Google自己都不明白为什么!(多少有点坑了)

于是在Android 12系统中,Google对蓝牙权限重新进行了设计,修复了这个已经存在了十几年的bug。从Android 12开始,过去的蓝牙权限被拆分成了3个新的权限,并且全都是运行时权限(需要动态申请):

  • BLUETOOTH_SCAN 用于使用蓝牙扫描附件其他的蓝牙设备
  • BLUETOOTH_ADVERTISE 用于允许当前的设备被其他的蓝牙设备所发现
  • BLUETOOTH_CONNECT 用于连接之前已经配对过的蓝牙设备

这3个权限都是从Android 12系统才开始有的,所以为了能够兼容过去的老版本,建议在AndroidManifest.xml中这样声明:

还可以跟以前一样申请老的蓝牙权限,但是让他们只作用到API 30,也就是Android 11系统上。从Android 12开始就申请新的蓝牙权限。

新增的3个蓝牙权限都是运行时权限,因此只在AndroidManifest.xml中声明是没有用的,还要在代码中动态申请权限才行。必须先在应用中用户明确批准使用,然后才能查找蓝牙设备、使某个设备可被其他设备检测到,或者与已配对的蓝牙设备通信。

具体的申请方法如下:首先要判断当前的系统版本,只有当Android 12及以上系统时,才应该去请求新增的蓝牙权限。(PS:3个权限都属于同一个权限组,因此理论上只要申请一个权限,另外2个也就自动授权了。)

以上就能解决TRTC在Android 12上连接使用蓝牙设备导致崩溃的问题了。

0 人点赞