Android12中蓝牙权限适配

这篇具有很好参考价值的文章主要介绍了Android12中蓝牙权限适配。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

AndroidManifest.xml

<!--maxSdkVersion=30适配到Android11 -->
<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.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!--Android12新增蓝牙权限 -->
<!-- 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" />

代码

//获取蓝牙适配器
public static BluetoothAdapter mBluetoothAdapter = null;
    //蓝牙状态监听广播
    public class BlueToothReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            switch (intent.getAction()) {
                case BluetoothAdapter.ACTION_STATE_CHANGED:
                    int blueState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0);
                    switch (blueState) {
                        case BluetoothAdapter.STATE_TURNING_ON:
                            Log.e("onReceive", "---------蓝牙正在打开中");
                            break;
                        case BluetoothAdapter.STATE_ON:
                            Log.e("onReceive", "---------蓝牙已经打开");
                            mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
                            break;
                        case BluetoothAdapter.STATE_TURNING_OFF:
                            Log.e("onReceive", "---------蓝牙正在关闭中");
                            break;
                        case BluetoothAdapter.STATE_OFF:
                            Log.e("onReceive", "---------蓝牙已经关闭");
                            break;
                    }
                    break;
            }
        }
    }
    private IntentFilter makeFilter() {
        IntentFilter filter = new IntentFilter();
        filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
        return filter;
    }
    //Android12蓝牙权限申请
    private boolean bluePermission(){
    //compileSdkVersion项目中编译SDK版本大于30申请以下权限可使用
    //Manifest.permission.BLUETOOTH_SCAN、Manifest.permission.BLUETOOTH_ADVERTISE、Manifest.permission.BLUETOOTH_CONNECT
    //若小于30可以直接使用权限对应的字符串
        if (Build.VERSION.SDK_INT>30){
            if (ContextCompat.checkSelfPermission(this,
                    "android.permission.BLUETOOTH_SCAN")
                    != PERMISSION_GRANTED
                    || ContextCompat.checkSelfPermission(this,
                    "android.permission.BLUETOOTH_ADVERTISE")
                    != PERMISSION_GRANTED
                    || ContextCompat.checkSelfPermission(this,
                    "android.permission.BLUETOOTH_CONNECT")
                    != PERMISSION_GRANTED){
                ActivityCompat.requestPermissions(this,new String[]{
                                "android.permission.BLUETOOTH_SCAN",
                                "android.permission.BLUETOOTH_ADVERTISE",
                                "android.permission.BLUETOOTH_CONNECT"}, 1);
                return false;
            }
        }
        return true;
    }
    private void openBlueTooth(){
        if (bluePermission())
            mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        else
            return;
        BlueToothReceiver btlr = new BlueToothReceiver();
        this.registerReceiver(btlr, makeFilter());
        if (!mBluetoothAdapter.isEnabled()) {// 判断是否打开蓝牙
            showHandlerToast("请先开启蓝牙!");
            //弹出对话框提示用户是后打开
            Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            //startActivityForResult(intent, SEARCH_CODE);
            // 不做提示,强行打开
            mBluetoothAdapter.enable();
        }
    }

说明:

必须按照这两步申请蓝牙权限,首先在androidManifest.xml中配置蓝牙权限,Android11及以下android.permission.BLUETOOTH、android.permission.BLUETOOTH_ADMIN申请这两个,Android12中蓝牙权限进行新增android.permission.BLUETOOTH_SCAN、android.permission.BLUETOOTH_ADVERTISE、android.permission.BLUETOOTH_CONNECT使用这三个;其次在代码中需要动态申请Android12的蓝牙权限,测试发现Android12中动态申请权限后则蓝牙直接开启,通过对蓝牙状态的监听获取蓝牙适配器:mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

注意:不管是Android12还是Android12以下不打开蓝牙都是无法获取蓝牙适配器:mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();打开蓝牙则可以获取到蓝牙适配器,但若没有申请蓝牙所需权限,蓝牙功能也是无法使用!!!二者缺一不可文章来源地址https://www.toymoban.com/news/detail-503673.html

到了这里,关于Android12中蓝牙权限适配的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android Studio: AndroidManifest.xml:11: AAPT: error: attribute android:dataExtractionRules not found

    Android Studio: AndroidManifest.xml:11: AAPT: error: attribute android:dataExtractionRules not found. flyfish 错误如图 打开AndroidManifest.xml文件 删除 dataExtractionRules 这句

    2024年02月12日
    浏览(54)
  • Android模拟蓝牙蓝牙键盘——适配Android和Windows

    学校寒假有个程序设计比赛,我也一直想要去写一个安卓模拟的蓝牙键盘,这样无论到哪里,比如班班通和没有键盘的电脑设备,有手机就可以操作它,也比USB方便一些。忙活了一个寒假,也走了不少歪路,终于整成了,下面分享一些经验。 (学校的软件设计比赛已经交了终

    2024年04月28日
    浏览(38)
  • 安卓-AndroidManifest.xml修复

    解析编译之后的AndroidManifest文件格式:http://www.520monkey.com/archives/575 案例apk jadx打开发现AndroidManifest.xml异常,无法正常显示 那么我们用apktool反编译试试 可以看到报错了,显示不能解析此xml文件,原因是预期是0x001c0001,得到的是0x01001c00,可以看到是头部出错误了 那么预期的

    2023年04月17日
    浏览(32)
  • AndroidManifest.xml日常笔记

    Bundle主要用于传递数据;它保存的数据,是以key-value(键值对)的形式存在的。 我们经常使用Bundle在Activity之间传递数据,传递的数据可以是boolean、byte、int、long、float、double、string等基本类型或它们对应的数组,也可以是对象或对象数组。当Bundle传递的是对象或对象数组时,必

    2024年02月14日
    浏览(51)
  • Android存储权限完美适配(Android11及以上适配)

    一、Bug简述 一个很普通的需求,需要下载图片到本地,我的三个测试机(荣耀Android10,红米 11 和小米Android 13都没有问题)。 然后,主角登场了,测试的三星Android 13 死活拉不起存储权限弹窗。 想了下,三星的系统可能和小米的系统做了些区别。于是就是看了下存储权限的版

    2024年02月06日
    浏览(48)
  • Android 屏幕适配资源xml的配置方法

    在 Android 中进行屏幕适配是确保应用在不同设备上正常显示的重要步骤之一。资源文件夹的配置是实现屏幕适配的关键之一,以下是一些常见的资源文件夹配置方法,以适应不同屏幕尺寸和密度。 不同屏幕尺寸的适配: res/layout :通常存放默认的布局文件。 res/layout-sw600dp :

    2024年02月12日
    浏览(38)
  • 【Android 10 适配】隐私权限变更

    更详细内容请参考 Android 10 中的隐私权变更 Android 10(API 级别 29)引入了多项功能和行为变更,旨在更好地保护用户的隐私。这些变更让用户更清楚地了解并更好地控制自己的数据及为应用提供的权能。 下面是 Android 10 中与 隐私权限 相关的主要变更。 默认情况下,以 Andr

    2024年01月22日
    浏览(59)
  • Android13适配所有文件管理权限

    很早之前在Android11上面就适配过所有文件管理权限,这次是海外版升级到Android13,由于选择相册用的是第三方库,组内的同事没有上架Google的经验直接就提交代码,虽然功能没有问题,但是上架的时候被打回了,于是记录一下适配工作. 绝大多数需要共享存储空间访问权限的

    2024年01月22日
    浏览(40)
  • Android所有版本的存储权限适配

                 第一步:在Manifest文件添加如下权限          uses-permission android:name=\\\"android.permission.WRITE_EXTERNAL_STORAGE\\\" android:maxSdkVersion=\\\"28\\\" tools:ignore=\\\"ScopedStorage\\\"/              uses-permission android:name=\\\"android.permission.MANAGE_EXTERNAL_STORAGE\\\"/          uses-permission android:name=\\\"android.p

    2024年01月17日
    浏览(35)
  • Android 12+ MQTT适配

    最终的解决方案是下载源码去改。我用的是已经修改好了的库,如果包名要自己的, 要注意: 1. compileSdk 34 和 targetSdk 34 改成33(Android12)或者34(Android13)。 2. 下载的 module 导入。 3. gradle 导入: 4. 配置清单换一下Service: service android:name=\\\"com.somsakelect.android.mqtt.MqttService\\\"

    2024年01月17日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包