Android 13 当设备已连接到蓝牙耳机时需要 android.permission.BLUETOOTH_CONNECT

问题描述 投票:0回答:1

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 时连接蓝牙耳机。 请帮忙。

java android permissions android-bluetooth
1个回答
0
投票

确保您在代码中的正确位置检查蓝牙权限。最好在 LoginActivity 的 onCreate 方法中检查权限。此外,不要一次请求所有蓝牙权限,而是考虑根据需要动态请求它们。这使您可以找出导致问题的权限。最后,在不同的 Android 版本(包括 Android 12)上测试您的应用,看看问题是否特定于 Android 13。这可以帮助确定问题是否与 Android 13 中的更改有关,或者是否是更广泛的兼容性问题。

© www.soinside.com 2019 - 2024. All rights reserved.