美文网首页
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