项目是TV端的,产品要求不经过设置界面,开机进入引导页,自动搜索蓝牙遥控器并且建立连接。
刚开始接手的时候以为会很快完成,无非就是调用API吗?可是事实不是这样,前后花了一些时间,才解决。
好了,当时尝试了Socket连接以及低功耗连接BLE,事实证明都不可行,后来就在想设置界面是怎么连接的呢,终于找到了答案。
蓝牙设置界面入口在BluetoothSettings.java,这个BluetoothSettings继承自DeviceListPreferenceFragment.java。点击某个搜索到的蓝牙列表项之后,走的流程如下:

 void onClicked() {int bondState = mCachedDevice.getBondState();if (mCachedDevice.isConnected()) {askDisconnect();} else if (bondState == BluetoothDevice.BOND_BONDED) {mCachedDevice.connect(true);} else if (bondState == BluetoothDevice.BOND_NONE) {pair();}}

在这个方法里面对当前蓝牙设备状态进行判断,如果没有绑定上,去pair,绑定上了
进行连接,调用的mCachedDevice.connect(true);这个mCachedDevice是
/Settings/src/com/android/settings/bluetooth/CachedBluetoothDevice.java
我们看下其中具体实现:

  public void connect(boolean connectAllProfiles) {//如果没有连接上,返回if (!ensurePaired()) {return;}mConnectAttempted = SystemClock.elapsedRealtime();connectWithoutResettingTimer(connectAllProfiles);}

具体实现在connectWithoutResettingTimer方法中,我们看最终其调用的方法:

  synchronized void connectInt(LocalBluetoothProfile profile) {if (!ensurePaired()) {return;}if (profile.connect(mDevice)) {if (Utils.D) {Log.d(TAG, "Command sent successfully:CONNECT " + describe(profile));}return;}Log.i(TAG, "Failed to connect " + profile.toString() + " to " + mName);}

这个profile是什么呢?它的意义很大,其实代表我们蓝牙协议具体实现接口,蓝牙连接的设备有很多种,我们的蓝牙遥控器属于Hid设备,是其中之一,HidProfile是Hid连接协议,一层层查找,最终找到蓝牙连接的最终实现在framework/base/core/java/android/bluetooth/BluetoothInputDevice.java。

    /*** Initiate connection to a profile of the remote bluetooth device.** <p> The system supports connection to multiple input devices.** <p> This API returns false in scenarios like the profile on the* device is already connected or Bluetooth is not turned on.* When this API returns true, it is guaranteed that* connection state intent for the profile will be broadcasted with* the state. Users can get the connection state of the profile* from this intent.** <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}* permission.** @param device Remote Bluetooth Device* @return false on immediate error,*               true otherwise* @hide*/public boolean connect(BluetoothDevice device) {if (DBG) log("connect(" + device + ")");Log.d(TAG,"mService is null ?"+ mService==null);if (mService != null && isEnabled() && isValidDevice(device)) {try {
                return mService.connect(device);} catch (RemoteException e) {Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                return false;}}if (mService == null) Log.w(TAG, "Proxy not attached to service");
        return false;}

从该方法的注释中就可以看出,该方法就是用来连接Hid蓝牙设备的,好了,所以我们最终只要把这个类的方法调用起来就可以了,这个类直接SDK是获取不到的,不过也不要直接反射这个类,我们可以通过BluetoothAdapter的getProfileProxy方法获取到该类对象。

在其回调中,反射调用connect方法。

好了,到这里就大功告成啦~~

Android 蓝牙遥控器的连接相关推荐

  1. android 蓝牙 遥控器,Android 蓝牙遥控器的连接

    项目是TV端的,产品要求不经过设置界面,开机进入引导页,自动搜索蓝牙遥控器并且建立连接. 刚开始接手的时候以为会很快完成,无非就是调用API吗?可是事实不是这样,前后花了一些时间,才解决. 好了,当时 ...

  2. android+蓝牙遥控器,一种通过蓝牙遥控安卓设备的方法与流程

    本发明涉及安卓系统遥控领域,具体公开了一种通过蓝牙遥控安卓设备的方法. 背景技术: 随着数字技术的发展,人们使用的数字设备日新月异.现在最为常见的个人设备操作系统是安卓系统.对安卓设备控制的方式,最常 ...

  3. Android蓝牙遥控器

    这是以前做的一个手机蓝牙遥控器,原本是用来控制一个微型四旋翼的.四旋翼做了第二版后改NRF2401控制了,所以这个程序最终还是没用,下面介绍一下这个程序的关键代码. 连接的对象是一个蓝牙4.0模块,连 ...

  4. Android 蓝牙hfp协议连接slc连接rfcomm连接源码分析(2)- HF侧发送和接受数据流程

    android-蓝牙A2dp-avrcp-hfp-opp-配对流程-ble-rfcomm源码流程 Android 蓝牙hfp初始化.rfcomm连接.slc连接.sco连接源代码分析大全 - 点击下载 ...

  5. Android 蓝牙扫描枪连接状态变化(连接、断开)界面实屏幕会实时刷新重构一次

    场景:Android设备连接蓝牙扫描枪,扫描条形码,获取扫描内容,进行支付,支付成功后到达成功界面,在onCreate()方法中初始化打印小票. 问题:停留在支付成功界面,蓝牙状态发生变化(断开--连 ...

  6. android蓝牙投屏连接不上,乐播投屏常见使用问题汇总

    原标题:乐播投屏常见使用问题汇总 鉴于乐播投屏是智能电视端投屏使用频率很高的软件,这里蜜蜂市场为大家汇总下在使用乐播投屏的过程中,一些常见的使用问题,大家可以自行参考解决: 请先给智能电视安装乐播投屏 ...

  7. android蓝牙配对加连接,android – 配对设备的蓝牙自动连接

    我是新来的,我已经阅读了很多你的帖子,但仍然没有找到问题的解决方案. 我正在为Android 2.2编写一个使用蓝牙连接到终端设备的应用程序. 我有一个配对设备列表,我可以将我的Android平板电脑 ...

  8. Android蓝牙遥控器(通过手机蓝牙与蓝牙模块通信)

    前些天学弟让我给他整理之前一起做项目时的与下位机通信的部分代码.当时使用蓝牙编程,Android端通过蓝牙发送指令到蓝牙模块,硬件那里通过蓝牙模块读取到指令,并执行相应操作.由于那段代码时在工程里的, ...

  9. Android 蓝牙遥控器调试记录

    1.adb连接机器 adb connect 机器IP:5555 2.shell进入 C:\Users\Administrator>adb shell 3.输入getevent查看按键对应值,以及 ...

最新文章

  1. Android DHCP 启动分析【2】
  2. 环境变量 何时source /etc/profile
  3. 2字段添加注释_Tableau学习系列(7):计算字段
  4. 齐博php百度编辑器上传图片_php版百度编辑器ueditor怎样给上传图片自动添加水印?...
  5. 数据结构之线性表(附代码)
  6. 具有Ubuntu和Azure Data Studio的Linux上SQL Server 2019
  7. 11.15PMP试题每日一题
  8. js封装cookie
  9. Mac 下修改文件的 md5 值
  10. Eclipse中maven项目update project后项目编码会自动变成GBK的问题
  11. pytorch根据开放场景语音文字合成新语音(VoiceLoop)
  12. 服务网关 Zuul基本使用
  13. 股票查询接口功能是什么?
  14. Avoid object allocations during draw/layout operations
  15. All flavors must now belong to a named flavor dimension
  16. Javascript进阶笔记
  17. 混合竞价模式下,开发者如何制定价格策略?
  18. 脑机接口系列课程(二) SSVEP介绍及相关软件的安装、实验范式的搭建
  19. __gcd(x,y)函数 最大公约数
  20. ITOP4412 OV5640摄像头模块

热门文章

  1. 7月发布?华为李昌竹确认Mate 50系列:会来的但不是现在
  2. 游戏业界“大地震”!687亿美元,微软天价收购动视暴雪
  3. 三星Galaxy S22 Ultra发布推迟:此前至少5款骁龙8平台旗舰亮相
  4. 贝索斯的蓝色起源被21名员工投诉
  5. 高通宣布与蔚来合作下一代数字座舱技术
  6. 小米11终于来了,12月28日见!
  7. 苹果关闭iOS 14.1验证通道,阻止 iOS 14.2 降级
  8. 商家自述:今年双11,我们更难了
  9. 4400元起!iPhone 12全系售价曝光:标配数据线但无充电器
  10. Redmi发布98寸电视:屏占比98.8%、价格仅为友商1/5