安卓BLE蓝牙开发经验分享

发布于:2024-12-18 ⋅ 阅读:(88) ⋅ 点赞:(0)

注意点一:一开始必须申请权限,否则后面根本无法成功。

注意点二:BLE使用向某个特征写入来发送数据,写入一次默认长度是23字节,必须向蓝牙设备申请更大字节的写入才能发送更多字节。(23字节是BLE通信的最小MTU大小)。能申请多大还得看蓝牙服务器情况。

注意点三:比如操作申请更大MTU时候,必须等待申请结果回来之后才能继续执行接下来的蓝牙操作,比如说发现服务。(申请结果在回调函数里面)。如果还没等申请结果出来,马上执行发现服务,那么可能两个都要失败。以此类推,蓝牙操作需要一个一个来。猜测是正在进行空中通信需要时间。

第一步:申请蓝牙权限(非常重要,否则后面没法成功)

1:首先,在AndroidManifest.xml这个文件里面加上权限请求。

权限代码

    <!-- 请求蓝牙权限 -->
    <uses-permission android:name="android.permission.BLUETOOTH"/> <!-- 请求蓝牙权限 -->
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> <!-- 请求蓝牙管理权限 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <!-- 请求精细位置权限,用于BLE扫描 (API 23+) -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <!-- 请求粗略位置权限,用于BLE扫描 (API 23+) -->
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/> <!-- 请求连接已配对蓝牙设备的权限 (API 31+) -->
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN"/> <!-- 请求扫描附近蓝牙设备的权限 (API 31+) -->
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

2:还需要在在activity里面继续申请一次。(会有一些包文件要求导入,按照提示导入)

//========================================先设置一个申请权限结果的回调函数==========================================
  // 动态请求权限,注册ActivityResultLauncher来处理权限请求的结果   请求权限之后的回调函数  判断请求到了什么权限
        permissionLauncher =activity. registerForActivityResult(  //这是个请求权限之后的回调函数
                new ActivityResultContracts.RequestMultiplePermissions(),
                permissions -> {

                    StringBuilder deniedPermissions = new StringBuilder();// 构建一个字符串,用于记录未授权的权限
                    boolean allGranted = true;// 初始化一个布尔值,用于判断所有权限是否都被授权

                    // 遍历权限映射,检查是否有任何权限未被授予
                    for (String key : permissions.keySet()) {
                        // 如果当前权限未被授予,则将所有权限标记为非全部授予
                        if (!permissions.get(key)) {
                            allGranted = false;
                            deniedPermissions.append(key).append(", "); // 将未授予的权限键添加到拒绝权限列表中
                        }
                    }

                    // 如果存在被拒绝的权限,则移除最后一个 逗号 和 空格 以确保格式正确
                    if (deniedPermissions.length() > 0) {
                        deniedPermissions.setLength(deniedPermissions.length() - 2);
                    }
                    // 如果所有权限都被授予,则执行以下操作
                    if (allGranted) {
                        //这里就是全都成功了可以添加自己的程序
                        //ble_status_callback. Permission_requests_all_successful();//处理权限请求成功回调函数

                    } else {
                        ble_status_callback. Permission_request_failed();//处理权限请求失败回调函数
                    }
                }
        );
//=====================================================================================


//=====================================这里开始正式申请权限============================================
        // 定义应用所需权限数组
        String[] permissions = {
                // 请求蓝牙权限,包括蓝牙连接和精确位置访问
                Manifest.permission.BLUETOOTH, // 允许应用程序连接到已配对的蓝牙设备
                Manifest.permission.BLUETOOTH_ADMIN, // 允许应用程序发现和配对蓝牙设备
                Manifest.permission.BLUETOOTH_CONNECT, // 从Android 12开始,允许应用程序连接到蓝牙设备
                Manifest.permission.BLUETOOTH_SCAN, // 从Android 12开始,允许应用程序扫描蓝牙LE设备和服务
                Manifest.permission.ACCESS_FINE_LOCATION // 从Android 6.0开始,蓝牙扫描需要位置权限
        };
        permissionLauncher.launch(permissions);// 使用permissionLauncher发起权限请求
//====================================================================================

(到这里就才算申请成功,才可以继续接下来的蓝牙相关的操作)

(到这里简略说一下接下来的流程。--->扫描BLE设备--->选择想要的BLE设备连接--->查找这个设备下面有什么服务--->查找每个服务下有什么特征--->查找每个特征都有什么权限


网站公告

今日签到

点亮在社区的每一天
去签到