在部分Android手机上,当连接上GATTService后直接requestMtu有可能会造成蓝牙连接中断,随后继续重新连接会报错Need BLUETOOTH PRIVILEGED permission

1 //扫描成功后连接gatt
2 BluetoothDevice mRemoteDevice = mBluetoothAdapter.getRemoteDevice(result.getDevice().getAddress());
3 BluetoothGatt mBluetoothGatt = mRemoteDevice.connectGatt(getContext(), false, bluetoothGattCallback);

在 BluetoothGattCallback 监听的 onConnectionStateChange(BluetoothGatt gatt, int status, int newState)方法中直接requestMtu(512) 会直接导致蓝牙断开连接

 1 private int setMTUInt = 512;
2
3
4 @Override
5 public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
6 super.onConnectionStateChange(gatt, status, newState);
7
8 if (newState == BluetoothProfile.STATE_CONNECTED) { //// 连接成功
9 //虽然这里的boolean会为true但是实际上会失败,并且导致蓝牙断开链接
10 boolean requestMtu = gatt.requestMtu(setMTUInt);
11 Log.e(TAG,"设置 requestMtu:"+requestMtu);
12
13 } else if (newState == BluetoothProfile.STATE_DISCONNECTED) { // 连接断开
14 //清除缓存,防止Need BLUETOOTH PRIVILEGED permission
15 refreshDeviceCache();
16 //将MTU的值减少,值可以随意设置
17 setMTUInt -= 100;
18 // 关闭GATT客户端
19 mBluetoothGatt.close();
20 }
21 }

在监听的onMtuChanged(BluetoothGatt gatt, int mtu, int status)方法中,确认mtu设置成功后,再去请求特征值

1 @Override
2 public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {
3 super.onMtuChanged(gatt, mtu, status);
4
5 // 开始查找GATT服务器提供的服务
6 gatt.discoverServices();
7
8 }

随后在监听的onServicesDiscovered(BluetoothGatt gatt, int status)方法中设置特征

@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
super.onServicesDiscovered(gatt, status);
if (status == BluetoothGatt.GATT_SUCCESS) {
//设置特征值
requestCharacteristic();
}
}

清除缓存的方法,gatt本身有提供清除缓存方法,但是不给外部直接调用,所以使用反射的方式进行调用,建议在每次开启扫描设备时也清除一下缓存,防止链接过其他设备后直接链接新设备报错 java.lang.SecurityException: Need BLUETOOTH PRIVILEGED permission: Neither user 10208 nor current process has android.permission.BLUETOOTH_PRIVILEGED.

 1 public boolean refreshDeviceCache() {
2 if (mBluetoothGatt != null) {
3 Log.e(TAG,"清除缓存 refreshDeviceCache");
4 try {
5 BluetoothGatt localBluetoothGatt = mBluetoothGatt;
6 Method localMethod = localBluetoothGatt.getClass().getMethod(
7 "refresh", new Class[0]);
8 if (localMethod != null) {
9 boolean bool = ((Boolean) localMethod.invoke(
10 localBluetoothGatt, new Object[0])).booleanValue();
11 return bool;
12 }
13 } catch (Exception localException) {
14 Log.i(TAG, "An exception occured while refreshing device");
15 }
16 }
17 return false;
18 }

Need BLUETOOTH PRIVILEGED permission以及requestMtu导致蓝牙断连问题的更多相关文章

  1. 【转】Android bluetooth介绍(三): 蓝牙扫描(scan)设备分析

    原文网址:http://blog.csdn.net/xubin341719/article/details/38584469 关键词:蓝牙blueZ  A2DP.SINK.sink_connect.s ...

  2. Android bluetooth介绍(三): 蓝牙扫描(scan)设备分析

    关键词:蓝牙blueZ  A2DP.SINK.sink_connect.sink_disconnect.sink_suspend.sink_resume.sink_is_connected.sink_ ...

  3. cordova之File Transfer (Permission denied) 权限导致下载失败 - 简书

    原文:cordova之File Transfer (Permission denied) 权限导致下载失败 - 简书 在文件上传时,由于权限问题,会报错(Permission denied),安卓6. ...

  4. Privileged Permission开机授权时序图 SourceCode android-10.0.0_r36

    Privileged Permission开机授权时序图 | SourceCode:android-10.0.0_r36 | Author:秋城 | v1.1SystemServerSystemSer ...

  5. 浅谈Bluetooth蓝牙开发

    前言:项目用到蓝牙开发,具体蓝牙获取硬件传感器中的数据. 因为没有蓝牙开发的相关经验,决定先了解一些蓝牙开发的知识,再去看之前同事写的蓝牙相关代码. ------------------------- ...

  6. android -- 蓝牙 bluetooth (三)搜索蓝牙

    接上篇打开蓝牙继续,来一起看下蓝牙搜索的流程,触发蓝牙搜索的条件形式上有两种,一是在蓝牙设置界面开启蓝牙会直接开始搜索,另一个是先打开蓝牙开关在进入蓝牙设置界面也会触发搜索,也可能还有其它触发方式,但 ...

  7. android -- 蓝牙 bluetooth (二) 打开蓝牙

    4.2的蓝牙打开流程这一部分还是有些变化的,从界面上看蓝牙开关就是设置settings里那个switch开关,widget开关当然也可以,起点不同而已,后续的流程是一样的.先来看systemServe ...

  8. iOS - Bluetooth 蓝牙

    1.蓝牙介绍 具体讲解见 蓝牙 技术信息 蓝牙协议栈 2.iBeacon 具体讲解见 Beacon iBeacon 是苹果公司 2013 年 9 月发布的移动设备用 OS(iOS7)上配备的新功能.其 ...

  9. ZT android -- 蓝牙 bluetooth (三)搜索蓝牙

    android -- 蓝牙 bluetooth (三)搜索蓝牙 分类: Android的原生应用分析 2013-05-31 22:03 2192人阅读 评论(8) 收藏 举报 bluetooth蓝牙s ...

  10. ZT android -- 蓝牙 bluetooth (二) 打开蓝牙

    android -- 蓝牙 bluetooth (二) 打开蓝牙 分类: Android的原生应用分析 2013-05-23 23:57 4773人阅读 评论(20) 收藏 举报 androidblu ...

随机推荐

  1. 【Java】Input,Output,Stream I/O流 04 对象流&序列化

    对象流,序列化机制 ObjectInputStream ObjectOutputStream 序列化 对象 写入转 数据 持久化 反序列化 数据 读取转 对象 活化 - 任何实现了Serializab ...

  2. 实用英语:英文中经常出现“ i.e.、e.g.、etc."缩写究竟啥意思?

    地址: https://mp.weixin.qq.com/s?__biz=MzIyMzU5NDE1Mw==&mid=2247487840&idx=1&sn=013992683c ...

  3. 纯css美化滚动条样式

    https://www.emperinter.info/2020/09/20/scrollbar-in-browser/ 自己完善自己博客再Ipad等移动端的菜单时选用了左右滑动的菜单模式!当然就会使 ...

  4. [COCI 2023/2024 #1] Mostovi 题解

    前言 题目链接:洛谷. 题目分析 首先可以确定的是需要枚举断边,所以我们希望两次枚举之间能有些关联.不难想到类树形 DP 的套路,建 DFS 树,只不过这题除了讨论和父亲之间的边,还要考虑返租边.以下 ...

  5. WhaleStudio 2.6重磅发布!调度模块WhaleScheduler更新78项核心功能

    我们很高兴地宣布WhaleStudio 2.6版本的正式发布!新版本中包含了数据调度模块WhaleScheduler和数据集成模块WhaleTunnel的百余项核心功能更新,本文摘选了WhaleSch ...

  6. Leetcode: 586. Customer Placing the Largest Number of Orders

    题目要求如下: 给出的例子如下: 简单地说就是要找出表中订单最多客户的ID. 使用如下的代码进行实现: import pandas as pd def largest_orders(orders: p ...

  7. [学习笔记] MST(最小生成树) - 图论

    [学习笔记] MST(最小生成树) - 图论 MST,最小生成树,一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边.--百度百科 对于 ...

  8. 几款能容易使用的AI绘画工具

    首先介绍一款软件叫做Discord,这是一个非常火爆的社交软件,目前市面上有很多ai绘画工具都可以在在其对应的社区上运行. Discord | 玩耍聊天的地方这个网站可以访问Discord网页版,也可 ...

  9. CAN学习笔记(一)CAN入门

    CAN学习笔记(一)CAN入门 参考链接:https://blog.csdn.net/2301_77952570/article/details/131114941 CAN收发器的作用 发:将TTL电 ...

  10. LaTeX 编译 acmart 文档报错:hyperref must be loaded before hyperxmp.

    在编译一篇从 arXiv 下载的文档时遇到如下错误: Package hyperxmp Error: hyperref must be loaded before hyperxmp. 根据 GitHu ...