仅在 Android 13 Pixel 设备的生产应用程序中观察到一些崩溃。
所有与蓝牙相关的权限都在清单中声明,附近的设备运行时权限也已到位。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:installLocation="auto">
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission
android:name="android.permission.BLUETOOTH_ADMIN"
android:maxSdkVersion="33" />
<uses-permission
android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation"
tools:ignore="UnusedAttribute" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION"
android:maxSdkVersion="31" />
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION"
android:maxSdkVersion="31" />
</manifest>
崩溃日志:
Fatal Exception: java.lang.SecurityException: Need BLUETOOTH PRIVILEGED permission: Neither user 10370 nor current process has android.permission.BLUETOOTH_PRIVILEGED.
at android.app.ContextImpl.enforce(ContextImpl.java:2240)
at android.app.ContextImpl.enforceCallingOrSelfPermission(ContextImpl.java:2268)
at android.content.ContextWrapper.enforceCallingOrSelfPermission(ContextWrapper.java:948)
at com.android.bluetooth.Utils.enforceBluetoothPrivilegedPermission(Utils.java:411)
at com.android.bluetooth.gatt.GattService.permissionCheck(GattService.java:474)
at com.android.bluetooth.gatt.GattService.registerForNotification(GattService.java:3801)
at com.android.bluetooth.gatt.GattService$BluetoothGattBinder.registerForNotification(GattService.java:1085)
at com.android.bluetooth.gatt.GattService$BluetoothGattBinder.registerForNotification(GattService.java:1073)
at android.bluetooth.IBluetoothGatt$Stub.onTransact(IBluetoothGatt.java:812)
at android.os.Binder.execTransactInternal(Binder.java:1285)
at android.os.Binder.execTransact(Binder.java:1244)
我被告知 android 12(API 级别 31)存在问题,android.permission.BLUETOOTH_PRIVILEGED 权限是特权的,不适用于第 3 方应用程序
Android 12(API 31)的蓝牙权限已更改
Android 12 引入了 BLUETOOTH_SCAN、BLUETOOTH_ADVERTISE 和 BLUETOOTH_CONNECT 权限, 允许应用扫描附近的设备 (NearBy) 而无需请求位置权限 (ACCESS_FINE_LOCATION)。
由于这三个蓝牙权限是运行时权限,因此必须在应用程序中明确请求用户同意才能发现蓝牙设备。 因此,存在蓝牙连接权限检查的问题。我们从这个角度(BLUETOOTH_CONNECT)入手,分析权限检查机制
<uses-permission android:name="android.print.BLUETOOTH " />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" />
<uses-permission android:name="android .permission. BLUETOOTH_DEBUG"/>