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