评论

收藏

[Android] Android12申请蓝牙权限说明

移动开发 移动开发 发布于:2022-09-21 14:45 | 阅读数:410 | 评论:0

根据google官方资料,Android 12(API 31) 引入了 BLUETOOTH_SCAN、BLUETOOTH_ADVERTISE 和 BLUETOOTH_CONNECT 权限,可让您的应用扫描附近的设备,而无需请求位置权限。这几个权限是运行时权限,用于查找蓝牙设备、使某个设备可被其他设备检测到,或者与已配对的蓝牙设备通信,必须主动申请。
最近正好又在做蓝牙相关的项目,发现网上的一些资料并不够全面,特整理此文。
权限声明
在Android 6-11的机型上如果使用蓝牙搜索设备,仍然需要请求定位权限和以前的蓝牙权限BLUETOOTH、BLUETOOTH_ADMIN,那么如何声明权限呢?在清单文件中可以使用android:maxSdkVersion="30"限定需要申请权限的Android版本,这样在Android 12及以上机型上,应用详情中的权限列表将不会列出这些权限。如果应用中除蓝牙外其他功能还需要使用定位权限,请勿针对ACCESS_COARSE_LOCATION、ACCESS_FINE_LOCATION这两个权限添加android:maxSdkVersion限制。
<!-- Android 12以下才需要定位权限, Android 9以下官方建议申请ACCESS_COARSE_LOCATION -->
  <uses-permission
    android:name="android.permission.ACCESS_COARSE_LOCATION"
    android:maxSdkVersion="30" />
  <uses-permission
    android:name="android.permission.ACCESS_FINE_LOCATION"
    android:maxSdkVersion="30" />
  <uses-permission
    android:name="android.permission.BLUETOOTH"
    android:maxSdkVersion="30" />
  <uses-permission
    android:name="android.permission.BLUETOOTH_ADMIN"
    android:maxSdkVersion="30" />
  <!-- Android 12在不申请定位权限时,必须加上android:usesPermissionFlags="neverForLocation",否则搜不到设备 -->
  <uses-permission
    android:name="android.permission.BLUETOOTH_SCAN"
    android:usesPermissionFlags="neverForLocation"
    tools:targetApi="s" />
  <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
  <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
特别需要注意的是,Android 12及以上机型,如果想不申请定位权限就能搜索到设备,必须在BLUETOOTH_SCAN权限上加上android:usesPermissionFlags="neverForLocation",否则仍需申请定位权限。
申请权限
private final int REQUEST_PERMISSION_CODE = 1001;
  private void initPermission() {
    List<String> mPermissionList = new ArrayList<>();
    // Android 版本大于等于 12 时,申请新的蓝牙权限
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
      mPermissionList.add(Manifest.permission.BLUETOOTH_SCAN);
      mPermissionList.add(Manifest.permission.BLUETOOTH_ADVERTISE);
      mPermissionList.add(Manifest.permission.BLUETOOTH_CONNECT);
      //根据实际需要申请定位权限
      //mPermissionList.add(Manifest.permission.ACCESS_COARSE_LOCATION);
      //mPermissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
    } else {
      mPermissionList.add(Manifest.permission.ACCESS_COARSE_LOCATION);
      mPermissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
    }
    ActivityCompat.requestPermissions(this, mPermissionList.toArray(new String[0]), REQUEST_PERMISSION_CODE);
  }
参考资料
Android 12 中的新蓝牙权限  |  Android Developers https://developer.android.google.cn/about/versions/12/features/bluetooth-permissions
对蓝牙通讯感兴趣的朋友可以看看我的这个项目
BluetoothChat_one2more: 一对多蓝牙连接示例,基于Google BluetoothChat修改,实现一对多聊天(一个服务端、多个客户端),类似聊天室。
https://github.com/fly263/BluetoothChat_one2more

    —————————————————————————————————————
感谢阅读,欢迎打赏。原创文章,未经允许不得转载。特别鄙视转载不注明出处者!