iam 使用 Android 13 sdk 33。 我的应用程序使用蓝牙耳机。 仅当我使用 Android 13 并且在设备已连接到耳机时启动应用程序时,我才收到 SecurityException。 当我启动应用程序并连接蓝牙耳机后,没有异常。所以只有当我在连接时启动应用程序时。这些权限是 在清单文件中。我也用 android:maxSdkVersion="30" 尝试过,但它仍然不起作用。
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
这是build.gradle
compileSdkVersion 33
buildToolsVersion '30.0.0'
defaultConfig {
applicationId "com.my.app"
minSdkVersion 22
targetSdkVersion 33
versionCode 44
versionName "@string/app_version"
multiDexEnabled true
}
这是我的运行时权限。我在 LoginActivity 的 onCreate 方法中请求它们。
@RequiresApi(api = Build.VERSION_CODES.TIRAMISU)
private static final String[] PERMISSIONS_BLUETOOTH_33 = {
Manifest.permission.BLUETOOTH_SCAN,
Manifest.permission.BLUETOOTH_CONNECT,
Manifest.permission.ACCESS_FINE_LOCATION
};
private static final String[] PERMISSIONS_BLUETOOTH = {
Manifest.permission.BLUETOOTH_SCAN,
Manifest.permission.BLUETOOTH_CONNECT,
Manifest.permission.BLUETOOTH,
Manifest.permission.BLUETOOTH_ADVERTISE,
Manifest.permission.BLUETOOTH_ADMIN
};
private String [] getBluetoothPermissions() {
if(Build.VERSION_CODES.TIRAMISU <= Build.VERSION.SDK_INT) {
return PERMISSIONS_BLUETOOTH_33;
}
return PERMISSIONS_BLUETOOTH;
}
private void checkPermissions(){
int permission2 = ActivityCompat.checkSelfPermission(this,
Manifest.permission.BLUETOOTH_SCAN);
int permission3 = ActivityCompat.checkSelfPermission(this,
Manifest.permission.BLUETOOTH_CONNECT);
if (permission2 != PackageManager.PERMISSION_GRANTED && permission3 !=
PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(
this,
getBluetoothPermissions(),
1
);
}
}
这仅适用于 Android 13。我没有尝试 Android 12。 当我使用较低版本的 Android(例如 Android 11 或 Android 10)时,我可以在连接到蓝牙耳机时启动我的应用程序。
我得到的异常如下:
Process: com.my.app, PID: 1907
java.lang.SecurityException: Need android.permission.BLUETOOTH_CONNECT permission for AttributionSource { uid = 10375, packageName = com.my.app, attributionTag = null, token = android.os.BinderProxy@1333f69, next = null }: HeadsetService
at com.android.bluetooth.Utils.checkPermissionForDataDelivery(Utils.java:917)
at com.android.bluetooth.Utils.checkConnectPermissionForDataDelivery(Utils.java:949)
at com.android.bluetooth.hfp.HeadsetService$BluetoothHeadsetBinder.getService(HeadsetService.java:821)
at com.android.bluetooth.hfp.HeadsetService$BluetoothHeadsetBinder.getConnectedDevicesWithAttribution(HeadsetService.java:908)
at android.bluetooth.IBluetoothHeadset$Stub.onTransact(IBluetoothHeadset.java:245)
at android.os.Binder.execTransactInternal(Binder.java:1321)
at android.os.Binder.execTransact(Binder.java:1280)
仅当我在设备已连接到蓝牙耳机时启动应用程序时,才会发生此异常。 当我使用较低版本的 Android(例如 10、11)启动应用程序时,它工作正常。 当我启动应用程序时它也可以工作,启动后我在使用 Android 13 时连接蓝牙耳机。 请帮忙。
确保您在代码中的正确位置检查蓝牙权限。最好在 LoginActivity 的 onCreate 方法中检查权限。此外,不要一次请求所有蓝牙权限,而是考虑根据需要动态请求它们。这使您可以找出导致问题的权限。最后,在不同的 Android 版本(包括 Android 12)上测试您的应用,看看问题是否特定于 Android 13。这可以帮助确定问题是否与 Android 13 中的更改有关,或者是否是更广泛的兼容性问题。