安卓蓝牙键盘鼠标映射_蓝牙鼠标模拟器

安卓蓝牙键盘鼠标映射_蓝牙鼠标模拟器一直以来就有一种想法,就是自己写一个APP将安卓手机模拟成鼠标/键盘,应急的时候可以用来代替鼠标/键盘。之前也在国内外的网站上找了各种方案,但是这些方案不是很好,直到谷歌发布的API28后终于有了很好的解决方案。为了实现这个想法也走了不少弯路,也许方法不对吧,但看到最终完美运行的APP,心中还是很有成就感的。经测试装了此APP的手机能与几乎所有安卓手机、WIN10笔记本电脑连接并操作,苹果设备需要………

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

相关文章:《蓝牙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();
}
}
}
};

Jetbrains全家桶1年46,售后保障稳定

  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变成触摸屏》

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/200737.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)
blank

相关推荐

  • 一步一步写算法(之hash表)

    一步一步写算法(之hash表)

    2021年11月23日
  • 使用srvany.exe将任何程序作为Windows服务运行[通俗易懂]

    使用srvany.exe将任何程序作为Windows服务运行[通俗易懂]srvany.exe是什么?srvany.exe是MicrosoftWindowsResourceKits工具集的一个实用的小工具,用于将任何EXE程序作为Windows服务运行。也就是说srvany只是其注册程序的服务外壳,这个特性对于我们来说非常实用,我们可以通过它让我们的程序以SYSTEM账户启动,或者实现随机器启动而自启动,也可以隐藏不必要的窗口,比如说控制台窗口等等。如何获取

  • 缓存穿透,缓存击穿,缓存雪崩解决方案分析

    缓存穿透,缓存击穿,缓存雪崩解决方案分析前言设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。缓存穿透缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。解决方案

  • 如何用正确的姿势发微信群通知?「建议收藏」

    如何用正确的姿势发微信群通知?「建议收藏」人数众多的微信群里,你如何管理通知发放进度?想不想使用更高效的办法发通知?本文推荐给你一款小程序,帮助你轻松搞定微信群通知。(由于微信公众号外部链接的限制,文中的部分链接可能无法正确打开。如有需要,请点击文末的“阅读原文”按钮,访问可以正常显示外链的版本。)两难微信群被用来发通知,其实是工具使用场景错位。因为微信并不是高效办公的工具。否则腾讯也就不必开发企业微信,和

  • 离散傅里叶变换-DFT(FFT基础)[通俗易懂]

    离散傅里叶变换-DFT(FFT基础)[通俗易懂]     本文是从最基础的知识开始讲解,力求用最通俗易懂的文字将问题将的通俗易懂,大神勿喷,多多指教啊,虽然说是从零学习FFT,但是基本的数学知识还是要有的,sin,cos,等。      …

  • phpstorm怎么解决激活码has been support的问题【2022免费激活】[通俗易懂]

    (phpstorm怎么解决激活码has been support的问题)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html0HKLM1UCCY-eyJsa…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号