项目配置是compileSdkVersion31 targetSdkVersion30 手机升级了Android 12后运行Crash。照理说targetSdkVersion没有用31,怎么会报Android 12的蓝牙权限错误,百思不得其解,先来看看Android12的蓝牙权限。
1.Manifest权限
<manifest>
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
<!--请求旧设备上的蓝牙权限,可设置android:maxSdkVersion为30。这个兼容性步骤帮助系统只授予你的应用程序所需的蓝牙权限,当安装在运行Android 12或更高的设备上。>
<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" />
<!--如果你的应用程序不使用蓝牙扫描结果得出物理位置信息,可以加上usesPermissionFlags声明你的scan结果不会用于推导出物理位置。-->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
<!--仅当你的应用程序使设备可被蓝牙设备发现时需要。 -->
<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" />
<!--在Android 12 如果你确定你的应用程序从来没有从蓝牙扫描结果获取物理位置,则不需要这个权限。-->
<!--在Android 12以下 这个权限是必须要的-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!--如果你的应用程序支持一个服务,并且可以运行在Android 10 (API级别29)或Android 11,你还必须声明ACCESS_BACKGROUND_LOCATION权限来发现蓝牙设备。-->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</manifest>
2.动态请求相关蓝牙权限
BLUETOOTH_ADVERTISE、BLUETOOTH_CONNECT和BLUETOOTH_SCAN权限是运行时权限。因此必须在应用程序中明确请求用户批准,才能查找蓝牙设备,使设备可被其他设备发现,或与已经配对的蓝牙设备通信。当你的应用程序请求这些权限中的至少一个,系统提示用户允许你的应用程序访问附近的设备,如图1所示。
//所以请加上这段代码
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
if (!checkSinglePermission(Manifest.permission.BLUETOOTH_SCAN) ||!checkSinglePermission(Manifest.permission.BLUETOOTH_CONNECT)) {
String[] list =new String[]{Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_CONNECT};
requestPermissions(list, Constants.PERMISSION_REQUEST_SCAN);
}
}
3.为什么闪退
先完成1,2两步, 然后再去做各种蓝牙有关的操作,不然在Android 12 手机上会直接闪退!!
参考链接:
https://stackoverflow.com/questions/67722950/android-12-new-bluetooth-permissions