通过蓝⽛HID将安卓⼿机模拟成⿏标和键盘
⼀直以来就有⼀种想法,就是⾃⼰写⼀个APP将安卓⼿机模拟成⿏标/键盘,应急的时候可以⽤来代替⿏标/键盘。之前也在国内外的⽹站上了各种⽅案,但是这些⽅案不是很
好,直到⾕歌发布的API28后终于有了很好的解决⽅案。为了实现这个想法也⾛了不少弯路,也许⽅法不对吧,但看到最终完美运⾏的APP,⼼中还是很有成就感的。经测试装
题,但是其它功能键(如:Win,Menu,PageUp/Down,上下左右键...)则没什么作⽤。
BluetoothHidDevice
android.bluetooth.BluetoothHidDevice是完成任务的核⼼类。通过它将我们的应⽤注册成具有HID特征的蓝⽛设备,并传送HID设备的报告描述符。如果我们的报告描述符没有问
题,那么我们的设备就会成功模拟想要的HID设备。
码砖思路
1. ⾸先将我们的应⽤注册为HID设备;
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;227肖战事件全过程
HidConsts.HidDevice = HidDevice;
BluetoothHidDeviceAppSdpSettings sdp = new BluetoothHidDeviceAppSdpSettings(HidConsts.NAME, HidConsts.DESCRIPTION, HidConsts.PROVIDER,BluetoothHidDevice.SUBCLASS1_COMBO, HidConsts.Descriptor); isterApp(sdp, null, null, wCachedThreadPool(), 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){
}
}else if(state == BluetoothProfile.STATE_CONNECTED){
HidUitls.IsConnected(true);
if(connectionStateChangeListener != null){
}
}else if(state == BluetoothProfile.STATE_CONNECTING){
白静老公if(connectionStateChangeListener != null){
中国移动手机积分兑换商城}
}
}
};
2. 然后判断想要连接的蓝⽛设备有没有配对过(双⽅都要配对好),如果没有配对则需要建⽴配对;
public static boolean Pair(String deviceAddress){
if(BluetoothAdapter.checkBluetoothAddress(deviceAddress)){
try {
mBluetoothAdapter = DefaultAdapter();
我不是药神 原型if(BtDevice == null){
BtDevice = RemoteDevice(deviceAddress);
}
BondState() == BluetoothDevice.BOND_NONE){
return false;
}else BondState() == BluetoothDevice.BOND_BONDED){
return true;
}else BondState() == BluetoothDevice.BOND_BONDING){
return false;
}
}catch (Exception ex){ ex.printStackTrace(); }
}调酒师培训学费多少
return false;
}
3. 配对完成后获取蓝⽛设备的MAC地址,⽤MAC地址连接⽬标设备;
public static boolean Connect(String deviceAddress){
if(TextUtils.isEmpty(deviceAddress)){return false;}
mBluetoothAdapter = DefaultAdapter();
if(BtDevice == null){
BtDevice = RemoteDevice(deviceAddress);
}
boolean ret = t(BtDevice);
return ret;
}
安卓对报告描述符的兼容性⾮常好,只要看上去正确的描述符运⾏起来基本没有问题,⽽win10就没有那么好的兼容性了,从理论上分析正确的描述符不⼀定能在win10下⼯作。
经过了不知多少次的尝试后终于能够编写出兼容win10的描述符。还有,既然能兼容安卓,那么智能电视的媒体控制⾃然是不在话下的。
下⾯看看效果:
[ios13媒体控制效果]
说明:在win10下⽤Media Player播放视频,上⼀⾸、下⼀⾸功能是后退/快进,⽤⾳乐播放器时才是切歌。如果⼿机上没有安装⾳乐播放器则切歌/播放/暂停/停⽌功能不起作
⽤,只能调节⾳量。
完整源码下载地址
发布评论