前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于Android12新蓝牙权限问题总结

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

原创
作者头像
Sumn
修改2022-01-04 20:02:07
13.6K2
修改2022-01-04 20:02:07
举报
文章被收录于专栏:TRTC_DemoTRTC_Demo

最近有好几个用户反馈了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上连接使用蓝牙设备导致崩溃的问题了。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
实时音视频
实时音视频(Tencent RTC)基于腾讯21年来在网络与音视频技术上的深度积累,以多人音视频通话和低延时互动直播两大场景化方案,通过腾讯云服务向开发者开放,致力于帮助开发者快速搭建低成本、低延时、高品质的音视频互动解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档