通过蓝牙HID将安卓手机模拟成鼠标和键盘 |
您所在的位置:网站首页 › 蓝牙手柄模拟app › 通过蓝牙HID将安卓手机模拟成鼠标和键盘 |
一直以来就有一种想法,就是自己写一个APP将安卓手机模拟成鼠标/键盘,应急的时候可以用来代替鼠标/键盘。之前也在国内外的网站上找了各种方案,但是这些方案不是很好,直到谷歌发布的API28后终于有了很好的解决方案。为了实现这个想法也走了不少弯路,也许方法不对吧,但看到最终完美运行的APP,心中还是很有成就感的。经测试装了此APP的手机能与几乎所有安卓手机、WIN10笔记本电脑连接并操作,苹果设备需要IOS13及以上版本才能支持蓝牙鼠标/键盘。苹果系统下鼠标功能正常,键盘输入文字没问题,但是其它功能键(如:Win,Menu,PageUp/Down,上下左右键...)则没什么作用。 BluetoothHidDevice android.bluetooth.BluetoothHidDevice是完成任务的核心类。通过它将我们的应用注册成具有HID特征的蓝牙设备,并传送HID设备的报告描述符。如果我们的报告描述符没有问题,那么我们的设备就会成功模拟想要的HID设备。 码砖思路 首先将我们的应用注册为HID设备; BluetoothAdapter.getDefaultAdapter().getProfileProxy(context, mProfileServiceListener,BluetoothProfile.HID_DEVICE); public static BluetoothProfile.ServiceListener mProfileServiceListener = new BluetoothProfile.ServiceListener() { @Override public void onServiceDisconnected(int profile) { } @SuppressLint("NewApi") @Override public void onServiceConnected(int profile, BluetoothProfile proxy) { bluetoothProfile = proxy; if (profile == BluetoothProfile.HID_DEVICE) { HidDevice = (BluetoothHidDevice) proxy; HidConsts.HidDevice = HidDevice; BluetoothHidDeviceAppSdpSettings sdp = new BluetoothHidDeviceAppSdpSettings(HidConsts.NAME, HidConsts.DESCRIPTION, HidConsts.PROVIDER,BluetoothHidDevice.SUBCLASS1_COMBO, HidConsts.Descriptor); HidDevice.registerApp(sdp, null, null, Executors.newCachedThreadPool(), mCallback); } } }; public static final BluetoothHidDevice.Callback mCallback = new BluetoothHidDevice.Callback() { @Override public void onAppStatusChanged(BluetoothDevice pluggedDevice, boolean registered) { } @Override public void onConnectionStateChanged(BluetoothDevice device, int state) { if(state == BluetoothProfile.STATE_DISCONNECTED){ HidUitls.IsConnected(false); if(connectionStateChangeListener != null){ connectionStateChangeListener.onDisConnected(); } }else if(state == BluetoothProfile.STATE_CONNECTED){ HidUitls.IsConnected(true); if(connectionStateChangeListener != null){ connectionStateChangeListener.onConnected(); } }else if(state == BluetoothProfile.STATE_CONNECTING){ if(connectionStateChangeListener != null){ connectionStateChangeListener.onConnecting(); } } } }; 然后判断想要连接的蓝牙设备有没有配对过(双方都要配对好),如果没有配对则需要建立配对; public static boolean Pair(String deviceAddress){ if(BluetoothAdapter.checkBluetoothAddress(deviceAddress)){ try { mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if(BtDevice == null){ BtDevice = mBluetoothAdapter.getRemoteDevice(deviceAddress); } if(BtDevice.getBondState() == BluetoothDevice.BOND_NONE){ BtDevice.createBond(); return false; }else if(BtDevice.getBondState() == BluetoothDevice.BOND_BONDED){ return true; }else if(BtDevice.getBondState() == BluetoothDevice.BOND_BONDING){ return false; } }catch (Exception ex){ ex.printStackTrace(); } } return false; } 配对完成后获取蓝牙设备的MAC地址,用MAC地址连接目标设备; public static boolean Connect(String deviceAddress){ if(TextUtils.isEmpty(deviceAddress)){return false;} mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if(BtDevice == null){ BtDevice = mBluetoothAdapter.getRemoteDevice(deviceAddress); } boolean ret = HidDevice.connect(BtDevice); return ret; }IOS13相关设置
安装了HidDroid后的安卓机要控制苹果手机需要做如下设置,在苹果手机上找到:设置->辅助功能->触控->辅助触控->设备,选择已经配对并连接的安卓手机,设置成功后屏幕上出现一个白色的球,这个球就是鼠标指针。
在鼠标键盘的基础上新增多媒体控制功能,媒体控制包含7个功能,分别是:上一首、下一首、音量+、音量-,停止播放、播放/暂停、静音。在实现HID媒体播放的过程中发现,安卓对报告描述符的兼容性非常好,只要看上去正确的描述符运行起来基本没有问题,而win10就没有那么好的兼容性了,从理论上分析正确的描述符不一定能在win10下工作。经过了不知多少次的尝试后终于能够编写出兼容win10的描述符。还有,既然能兼容安卓,那么智能电视的媒体控制自然是不在话下的。
下面看看效果:
说明:在win10下用Media Player播放视频,上一首、下一首功能是后退/快进,用音乐播放器时才是切歌。如果手机上没有安装音乐播放器则切歌/播放/暂停/停止功能不起作用,只能调节音量。 就在实现了媒体控制的功能后,偶然在微软的网站上看到了显示器亮度调节相关的HID描述符,果断决定试试。看看微软官网怎么描述显示器亮度调节的:https://docs.microsoft.com/zh-cn/windows-hardware/drivers/hid/display-brightness-control
源码下载地址 本文源码下载地址:《仅通过蓝牙HID将安卓手机模拟成鼠标和键盘》源码 多文源码打包下载: 《仅通过蓝牙HID将安卓手机模拟成鼠标和键盘》+《通过蓝牙让安卓手机成为PC游戏方向盘手柄-支持旋转轮胎》两份源码打包下载 《仅通过蓝牙HID将安卓手机模拟成鼠标和键盘》+《蓝牙HID TouchScreen协议让你的安卓手机变成触摸屏》两份完整源码打包下载 《仅通过蓝牙HID将安卓手机模拟成鼠标和键盘》+《蓝牙HID TouchScreen协议让你的安卓手机变成触摸屏》+《通过蓝牙将安卓手机模拟成游戏方向盘-支持旋转轮胎》三份源码打包下载 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |