【问题标题】:Android 12 Bluetooth PermissionsAndroid 12 蓝牙权限
【发布时间】:2022-01-17 20:06:20
【问题描述】:

我正在尝试使用 BLE 连接到设备,但在 Android 12 上遇到错误。我尝试了很多不同的方法,但找不到任何解决方案。如何申请蓝牙权限?

AndroidManifest.xml

 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 <uses-permission android:name="android.permission.BLUETOOTH"
        android:maxSdkVersion="30" />
 <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
        android:maxSdkVersion="30" />
 <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
 <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
 <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

 <uses-feature android:name="android.hardware.bluetooth_le"
        android:required="true" />

 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

和权限请求代码

private static final String[] BLE_PERMISSIONS = new String[]{
            Manifest.permission.ACCESS_COARSE_LOCATION,
            Manifest.permission.ACCESS_FINE_LOCATION,
    };
    
private static final String[] ANDROID_12_BLE_PERMISSIONS = new String[]{
            Manifest.permission.BLUETOOTH_SCAN,
            Manifest.permission.BLUETOOTH_CONNECT,
            Manifest.permission.ACCESS_FINE_LOCATION,
    };

public static void requestBlePermissions(Activity activity, int requestCode) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
        ActivityCompat.requestPermissions(activity, ANDROID_12_BLE_PERMISSIONS, requestCode);
    else
        ActivityCompat.requestPermissions(activity, BLE_PERMISSIONS, requestCode);
}

错误信息:

Fatal Exception: java.lang.SecurityException
Need android.permission.BLUETOOTH_CONNECT permission for android.content.AttributionSource@3d290817: GattService registerClient

【问题讨论】:

  • 能否请您edit您的问题并添加完整的错误消息?
  • 请求权限的时候不应该传一个拥有所有权限的数组吗?
  • 你能检查一下你是否已经拥有权限吗? Here 代码中的一个示例。是否出现请求权限的运行时弹出窗口?
  • 我正在检查它是否已经拥有权限。是的,会出现一个运行时弹出窗口,询问权限。当我授予权限时,它会在开始扫描时崩溃。 @fabik111
  • @Enes 建议你重写onRequestPermissionsResult函数,这样你就可以得到请求权限操作的结果了。

标签: android permissions bluetooth bluetooth-lowenergy android-12


【解决方案1】:

它看起来应该可以工作,但如果您实际上不需要位置权限,我会建议以下。

<uses-permission
    android:name="android.permission.BLUETOOTH_SCAN"
    android:usesPermissionFlags="neverForLocation"
    tools:targetApi="s" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission
    android:name="android.permission.BLUETOOTH"
    android:maxSdkVersion="30" />
<uses-permission
    android:name="android.permission.BLUETOOTH_ADMIN"
    android:maxSdkVersion="30" />
<uses-permission
    android:name="android.permission.ACCESS_COARSE_LOCATION"
    android:maxSdkVersion="30" />
<uses-permission
    android:name="android.permission.ACCESS_FINE_LOCATION"
    android:maxSdkVersion="30" />

有权限请求

private static final String[] BLE_PERMISSIONS = new String[]{
        Manifest.permission.ACCESS_COARSE_LOCATION,
        Manifest.permission.ACCESS_FINE_LOCATION
};

@RequiresApi(api = Build.VERSION_CODES.S)
private static final String[] ANDROID_12_BLE_PERMISSIONS = new String[]{
        Manifest.permission.BLUETOOTH_SCAN,
        Manifest.permission.BLUETOOTH_CONNECT
};

【讨论】:

    【解决方案2】:

    我也遵循了 android 文档中的代码。如果您在 android os 12 设备上测试和运行,请删除 max sdk 版本 30。

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.BLUETOOTH"/>
         <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
         <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
         <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
         <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    

    除此之外你的代码也不错。

    您可以使用相同的代码来请求运行时蓝牙权限

    private static final String[] BLE_PERMISSIONS = new String[]{
                Manifest.permission.ACCESS_COARSE_LOCATION,
                Manifest.permission.ACCESS_FINE_LOCATION,
        };
        
    private static final String[] ANDROID_12_BLE_PERMISSIONS = new String[]{
                Manifest.permission.BLUETOOTH_SCAN,
                Manifest.permission.BLUETOOTH_CONNECT,
                Manifest.permission.ACCESS_FINE_LOCATION,
        };
    
    public static void requestBlePermissions(Activity activity, int requestCode) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
            ActivityCompat.requestPermissions(activity, ANDROID_12_BLE_PERMISSIONS, requestCode);
        else
            ActivityCompat.requestPermissions(activity, BLE_PERMISSIONS, requestCode);
    }
    

    【讨论】:

      【解决方案3】:

      targetSdkVersio 修复 30。(旧是 31)

      我修复了错误!

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 2021-08-15
      • 2022-11-11
      • 2022-10-06
      • 2023-02-10
      • 2023-01-06
      • 2013-09-01
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多