android 蓝牙 遥控器,Android 蓝牙遥控器的连接
项目是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 蓝牙遥控器的连接相关推荐
- [笔记分享] [遥控器]Android红外及蓝牙遥控器适配流程
在海思.Amlogic.Mstar平台上适配蓝牙或者红外遥控器,可以按照以下的步骤进行排查和修改. 1.前置工作 1.1 getevent -l 无论是蓝牙遥控器还是红外遥控器,都需要确定其使用的kl ...
- android 蓝牙链接电脑,如何使从台式电脑到Android设备的测试蓝牙连接
我正在使用具有蓝牙适配器的Ubuntu 11.10台式电脑和使用带有蓝牙的Android 2.2的Android平板电脑. (两款设备上的蓝牙版本应为2.0或2.1版本)如何使从台式电脑到Androi ...
- Android ble连接过程,Android开发之ble蓝牙
前言 由于自己工作中需要开发ble的项目,于是在折腾了一段时间后也有所了解,便想写下来分享给大家,同时对自己的知识也是一种巩固 1.BLE介绍 BLE是Bluetooth Low Energy的缩写, ...
- android 蓝牙打印 js,Native.js 安卓连接蓝牙打印机【可连续打印】
自己摸索了一下,并参考其他人的代码,并修复了原来代码存在的问题, 问题1:字符串的getBytes函数,返回null[需要通过new的方式创建字符串] 问题2:初始化打印一次,之后无法使用[不要重复调 ...
- 【Android】蓝牙开发——经典蓝牙:配对与解除配对 实现配对或连接时不弹出配对框
目录 一.配对方法 二.解除配对方法 三.配对/解除配对结果 四.justwork配对模式下,不弹出配对框 五.pincode配对模式下,不弹出配对框 六.小结 在之前的文章[Android]蓝牙开发 ...
- Android实现蓝牙(BlueTooth)设备检测连接
项目要求实现蓝牙设备搜索连接,Android为蓝牙技术提供了4个工具类,分别是蓝牙适配器BluetoothAdapter.蓝牙设备BluetoothDevice.蓝牙服务端套接字BluetoothSe ...
- android蓝牙开启后会尝试自动连接,Android 自动连接蓝牙
蓝牙是手机和智能硬件通信常用的方式,蓝牙通信可分为传统蓝牙和低功耗蓝牙(BLE).其中BLE的连接断开等操作可以通过Android SDK中提供的API进行操作,而传统蓝牙部分SDK并没有提供相关的A ...
- Android蓝牙开发——经典蓝牙的连接
1.蓝牙的基本操作 蓝牙权限 android.permission.BLUETOOTH //允许程序连接到已配对的蓝牙设备,请求连接/接收连接/传输数据需要改权限, 主要用于对配对后进行操作. and ...
- android 连接蓝牙电子秤_Android实现串口通讯—连接有线电子秤
前言 在之前的有讲过Andrpid中USB通讯的文章,大家感兴趣的话,可以参看以下文章: Android实现USB连接 今天就来讲讲Android利用串口实现有线电子秤的连接. 今天涉及以下内容: 电 ...
- android蓝牙开发 蓝牙设备的查找和连接
Android对于蓝牙开发从2.0版本的sdk才开始支持,而且模拟器不支持,测试至少需要两部手机,所以制约了很多技术人员的开发. 1. 首先,要操作蓝牙,先要在AndroidManifest.xml ...
最新文章
- SAP RETAIL 对WG22执行LSMW批量导入物料组描述信息时需要前台执行
- spring核心文件配置头
- 一款超级简单的瀑布流的制作
- tcp转串口_浅谈串口转以太网技术
- Linux的实际操作:文件目录类的实用指令(帮助指令 man help)
- 小程序获取城市经纬度_微信小程序获取当前所在城市的方法
- 谈谈中兴捧月大赛决赛以及总结
- JavaScript 基础一
- ubuntu gif 制作工具
- VLAN中tagged与untagged的处理
- linux 虚拟ip 漂移,keepalived 虚拟ip切换
- 【JavaScript】制作日历
- Windows常用注册表文件-修改右键菜单
- 智能家居 “孤岛”:群雄并起 标准混战
- git pull之后出现REBASE(1/1)
- 产品 • B端和C端产品经理有什么区别?
- Python使用asyncio+aiohttp异步爬取猫眼电影专业版
- 报告| Q3区块链游戏行业全景:玩赚强势驱动,链游热度持续
- (生活篇)职场饭局生存法则
- 支付宝支付回调,回调日志记录
热门文章
- LeetCode 377. Combination Sum IV
- 安卓与IOS抓包软件介绍(无需获取ROOT权限)
- 同步助手64位 v3.2.7.2 官方最新版
- SEO编辑必看:撰写搜索引擎喜爱的标题
- SPI硬件电路设计,SPI协议
- 3. 第三讲 malloc/free
- 电机学习笔记 ADC dma 电流电压采集
- SpringBoot日志文件logback-spring.xml简析
- Android系统源码编译环境搭建(清华镜像,想编译什么版本都可以,只是有JDK和make的版本要求)
- 【Verilog】汉明码