项目是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.

*

*

The system supports connection to multiple input devices.

*

*

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.

*

*

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 蓝牙 遥控器,Android 蓝牙遥控器的连接相关推荐

  1. [笔记分享] [遥控器]Android红外及蓝牙遥控器适配流程

    在海思.Amlogic.Mstar平台上适配蓝牙或者红外遥控器,可以按照以下的步骤进行排查和修改. 1.前置工作 1.1 getevent -l 无论是蓝牙遥控器还是红外遥控器,都需要确定其使用的kl ...

  2. android 蓝牙链接电脑,如何使从台式电脑到Android设备的测试蓝牙连接

    我正在使用具有蓝牙适配器的Ubuntu 11.10台式电脑和使用带有蓝牙的Android 2.2的Android平板电脑. (两款设备上的蓝牙版本应为2.0或2.1版本)如何使从台式电脑到Androi ...

  3. Android ble连接过程,Android开发之ble蓝牙

    前言 由于自己工作中需要开发ble的项目,于是在折腾了一段时间后也有所了解,便想写下来分享给大家,同时对自己的知识也是一种巩固 1.BLE介绍 BLE是Bluetooth Low Energy的缩写, ...

  4. android 蓝牙打印 js,Native.js 安卓连接蓝牙打印机【可连续打印】

    自己摸索了一下,并参考其他人的代码,并修复了原来代码存在的问题, 问题1:字符串的getBytes函数,返回null[需要通过new的方式创建字符串] 问题2:初始化打印一次,之后无法使用[不要重复调 ...

  5. 【Android】蓝牙开发——经典蓝牙:配对与解除配对 实现配对或连接时不弹出配对框

    目录 一.配对方法 二.解除配对方法 三.配对/解除配对结果 四.justwork配对模式下,不弹出配对框 五.pincode配对模式下,不弹出配对框 六.小结 在之前的文章[Android]蓝牙开发 ...

  6. Android实现蓝牙(BlueTooth)设备检测连接

    项目要求实现蓝牙设备搜索连接,Android为蓝牙技术提供了4个工具类,分别是蓝牙适配器BluetoothAdapter.蓝牙设备BluetoothDevice.蓝牙服务端套接字BluetoothSe ...

  7. android蓝牙开启后会尝试自动连接,Android 自动连接蓝牙

    蓝牙是手机和智能硬件通信常用的方式,蓝牙通信可分为传统蓝牙和低功耗蓝牙(BLE).其中BLE的连接断开等操作可以通过Android SDK中提供的API进行操作,而传统蓝牙部分SDK并没有提供相关的A ...

  8. Android蓝牙开发——经典蓝牙的连接

    1.蓝牙的基本操作 蓝牙权限 android.permission.BLUETOOTH //允许程序连接到已配对的蓝牙设备,请求连接/接收连接/传输数据需要改权限, 主要用于对配对后进行操作. and ...

  9. android 连接蓝牙电子秤_Android实现串口通讯—连接有线电子秤

    前言 在之前的有讲过Andrpid中USB通讯的文章,大家感兴趣的话,可以参看以下文章: Android实现USB连接 今天就来讲讲Android利用串口实现有线电子秤的连接. 今天涉及以下内容: 电 ...

  10. android蓝牙开发 蓝牙设备的查找和连接

    Android对于蓝牙开发从2.0版本的sdk才开始支持,而且模拟器不支持,测试至少需要两部手机,所以制约了很多技术人员的开发. 1.  首先,要操作蓝牙,先要在AndroidManifest.xml ...

最新文章

  1. SAP RETAIL 对WG22执行LSMW批量导入物料组描述信息时需要前台执行
  2. spring核心文件配置头
  3. 一款超级简单的瀑布流的制作
  4. tcp转串口_浅谈串口转以太网技术
  5. Linux的实际操作:文件目录类的实用指令(帮助指令 man help)
  6. 小程序获取城市经纬度_微信小程序获取当前所在城市的方法
  7. 谈谈中兴捧月大赛决赛以及总结
  8. JavaScript 基础一
  9. ubuntu gif 制作工具
  10. VLAN中tagged与untagged的处理
  11. linux 虚拟ip 漂移,keepalived 虚拟ip切换
  12. 【JavaScript】制作日历
  13. Windows常用注册表文件-修改右键菜单
  14. 智能家居 “孤岛”:群雄并起 标准混战
  15. git pull之后出现REBASE(1/1)
  16. 产品 • B端和C端产品经理有什么区别?
  17. Python使用asyncio+aiohttp异步爬取猫眼电影专业版
  18. 报告| Q3区块链游戏行业全景:玩赚强势驱动,链游热度持续
  19. (生活篇)职场饭局生存法则
  20. 支付宝支付回调,回调日志记录

热门文章

  1. LeetCode 377. Combination Sum IV
  2. 安卓与IOS抓包软件介绍(无需获取ROOT权限)
  3. 同步助手64位 v3.2.7.2 官方最新版
  4. SEO编辑必看:撰写搜索引擎喜爱的标题
  5. SPI硬件电路设计,SPI协议
  6. 3. 第三讲 malloc/free
  7. 电机学习笔记 ADC dma 电流电压采集
  8. SpringBoot日志文件logback-spring.xml简析
  9. Android系统源码编译环境搭建(清华镜像,想编译什么版本都可以,只是有JDK和make的版本要求)
  10. 【Verilog】汉明码