在部分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. 【MySQL】 批量更改库,表,字段的字符集

    库一级的更改: -- 单个库字符集更改 ALTER DATABASE `ymcd_aisw` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'; ALTER ...

  2. 【Kafka】01 基于Docker环境的单例Kafka搭建

    安装参考: https://www.cnblogs.com/vipsoft/p/13233045.html 环境安装需要 Zookeeper + Kafka 要学习Kafka还需要繁琐的安装配置,所以 ...

  3. 【Scala】08 模式匹配 Match Case

    由Scala封装的一套match case处理,功能比原Java的更为强大 package cn import scala.collection.immutable.IndexedSeqDefault ...

  4. ubuntu 服务器显示 计算显卡的剩余 显存空间 并执行计划任务

    在Ubuntu服务器上需要运行gpu计算任务,由于需要无人值守的在显存空间满足条件的时候运行程序,于是有了自动显示显存的程序及自动运行任务的程序: 自动显示显存: import os import r ...

  5. 9组-Beta冲刺-2/5

    一.基本情况(15分) 队名:不行就摆了吧 组长博客:9组-Beta冲刺-2/5 GitHub链接:https://github.com/miaohengming/studynote/tree/mai ...

  6. stm32g070 usart 中断问题: 开启接收中断 RXNEIE 需要注意ISR的错误类型,否则会进入中断。

    usart 中断问题: 开启接收中断 RXNEIE 需要注意ISR的错误类型,否则会进入中断. 调试时发现,如果ISR的ORE和FE置位,而此时要是使能RX中断(RXNEIE置位)就会进入中断复位程序 ...

  7. Redis相关总结

    一.缓存雪崩.缓存穿透 现象:缓存雪崩:大量缓存同时过期.缓存中间件宕机 缓存穿透:访问不存在key.缓存过期解决:缓存雪崩:设置不同过期时间 缓存穿透:不存在key也存入缓存.使用布隆过滤器.使用分 ...

  8. 平衡搜索树-AVL树 图文详解 (万字长文)

    目录 AVL树 AVL树的概念 AVL树节点的定义: AVL树的插入 基本情况分析 平衡因子对应的操作 旋转操作 分析需要旋转的情况 结论 4种旋转操方法与特征 6种双旋平衡因子特征 代码实现 四种旋 ...

  9. 阿里云CTF and 其他

    RE复现 login_system 这个函数就是判断username,点进去发现是线性方程,用z3解 from z3 import * s=Solver() a=[0]*16 for i in ran ...

  10. 全网最适合入门的面向对象编程教程:43 Python 常用复合数据类型-扩展内置数据类型

    全网最适合入门的面向对象编程教程:43 Python 常用复合数据类型-扩展内置数据类型 摘要: 在 Python 中,内置数据类型(如列表.字典.集合等)非常强大,但在某些情况下,可能需要扩展这些数 ...