1. 安卓14与微信小程序蓝牙权限的“新规矩”
最近在搞一个智能硬件项目,需要微信小程序去连接一个蓝牙设备。在安卓13上跑得好好的,一升级到安卓14,直接傻眼——小程序死活搜不到蓝牙设备。一开始以为是代码写错了,反复检查,甚至换了几个测试机,问题依旧。后来在微信开放社区泡了好几天,看了无数帖子,才终于搞明白,这锅得安卓14的新权限机制来背。
安卓14在隐私和安全上又加了一把锁,引入了一个叫“附近设备”的权限。这个权限是干嘛的呢?简单说,以前你的App想用蓝牙扫描周围的设备,系统可能只问你要个“蓝牙”权限。但现在,安卓14把它拆得更细了:你用蓝牙连接一个已经配对的设备,可能只需要蓝牙权限;但你想用蓝牙去扫描、发现周围那些陌生的设备,那就需要这个新的“附近设备”权限。这就像你想在家里用遥控器开电视(连接已知设备),和你想拿着探测仪在小区里找东西(扫描未知环境),后者显然需要更明确的许可。
微信小程序作为运行在微信这个“超级App”里的环境,它调用手机蓝牙能力,实际上是通过微信这个“中间人”向安卓系统申请的。在安卓14上,微信也需要向系统申请这个“附近设备”权限,并且用户必须明确授权给微信,然后你的小程序才能通过微信去正常扫描蓝牙设备。最坑爹的是,这个权限的授权提示可能不会在你第一次调用蓝牙搜索时自动弹出来,或者用户一不小心点错了,就会导致后续的扫描列表永远为空。
我实测下来,很多开发者(包括一开始的我)都会掉进这个坑:调用 wx.getBluetoothDevices 或者监听 wx.onBluetoothDeviceFound,返回的设备列表永远是空的,控制台也不报错,程序逻辑就卡在这里了。你去查小程序的蓝牙授权状态,用 wx.getAppAuthorizeSetting 接口看 bluetoothAuthorized 字段,它很可能返回的是 "authorized"。这是因为这个字段只代表微信有没有获得系统的“蓝牙”相关权限,而无法区分是“连接”权限还是“扫描”权限。在安卓14上,即使“附近设备”权限没开,这个字段依然可能显示已授权,这就产生了严重的误导。
所以,我们的核心问题就变成了:如何在安卓14系统的微信小程序里,准确判断“附近设备”权限是否真正开启,并在未开启时,有效地引导用户去打开它? 下面我就把自己踩坑后摸索出来的整套方案,详细分享给你。
2. 为什么官方接口“失灵”了?——权限检测的陷阱
上面提到了 wx.getAppAuthorizeSetting 接口的局限性,这里我们得深入扒一扒。这个接口的设计初衷是好的,它让开发者能查询微信对一些系统能力的授权状态,比如相册、位置、蓝牙等。在安卓14之前,蓝牙权限相对笼统,这个接口返回的 bluetoothAuthorized 基本能反映真实情况。
但安卓14的权限细分,让这个接口有点“跟不上趟”。我翻看了微信官方文档和大量的社区讨论,目前(截至我写这篇文章时)微信小程序基础库还没有提供一个直接的、专门的API来查询“附近设备”(在安卓系统上常对应 NEARBY_DEVICES 或 BLUETOOTH_SCAN 权限)这个具体子权限的状态。
wx.getAppAuthorizeSetting 里的 bluetoothAuthorized 状态,现在更倾向于表示一个“基础蓝牙访问权限”是否被授予。在安卓14上,用户可能授予了微信“使用蓝牙”的权限(这会让 bluetoothAuthorized 变成 authorized),但同时却拒绝了“附近设备”这个子权限。这种情况下


1万+

被折叠的 条评论
为什么被折叠?



