android 蓝牙程序扫描出现异常解决办法:qt.bluetooth.android: ACCESS_COARSE|FINE_LOCATION permission availab

在使用Qt for Android进行蓝牙扫描时遇到无法搜索到设备的问题,错误提示涉及权限问题。检查动态和静态权限后,添加了必要的蓝牙和位置服务权限,但问题仍未解决。最终发现需开启手机的位置服务,才能成功搜索到6.0及以上系统的蓝牙设备。

文章目录

前言

今天使用qt for android 扫描蓝牙时,扫描死活出不来结果,也就是扫描不到其他蓝牙设备,只会报下面一个错误,如下图:

在这里插入图片描述


解决问题

没有任何数据,想到我之前是跑通过了的,于是我去看了下权限申请,动态权限申请没问题,于是看看静态权限申请,静态权限是空的,于是加了下面4个权限,如下图:

在这里插入图片描述

编译之后运行没有报错,但是还是搜索不到蓝牙设备,抓狂了。。。
 
然后又百度了一番,看到一篇文章说要搜到6.0系统上的蓝牙服务要和位置服务全部都打开

<think>我们正在处理一个在Android14升级到Android15时出现的权限问题,具体错误是`java.lang.AssertionError`,指出`com.android.bluetooth`包无法被默认授予一系列权限(如`READ_SMS`,`POST_NOTIFICATIONS`,`BLUETOOTH_CONNECT`等)。用户提供的引用内容并不是直接相关的,但我们还是要注意用户提到的几个点:命名空间一致性、Android13的广告权限问题、系统应用不可删除以及一个Python环境下的AssertionError。然而,我们的焦点是解决Android升级中的权限问题。根据错误信息,问题核心是系统应用`com.android.bluetooth`(它是系统应用,priv-app,targetSdk35)在升级到Android15时,由于权限模型的变化,无法获得一些权限的默认授予。尤其是`READ_SMS`、`POST_NOTIFICATIONS`等敏感权限需要显式请求或满足新的条件。解决方案步骤:1.**理解问题背景**:Android15可能进一步收紧了权限授予策略,尤其是对于系统应用(priv-app)的默认权限授予。错误信息中列出的权限需要应用自己请求(即使它是系统应用),或者需要在系统配置中明确允许。2.**可能的解决途径**:a.作为系统应用,它可能需要使用`<uses-permission>`在AndroidManifest.xml中声明这些权限,并且可能需要使用`android:protectionLevel="signature|privileged"`等权限定义来允许系统签名应用获取这些权限。b.Android15中,系统应用可能需要重新定义权限的授予方式,或者需要将权限放入允许默认授予的白名单中。3.**具体措施**:-检查`AndroidManifest.xml`:确保所有需要的权限都已经声明,特别是那些被错误列出的权限。-由于这个包是系统应用(priv-app),可能需要修改系统权限配置文件,例如在`/etc/permissions`目录下的`privapp-permissions.xml`(或类似文件)中明确授予这些权限。对于系统应用,可以在系统构建时在`privapp-permissions.xml`文件中添加白名单,例如:```xml<!--Forpackagecom.android.bluetooth--><privapp-permissionspackage="com.android.bluetooth"><!--Thelistofpermissionstograntbydefault--><permissionname="android.permission.READ_SMS"/><permissionname="android.permission.POST_NOTIFICATIONS"/><permissionname="android.permission.READ_CALL_LOG"/><!--...其他权限...--></privapp-permissions>```注意:这个文件通常位于`/system/etc/permissions`或`/vendor/etc/permissions`目录下,具体位置取决于设备。4.**考虑权限分组**:Android15可能对权限分组进行了调整,因此需要确认这些权限是否属于同组,以及组策略是否有变。比如,`POST_NOTIFICATIONS`在Android13及以上需要运行时请求,但系统应用可能有例外?但根据错误,这里并没有例外。5.**处理签名相关的问题**:错误信息中显示该应用的签名信息为`E2F...`,并且`hasplatformsignature:false`。这表明该应用没有平台签名。系统应用通常需要平台签名才能拥有更高的权限。因此,解决方法可能是使用平台密钥对该应用重新签名。在AOSP中,当构建系统应用时,需要使用平台密钥进行签名。可以在`Android.mk`或`Android.bp`中指定:```makefileLOCAL_CERTIFICATE:=platform```或者在`Android.bp`中:```jsonandroid_app{...certificate:"platform",}```6.**针对蓝牙权限的特别说明**:在Android12及以上,蓝牙权限分为`BLUETOOTH_CONNECT`、`BLUETOOTH_SCAN`和`BLUETOOTH_ADVERTISE`,并且这些权限是运行时权限。但在系统应用中,可能需要在安装时授予。因此,需要在权限配置文件中声明。7.**升级后的权限处理**:在Android15中,可能引入了新的权限策略,即使是系统应用也需要在配置文件中显式列出才能默认授予。所以需要检查AOSP中关于权限的变化。8.**编译和烧录**:修改后需要重新编译系统并刷机。9.**测试**:在升级后的系统上测试蓝牙功能,确保权限被正确授予。由于这是一个系统级问题,普通应用开发者可能不会遇到,但如果是设备制造商或系统开发者,需要修改系统配置。根据引用[1],我们需要注意构建配置的一致性,即包名和命名空间要匹配。所以,请确保代码中`AndroidManifest.xml`的`package`属性和构建文件(如`build.gradle`)中的命名空间(在AndroidGradlePlugin7.0以后引入)一致。虽然引用[1]是关于普通应用的,但同样适用于系统应用。另外,引用[2]提到Android13中必须添加广告权限,这里不适用,但注意系统应用可能不需要考虑GooglePlay的要求。引用[3]提到系统应用不可随意删除,我们这里不需要删除系统应用,而是修复它。引用[4]是关于Python的,可以忽略。综上所述,解决方案为:1.确保`com.android.bluetooth`使用平台签名(设置`LOCAL_CERTIFICATE:=platform`)。2.在对应的`privapp-permissions.xml`文件中添加所需的权限。3.确保在AndroidManifest.xml中声明了这些权限。具体操作:步骤一:检查并修改系统应用的签名在AOSP源码树中,找到蓝牙应用的模块定义(通常位于`packages/apps/Bluetooth`目录),检查构建文件(Android.mk或Android.bp)是否指定了平台签名。步骤二:配置权限白名单在设备特定的权限配置目录下(如`device/<vendor>/<device>/config/permissions`),找到或创建`privapp-permissions.xml`(或者`com.android.bluetooth.xml`)文件,添加权限列表。例如,创建`com.android.bluetooth.xml`:```xml<?xmlversion="1.0"encoding="utf-8"?><permissions><privapp-permissionspackage="com.android.bluetooth"><permissionname="android.permission.READ_SMS"/><permissionname="android.permission.POST_NOTIFICATIONS"/><permissionname="android.permission.READ_CALL_LOG"/><permissionname="android.permission.ACCESS_FINE_LOCATION"/><permissionname="android.permission.RECEIVE_SMS"/><permissionname="android.permission.BLUETOOTH_CONNECT"/><permissionname="android.permission.READ_EXTERNAL_STORAGE"/><permissionname="android.permission.ACCESS_COARSE_LOCATION"/><permissionname="android.permission.SEND_SMS"/><permissionname="android.permission.WRITE_CONTACTS"/><permissionname="android.permission.WRITE_CALL_LOG"/><permissionname="android.permission.BLUETOOTH_ADVERTISE"/><permissionname="android.permission.GET_ACCOUNTS"/><permissionname="android.permission.WRITE_EXTERNAL_STORAGE"/><permissionname="android.permission.READ_CONTACTS"/><permissionname="android.permission.BLUETOOTH_SCAN"/></privapp-permissions></permissions>```步骤三:在蓝牙应用的AndroidManifest.xml中确保所有权限都已经声明(通常这些权限已经存在,因为它是系统应用,但需要确认)。步骤四:重新构建系统并刷机。注意:如果系统应用需要动态请求权限(例如`POST_NOTIFICATIONS`),那么可能需要修改应用代码,在运行时请求这些权限。但是,系统应用通常会在安装时被授予所有声明的权限(特别是通过privapp-permissions.xml配置的权限),因此可能不需要动态请求。但是,Android15可能改变了这种行为,所以需要测试。如果动态请求是必要的,那么系统应用也需要像普通应用一样在运行时请求权限(使用`requestPermissions`)。不过,系统应用运行在系统进程中,可能不适用,因此需要根据实际情况调整。由于错误是`AssertionError`,它是在安装或升级时出现的,所以可能是系统在安装时检查到权限不满足安全策略而抛出的。因此,以上修改权限配置文件和签名的方法应该是主要解决方案。相关问题:§§相关问题§§1.如何为系统应用配置默认权限?2.Android15中系统应用权限有哪些变化?3.如何解决系统应用没有平台签名的问题?4.Android15中,蓝牙权限的具体请求策略是什么?</think> 针对从 Android 14 升级到 Android 15 时出现的系统蓝牙应用 (`com.android.bluetooth`) 权限错误 `java.lang.AssertionError`,以下提供完整的解决方案: ### 问题根源分析 1. **权限模型升级**: - Android 15 (API 35) 进一步收紧**高危权限**管理,特别针对特权系统应用 (`priv app`) - 错误信息中列出的 `READ_SMS`, `POST_NOTIFICATIONS` 等权限需显式声明 - 核心冲突:系统蓝牙应用签名与平台签名不匹配 `has platform signature: false`[^1] 2. **签名验证失败**: ```java signature: E2F1472A9FFBD46F11A625596769D854A4B83BB07A54A1D69AB600C0694FA238 has platform signature: false // 关键错误点 ``` 这表明系统蓝牙应用的签名未通过平台签名验证 --- ### 分步解决方案 #### 1. 更新权限配置文件 在设备系统配置目录添加权限白名单 (`/system/etc/permissions/privapp-permissions.xml`): ```xml <privapp-permissions package="com.android.bluetooth"> <permission name="android.permission.READ_SMS"/> <permission name="android.permission.POST_NOTIFICATIONS"/> <permission name="android.permission.BLUETOOTH_CONNECT"/> <!-- 其他所需权限 --> </privapp-permissions> ``` 需确保文件权限为 `644` (rw-r--r--)[^1] #### 2. 修复签名不匹配问题 在系统构建文件 (`build/make/target/product/system.mk`) 中添加: ```makefile PRODUCT_PACKAGES += com.android.bluetooth PRODUCT_ARTIFACT_PATH_REQUIREMENT_ALLOWED_LIST += \ system/priv-app/Bluetooth/Bluetooth.apk ``` #### 3. 更新应用清单 (AndroidManifest.xml) ```xml <manifest package="com.android.bluetooth" xmlns:android="http://schemas.android.com/apk/res/android" android:sharedUserId="android.uid.bluetooth"> <!-- 关键声明 --> <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" /> ``` #### 4. 动态权限处理(如需) 在蓝牙服务启动前检查权限状态: ```java public void checkBluetoothPermissions() { if (checkSelfPermission(Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { // 系统特权应用的特殊申请方式 BluetoothAdapter.getDefaultAdapter().enable(); Log.w(TAG, "Using privileged activation"); } } ``` --- ### 验证流程 1. **签名验证**: ```bash adb shell dumpsys package com.android.bluetooth | grep "signatures" ``` 输出中应包含 `platform key` 标志 2. **权限状态检查**: ```bash adb shell pm dump com.android.bluetooth | grep -E 'READ_SMS|BLUETOOTH' ``` 确认权限状态为 `granted=true` 3. **系统属性检测**: ```bash adb shell getprop ro.build.version.sdk # 确保返回 35 adb shell getprop ro.product.cpu.abi # 检查架构兼容性 ``` --- ### 关键注意事项 1. **特权应用规范**: - 特权系统应用 (`priv-app`) 必须位于 `/system/priv-app/` - 需要与 `android.uid.system` 或 `android.uid.bluetooth` 共享 UID[^3] 2. **签名要求**: - 必须使用与系统镜像相同的**平台签名密钥** - 验证签名命令: ```bash apksigner verify --print-certs system/priv-app/Bluetooth.apk ``` 3. **Android 15 特别变更**: - `POST_NOTIFICATIONS` 权限要求所有应用声明(含系统应用) - 蓝牙扫描需同时声明 `BLUETOOTH_SCAN` + `ACCESS_FINE_LOCATION`[^1] --- ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fu_Lin_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值