在部分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】【常用类】SimpleDateFormat 简单日期格式化类

    Date类的API不易于国际化,大部分基本摈弃了 java.text.SimpleDateFormate 不和语言环境有关的方式来格式化和解析日期的具体类 支持 文本转格式,格式转文本 public ...

  2. 【CentOS】rpm包安装Jdk

    1.系统环境检查 前提情要:[如果是使用虚拟机的Linux系统,强烈建议先打个快照备份一下,以免操作失误无法重来] 首先查看系统是否存在java环境 java -version 因为点选了环境工具,这 ...

  3. Perforce常用命令

    Perforce tirgger trig1 change-submit //depot/... "trig.pl %changelist%" trig1 change-submi ...

  4. SCC缩点模板

    struct SCC { int top = 0, cntscc = 0, dfncnt = 0, n; vector<int> dfn, low, stk, instk; vector& ...

  5. Go 链路追踪入门 Opentelemetry

    前言 Opentelemetry 分布式链路跟踪( Distributed Tracing )的概念最早是由 Google 提出来的,发展至今技术已经比较成熟,也是有一些协议标准可以参考.目前在 Tr ...

  6. 【CMake系列】09-cmake install

    本节我们来学习,cmake的安装,将我们构建的目标安装到指定位置,为了模拟一般情况,实现了 可执行文件.静态库.动态库的安装,以及一般的 file 安装.代码的安装 本专栏的实践代码全部放在 gith ...

  7. 初探 Rust 语言与环境搭建

    1. Rust 简介 Rust 的历史 起源:Rust 语言最初由 Mozilla 研究员 Graydon Hoare 于 2006 年开始设计,并于 2009 年首次公开. 开发:Rust 是 Mo ...

  8. 基于surging的产品项目-木舟开源了!

    一 . 概述 因为前段时间电脑坏了,导致代码遗失,踌躇满志马上上线的平台产品付之东流,现在熬夜在写代码希望能尽快推出企业正常使用的平台产品,而这次把代码开源,一是让大家对surging 使用有个深入的 ...

  9. RabbitMQ相关总结

    //connection //channel //broke //exchange:fanout. dirct. topic(*:一个单词.#:多个单词). header //queue //bind ...

  10. TCP/TP协议栈(逐渐更新版)

    TCP/IP协议栈 应用层 DNS协议 传输层 TCP协议 TCP协议报文结构 源端口 目的端口 序列号 确认号 头长度header length or data offset 保留字段reserve ...