美文网首页
Android 12 蓝牙权限(解决闪退问题)

Android 12 蓝牙权限(解决闪退问题)

作者: Zoe_and_Android | 来源:发表于2022-01-14 16:22 被阅读0次

项目配置是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.为什么闪退

Google Play / Android Vitals

先完成1,2两步, 然后再去做各种蓝牙有关的操作,不然在Android 12 手机上会直接闪退!!

在EnableBluetooth的文档里有这一句

参考链接:

https://stackoverflow.com/questions/67722950/android-12-new-bluetooth-permissions

https://developer.android.com/guide/topics/connectivity/bluetooth/permissions#assert-never-for-location

相关文章

网友评论

      本文标题:Android 12 蓝牙权限(解决闪退问题)

      本文链接:https://www.haomeiwen.com/subject/qivacrtx.html