Shun 发表于 2022-9-21 14:45:08

Android12申请蓝牙权限说明

根据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), 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

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

   
   
   
                        

https://www.cnblogs.com/fly263/p/16715525.html
页: [1]
查看完整版本: Android12申请蓝牙权限说明