为了提高蓝牙手柄的连接成功率,实现自动连接蓝牙手柄,替代用户手动连接蓝牙手柄的整个流程。

首先,我们将“连接蓝牙手柄”这个步骤拆分开来,可以细分为搜索、识别、配对、连接四个步骤。为了能够提升自动连接蓝牙手柄的成功率,需要把自动连接的各个流程步骤作为切入点,进行优化,来提升成功率:

一、搜索

在开发的过程中,会发现在启动蓝牙设备搜索的时候,当手柄晚一点时间开启开关,小部分手机或是tv会搜索不到手柄,怀疑是厂商进行了优化,系统在一定时间内搜索不到蓝牙设备,会停止搜索,因为startDiscovery是十分消耗性能的操作。
虽然我们的搜索超时时间设置为30s,但是后半段时间几乎是空等,没有利用上的。因此在在搜索的过程中,我将30s分为两半,假如当前15s没有搜索到蓝牙手柄的时候,后15s会取消前一次搜索,重新启动一次搜索,增加了搜索到蓝牙手柄的概率;

二、识别

最初是通过获取搜索到的蓝牙设备的名称,然后与蓝牙手柄名单关键字列表进行匹配,判断是否属于蓝牙手柄。但是存在一些边界情况,比如当手机的名称修改为含有手柄关键字名称的时候,就会出现误判情况。手柄关键字名单的更新也存在不实时的问题。
所以在后面通过蓝牙设备的类型进行识别,在系统API中Major代表设备的主要功能类型,通过demo验证各种手柄,发现Major都是属于PERIPHERAL类型,即外设类型。

但是在手机的系统蓝牙页面可以看到,虽然都是蓝牙手柄设备,同属于外设类型,但是不用厂商的手柄居然会显示不同的图标。

于是通过源码去寻找细分外设类型的方法。在系统源码中的BluetoothDevicePrefenence.java,可以发现系统将外设又区分为三种:PERIPHERAL_KEYBOARD、PERIPHERAL_KEYBOARD_POINTING、PERIPHERAL_POINTING和其他。

最后是为了适配不同厂商的蓝牙手柄,决定只要是满足主功能类型是外设,即识别为蓝牙手柄设备。

三、配对

配对这个操作相当于用户在系统蓝牙页面的为匹配设备列表中点击蓝牙设备。通过阅读系统源码后,发现了在识别到蓝牙手柄设备后,就需要开始创建匹配,通过反射调用createBond,将识别为蓝牙手柄设备进行配对。

但是在开发过程中,有时候会出现配对失败的情况,往往是两者已经配对,但是手柄却无法自动连接上。这个时候采用重试机制,在createBond返回false的时候,取消配对removeBond,再重新创建配对,提高配对成功率。

四、连接

连接步骤,同样通过反射调用connect,连接已配对的设备。

五、总结

1)很多问题的解决,可以通过阅读系统源码找到方法;
2)对于碎片化的问题,需要进行适配,才能提升成功率,减少折损;
3)无论是性能优化,还是流程效率的提升、折损的减少,都需要针对各个流程步骤,逐个进行问题的定位,定位的方式可以通过打log或是统计数据的收集、提取;
4)问题定位之后,就需要进行逻辑优化,可以通过修改策略,增加重试机制或是增加触发的时机点等其他方式;

Android 蓝牙手柄连接流程解析和自动化方案相关推荐

  1. Android蓝牙手柄开发

    手柄相应的按键 摇杆监听(已连接状态) 通过google找到官方示例https://developer.android.com/training/game-controllers/controller ...

  2. Android蓝牙A2DP连接实现

    代码地址如下: http://www.demodashi.com/demo/14624.html 开发环境: 开发工具:Androidstudio 适配机型:honor8(Android6.0), 坚 ...

  3. android 蓝牙自动断开,Android蓝牙:连接()/断开()

    我目前正在设计一个应用程序,它需要连接到设备,写入/读取数据,并可靠地关闭连接.目前我有写/读固体.我的断开连接然后重新连接非常不可靠,并且经常实际上使手机崩溃.我一直在寻找通过大量文章试图弄清楚和. ...

  4. FC30蓝牙手柄连接小米手机3试玩-经典红白机的回忆

    每个人都有不一样的儿时记忆,但是对于男孩子来说,有一个记忆是我们共同拥有的,那就是NES(FC),在欧洲发布的版本为NES,全称是Nintendo Entertainment System,而在亚洲发 ...

  5. MakeBlock mbot 和 ultimate2.0 的 蓝牙手柄 通讯格式解析

    结果前置,废话往后放 蓝牙连接信息: BLE: DeviceName:Makeblock_LExxxxxxxxxxxx ServiceID:{0000ffe1-0000-1000-8000-00805 ...

  6. android蓝牙设置名称流程,Android 8 设置蓝牙名称 流程

    记录android 8设置蓝牙名称的流程.java packages/apps/Settings/src/com/android/settings/bluetooth/BluetoothDeviceR ...

  7. android 实现蓝牙自动配对连接,Android实践 -- Android蓝牙设置连接

    蓝牙开发相关 使用Android Bluetooth APIs将设备通过蓝牙连接并通信,设置蓝牙,查找蓝牙设备,配对蓝牙设备 连接并传输数据,以下是Android系统提供的蓝牙相关的类和接口 Blue ...

  8. android 蓝牙自动连接,蓝牙自动连接实现

    实现的主要功能(蓝牙配对成功如何与远程设备一直连接) 1.当蓝牙配对成功连接时,断开远程端设备会自动连接 2.当设备长时间锁屏会导致CachedBluetoothDevice自动清空,如果蓝牙断开就不 ...

  9. android 蓝牙串口连接不上,安卓手机搜索不到蓝牙模块HC-06,是怎么回事?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 问题0010:蓝牙串口模块使用的正确步骤 很多人现在都开始使用蓝口模块,利用手机蓝牙或者PC蓝牙进行控制单片机系统.但是很多人一上来就直接把蓝牙模块和单片 ...

最新文章

  1. [云炬python3玩转机器学习笔记] 3-6Numpy数组和矩阵的合并和分割
  2. centos将某一目录权限给用户_CentOS账号和权限的管理,指定用户目录权限
  3. 用21张图,把Git 工作原理彻底说清楚
  4. 学习threeJS(一)--第一个threeJs
  5. SAP CRM产品主数据工作流相关调试
  6. H - Holy Grail
  7. 学成在线--12.Spring整合RibbitMQ
  8. spring 上下文_一次性教你彻底理解 Spring容器和应用上下文!
  9. nodemanager不能正常关闭_家居燃气安全,燃气阀门的开与关可不能不当回事
  10. python查询数据库后更新_python 实现数据库中数据添加、查询与更新的示例代码...
  11. AWS 之于 K8s,如同 Windows 之于 Linux!
  12. bfs--最小步数--青蛙
  13. 服务器端提交form
  14. [PAT B1020] 月饼
  15. 心理学实验必备 | 脑电实验流程及注意事项
  16. python 中 函数的使用!!!
  17. 锁存器和缓冲器的区别
  18. 分享软件测试实习生的第一天~
  19. 酒店市场消费趋势洞察报告
  20. “大长今热”的六大理由!!

热门文章

  1. 计算机图形学:向量运算(OpenGL)
  2. Java并发编程总结
  3. 从零起步认识XAML
  4. JS中“创建对象”及“通过原型创建对象”浅析
  5. 用样本推断整体,中心极限定理及其一些前提条件
  6. plsql激活码(永久可用)
  7. [转]Win10 莫名卡顿问题解决(1903-1909版本)
  8. vue接口总是请求超时_vue-resource请求超时timeout设置
  9. 报表生成(POI,jquery.table2excel.js,Echarts)
  10. 谷歌账户在别的网上登过_如何在Google帐户之间转移联系人