600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > android变身蓝牙键鼠 使用BluetoothHidDevice将安卓手机同时模拟成鼠标和键盘

android变身蓝牙键鼠 使用BluetoothHidDevice将安卓手机同时模拟成鼠标和键盘

时间:2018-12-28 19:47:16

相关推荐

android变身蓝牙键鼠 使用BluetoothHidDevice将安卓手机同时模拟成鼠标和键盘

一直以来就有一种想法,就是自己写一个APP将安卓手机模拟成鼠标/键盘,应急的时候可以用来代替鼠标/键盘。之前也在国内外的网站上找了各种方案,但是这些方案不是很好,直到谷歌发布的API28后终于有了很好的解决方案。为了实现这个想法也走了不少弯路,也许方法不对吧,但看到最终完美运行的APP,心中还是很有成就感的。经测试装了此APP的手机能与几乎所有安卓手机、WIN10笔记本电脑连接并操作,苹果设备需要IOS13及以上版本才能支持蓝牙鼠标/键盘。苹果系统下鼠标功能正常,键盘输入文字没问题,但是其它功能键(如:Win,Menu,PageUp/Down,上下左右键…)则没什么作用。

BluetoothHidDeviceandroid.bluetooth.BluetoothHidDevice是完成任务的核心类。通过它将我们的应用注册成具有HID特征的蓝牙设备,并传送HID设备的报告描述符。如果我们的报告描述符没有问题,那么我们的设备就会成功模拟想要的HID设备。

码砖思路首先将我们的应用注册为HID设备;BluetoothAdapter.getDefaultAdapter().getProfileProxy(context,mProfileServiceListener,BluetoothProfile.HID_DEVICE);publicstaticBluetoothProfile.ServiceListenermProfileServiceListener=newBluetoothProfile.ServiceListener(){

@Override

publicvoidonServiceDisconnected(intprofile){}

@SuppressLint("NewApi")@Override

publicvoidonServiceConnected(intprofile,BluetoothProfileproxy){

bluetoothProfile=proxy;

if(profile==BluetoothProfile.HID_DEVICE){

HidDevice=(BluetoothHidDevice)proxy;

HidConsts.HidDevice=HidDevice;

BluetoothHidDeviceAppSdpSettingssdp=newBluetoothHidDeviceAppSdpSettings(HidConsts.NAME,HidConsts.DESCRIPTION,HidConsts.PROVIDER,BluetoothHidDevice.SUBCLASS1_COMBO,HidConsts.Descriptor);

HidDevice.registerApp(sdp,null,null,Executors.newCachedThreadPool(),mCallback);

}

}};publicstaticfinalBluetoothHidDevice.CallbackmCallback=newBluetoothHidDevice.Callback(){

@Override

publicvoidonAppStatusChanged(BluetoothDevicepluggedDevice,booleanregistered){}

@Override

publicvoidonConnectionStateChanged(BluetoothDevicedevice,intstate){

if(state==BluetoothProfile.STATE_DISCONNECTED){

HidUitls.IsConnected(false);

if(connectionStateChangeListener!=null){

connectionStateChangeListener.onDisConnected();

}

}elseif(state==BluetoothProfile.STATE_CONNECTED){

HidUitls.IsConnected(true);

if(connectionStateChangeListener!=null){

connectionStateChangeListener.onConnected();

}

}elseif(state==BluetoothProfile.STATE_CONNECTING){

if(connectionStateChangeListener!=null){

connectionStateChangeListener.onConnecting();

}

}

}};123456789101112131415161718192223242526272829303132333435363738然后判断想要连接的蓝牙设备有没有配对过(双方都要配对好),如果没有配对则需要建立配对;publicstaticbooleanPair(StringdeviceAddress){

if(BluetoothAdapter.checkBluetoothAddress(deviceAddress)){

try{

mBluetoothAdapter=BluetoothAdapter.getDefaultAdapter();

if(BtDevice==null){

BtDevice=mBluetoothAdapter.getRemoteDevice(deviceAddress);

}

if(BtDevice.getBondState()==BluetoothDevice.BOND_NONE){

BtDevice.createBond();

returnfalse;

}elseif(BtDevice.getBondState()==BluetoothDevice.BOND_BONDED){

returntrue;

}elseif(BtDevice.getBondState()==BluetoothDevice.BOND_BONDING){

returnfalse;

}

}catch(Exceptionex){ex.printStackTrace();}

}

returnfalse;}12345678910111213141516171819配对完成后获取蓝牙设备的MAC地址,用MAC地址连接目标设备;publicstaticbooleanConnect(StringdeviceAddress){

if(TextUtils.isEmpty(deviceAddress)){returnfalse;}

mBluetoothAdapter=BluetoothAdapter.getDefaultAdapter();

if(BtDevice==null){

BtDevice=mBluetoothAdapter.getRemoteDevice(deviceAddress);

}

booleanret=HidDevice.connect(BtDevice);

returnret;}123456789

IOS13相关设置安装了HidDroid后的安卓机要控制苹果手机需要做如下设置,在苹果手机上找到:设置->辅助功能->触控->辅助触控->设备,选择已经配对并连接的安卓手机,设置成功后屏幕上出现一个白色的球,这个球就是鼠标指针。

代码运行效果

让你的安卓手机变成键盘鼠标

.11.11编辑最近一段时间研究了在鼠标键盘的基础上新增多媒体控制功能。媒体控制包含7个功能,分别是:上一首、下一首、音量+、音量-,停止播放、播放/暂停、静音。在实现HID媒体播放的过程中发现,安卓对报告描述符的兼容性非常好,只要看上去正确的描述符运行起来基本没有问题,而win10就没有那么好的兼容性了,从理论上分析正确的描述符不一定能在win10下工作。经过了不知多少次的尝试后终于能够编写出兼容win10的描述符。还有,既然能兼容安卓,那么智能电视的媒体控制自然是不在话下的。下面看看效果:

[win10下媒体控制效果]

[ios13媒体控制效果]

说明:在win10下用Media Player播放视频,上一首、下一首功能是后退/快进,用音乐播放器时才是切歌。如果手机上没有安装音乐播放器则切歌/播放/暂停/停止功能不起作用,只能调节音量。

.11.15编辑就在实现了媒体控制的功能后,偶然在微软的网站上看到了显示器亮度调节相关的HID描述符,果断决定试试。看看微软官网怎么描述显示器亮度调节的:/zh-cn/windows-hardware/drivers/hid/display-brightness-control

可以看出这里用了2bit来表示,我们在实现媒体控制的时候用来7个按钮分别对应7个bit,要将亮度控制集成进来就需要9个bit,显然超过一个字节。纠结半天将媒体控制的停止功能去掉,因为播放/暂停可以实现类似的功能。看到这里你也许会问,报告描述符一个Main Item不能超过8个Control?比如给他9个Control,然后再用7个Bit的Padding填充?这些我都试了,在安卓里虽然不能调节屏幕亮度,其它功能是不受影响的,但是到win10所有功能都受影响了。最后的结论是,暂时将所有Control控制在一个字节内,超过一个字节的Control再慢慢研究。

[多媒体控制界面]

[win10亮度调节]最后再强调下,这个亮度调节目前只有微软的win8/win10支持,而且是移动设备(使用电池供电的设备),如果找到Mac和Linux的亮度调节Usage再做兼容。

.11.22编辑最近家里新添了小度X8智能屏音响,用HidDroid连接小度X8也是没有问题的,意外的是发现调节屏幕亮暗的功能在小度X8的DuerOS下也能得到支持,音量调节也是可以的。

下面一篇博客谈谈如何通过蓝牙将安卓手机模拟成游戏方向盘:通过蓝牙让安卓手机成为PC游戏方向盘手柄-支持旋转轮胎

完整源码下载地址

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。