我有一个蓝牙HID设备,我需要在运行自android 5.0派生自定义版本的Nexus 7 2013平板电脑上运行我的应用程序时,获得正在工作。所以:
@hide
不是约束条件现在,我的设备具有键盘,并且可以发送并接受一些特定于供应商的HID报告。 工作是指发送和接收所有HID报告
基于我已经完成的AOSP源代码探索,看来:
HidService
服务为所有输入的HID报告广播BluetoothInputDevice.ACTION_REPORT
意图[我的应用程序具有BroadcastReceiver
来接收ACTION_REPORT
意图]
BluetoothInputDevice
通过setReport()
提供其他接口,例如sendData()
,connect()
,HidService
等。
[BluetoothInputDevice
使用HidService
提供HID设备接口。
[HidService.java
是com_android_bluetooth_hid.cpp
]上的JNI包装器
[com_android_bluetooth_hid.cpp
,在初始化HidService
时,会将自己的回调注册到Bluedroid
我已将日志添加到AOSP中以跟踪呼叫,并且上述所有内容似乎都是正确的。
BUT
get_report_callback()
中的com_android_bluetooth_hid.cpp
从未被调用,因此,我的应用程序未收到ACTION_REPORT
意图。
如果我从我的应用发送虚拟ACTION_REPORT
意图,则我的BroadcastReceiver
会收到这些意图。
我的HID设备已连接并且正在工作,因为我确实在我的应用程序的edittext字段中看到收到的密钥。
有什么方法可以在我的应用程序中接收设备的HID报告?通过意图还是任何其他方式?
如果我可以通过Intents获得,我错过了任何步骤吗?我基本上只有具有意图过滤器的BroadcastReceiver
以及接收HID报告的BLUETOOTH
和BLUETOOTH_ADMIN
权限。
如果必须使用其他方法,请提出建议。
[更新2]
我可能没有清楚提及,但是我使用的设备通过GATT实现HID,并且是BLE设备。
在较新的Android版本(7,8,9)上,我可以通过订阅HID报告通知,添加BLUETOOTH_PRIVILEGGED许可并作为平台应用安装来接收HID报告。
这些版本不需要其他Android代码。我没有(也不会)使用较旧版本的Android进行测试,但是该解决方案可能已经在其中运行了。
[上一个答案]
BluetoothInputDevice根本不起作用。
我使用C代码中的/ dev / hidraw *来访问蓝牙hidraw设备。
/ dev / hidraw *节点未报告MAC地址。
在Android 5.x中,它们起作用,并且所有设置/发送/接收报告操作均起作用。未经测试。
在Android 6.x上,只有recv操作正在/ dev / hidraw中运行。设置/发送不起作用。未经测试。
当我有更好的答案时,我将发布更新。
更新
我修改了bluedroid,并在其中添加了一个小型的unix套接字服务器。 Bluedroid将所有传入的HID报告发送到此服务器,并从该服务器接受传出的HID报告。我的应用程序通过未命名的套接字与此服务器通信。一切都很好。
我只需要正确设置套接字的权限SELinux即可。
这适用于所有我可以用(4.4-6.0)测试的Bluedroid版本,但是每个Bluedroid版本都需要它自己的补丁版本。
您解决了这个问题吗?经过长时间的挖掘,我发现您遇到了同样的问题。
我使用android来源提供的隐藏演示hid-example.c。使用相同的蓝牙隐藏设备,我在Ubuntu和Android上运行演示,运行reslut有所不同。在Android平台中,/ dev / hidraw *节点未报告mac地址,并且write()操作必须失败,尽管write()函数返回wirte len。