仅通过蓝牙HID将安卓手机模拟成鼠标和键盘

相关文章:《蓝牙HID TouchScreen协议让你的安卓手机变成触摸屏》

本文源码下载地址:《仅通过蓝牙HID将安卓手机模拟成鼠标和键盘》源码
多文源码打包下载:
《仅通过蓝牙HID将安卓手机模拟成鼠标和键盘》+《蓝牙HID TouchScreen协议让你的安卓手机变成触摸屏》两份源码打包下载
《仅通过蓝牙HID将安卓手机模拟成鼠标和键盘》+《蓝牙HID TouchScreen协议让你的安卓手机变成触摸屏》+《通过蓝牙将安卓手机模拟成游戏方向盘-支持旋转轮胎》三份源码打包下载

【2022.04.21】源码在Android 12中运行注意事项:由于Android 12对蓝牙权限做了调整,取消了位置信息,增加了扫描、广告、连接权限,并且都是运行时动态权限,具体请参考https://developer.android.google.cn/about/versions/12/features/bluetooth-permissions?hl=zh-cn

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

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

码砖思路

  1. 首先将我们的应用注册为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();
            }
        }
    }
};
  1. 然后判断想要连接的蓝牙设备有没有配对过(双方都要配对好),如果没有配对则需要建立配对;
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;
}
  1. 配对完成后获取蓝牙设备的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后的安卓机要控制苹果手机需要做如下设置,在苹果手机上找到:设置->辅助功能->触控->辅助触控->设备,选择已经配对并连接的安卓手机,设置成功后屏幕上出现一个白色的球,这个球就是鼠标指针。
在这里插入图片描述

代码运行效果

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

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

win10下媒体控制效果
[win10下媒体控制效果]
ios13媒体控制效果
[ios13媒体控制效果]

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

2020.11.15编辑
就在实现了媒体控制的功能后,偶然在微软的网站上看到了显示器亮度调节相关的HID描述符,果断决定试试。看看微软官网怎么描述显示器亮度调节的:https://docs.microsoft.com/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亮度调节
[win10亮度调节]
最后再强调下,这个亮度调节目前只有微软的win8/win10支持,而且是移动设备(使用电池供电的设备),如果找到Mac和Linux的亮度调节Usage再做兼容。

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

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

相关文章:《蓝牙HID TouchScreen协议让你的安卓9.0变成触摸屏》

  • 33
    点赞
  • 119
    收藏
    觉得还不错? 一键收藏
  • 77
    评论
【软件功能】 蓝牙遥控器软件,可以将你的手机一部电脑遥控器,使用手机可以控制电脑的鼠标操作、键盘的输入,如果你的手机具有手写功能,还可以将你的手机手写板。 这个软件分为两部分,一个是安装到手机上,另一个安装在电脑上。 手机端: 软件文件名为BtRemoteControl.jar,它要求安装的手机具有java功能,并支持MIDP2.0,具有蓝牙功能。 电脑端: 要想在电脑上运行遥控器,要求安装蓝牙驱动程序widcomm驱动或IVT BlueSoleil驱动。 同时,还要求电脑上安装.net运行库2.0,如果你的电脑没有安装,必须先安装Microsoft .NET Framework 2.0 。 【使用说明】 电脑端的安装使用: 蓝牙遥控器电脑端在电脑上安装后,双击图标桌面上产生的图标。 首先在“请选择接受遥控的蓝牙虚拟串口”后面,选择蓝牙的虚拟串口名字,软件里已经包括了从com1到com20的串口名字,请根据自己机器上的蓝牙虚拟串口名字选择,如果你无法确定,可以用手机上的蓝牙遥控器软件测试1下。 选择好串口名字后,点下“打开串口”按钮,将显示“蓝牙串口状态:"已打开,这时就可以接受手机方的控制了。 手机端的安装使用: 和其它的JAVA程序在手机上的安装过程一样,先用蓝牙、红外线或数据线将手机与电脑连接,将BtRemoteControl.jar安装到手机,在手机的功能表里就会出现“蓝牙遥控器”标志,运行软件,会出现“启动蓝牙”选择,运行该选择,软件将搜索周围准备接受遥控的电脑上的蓝牙设备,搜索片刻后,将显示搜到蓝牙设备,并接着显示蓝牙设备上的蓝牙虚拟串口服务是否存在。 如果搜索后显示未找到蓝牙设备,请检查你的手机是否启动了蓝牙,你的电脑上的蓝牙驱动程序是否启动,蓝牙设备是否插好。 在找到蓝牙设备和蓝牙上的虚拟串口后,手机上将会有如下3个菜单选择: 发送测试:用来测试电脑上的蓝牙虚拟串口是否可以接受数据,同时可以测试出蓝牙虚拟串口的名字,供电脑方的遥控软件设置使用,按下这个按钮,就可以向电脑的虚拟串口发送1个数据,测试串口。 控制鼠标键盘:选择了这个菜单,将显示遥控鼠标键盘界面.这个选择有3个功能,用户可以按下#号键,在这三个功能之间切换,这三个功能: 1、遥控鼠标手机方向键的上下左右四个键,控制鼠标上下左右移动,按下0键,遥控单击鼠标右键,按下9键,遥控单击鼠标左键,按下ok键,遥控双击鼠标左键。按下1,3,7个键,调整鼠标移动的距离,1键是短距离,3键是中距离,7键是长距离。 2、遥控鼠标自动移动。按下上下左右四个方向键,鼠标将按照操作自动上下左右移动,一直到屏幕的边缘才停止,按下*号键,停止自动运行。 3、遥控键盘。按下手机上的0到9号键,将向电脑发送命令0到9,在电脑上,可以进行设置,当接到命令时如何控制键盘。电脑端的操作如下图,选择接到命令时,要按下的按键,点“添加”按钮,就可以添加功,选择后,殿下“删除”按钮,就可以删除: 文字输入:按下这个菜单,将可以输入文字到电脑。在手机中输入文字,然后点下“发送文字”按钮,就可以将文字发送到电脑了。
评论 77
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值