如何在 Android 应用程序中打开设备节点 (/dev/hidraw0)(通过 C++)?
How to open device node (/dev/hidraw0) in Android app (via C++)?
我目前正在使用 JNI/NDK 将 C++ 通信库从 Linux 移植到 Android。该设备是用于进行科学测量的 USB 探测器。它只是一个原始 HID,显示为“/dev/hidraw0”
我需要获取设备的文件描述符 ('_fileHandle'),我通过以下方式进行操作:
_fileHandle = open(_devicePath.c_str(), O_RDONLY | O_NONBLOCK);
其中“_devicePath”是设备节点“/dev/hidraw0”。不幸的是,我 运行 遇到了 Android 的问题(很可能是 Permissions/SELinux),并且在我尝试执行 open( ...) 命令:
type=1400 audit(0.0:41): avc: denied { read } for name="hidraw0" dev="tmpfs" ino=229381 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:device:s0 tclass=chr_file permissive=0
“/dev/hidraw0”的"ls -l"是:
crw------- 1 root root 229
如何打开设备?
我尝试只更改节点上的权限,但更改没有生效(Android 立即恢复)。
谢谢!
有一个 API 可以直接处理 USB 设备。看一下:
https://developer.android.com/guide/topics/connectivity/usb/host.html
是否满足您的需求?
@y30 是正确的。
在我的应用程序中使用 root 命令,我通过使用 "setenforce 0" 命令将 SELinux 设置为 "Permissive" 模式使其工作,然后我能够发送 "chmod 666 /dev/hidraw0" 命令和权限坚持 - 然后我能够从我的应用程序成功地与设备通信。
虽然有时它仍然有点不稳定 - 我发现有时我的应用程序没有设置权限,即使我在 运行 启动我的命令后没有收到任何错误应用程序,我必须去终端以 root 身份手动执行命令,然后返回我的应用程序。
感谢您的帮助!
我目前正在使用 JNI/NDK 将 C++ 通信库从 Linux 移植到 Android。该设备是用于进行科学测量的 USB 探测器。它只是一个原始 HID,显示为“/dev/hidraw0”
我需要获取设备的文件描述符 ('_fileHandle'),我通过以下方式进行操作:
_fileHandle = open(_devicePath.c_str(), O_RDONLY | O_NONBLOCK);
其中“_devicePath”是设备节点“/dev/hidraw0”。不幸的是,我 运行 遇到了 Android 的问题(很可能是 Permissions/SELinux),并且在我尝试执行 open( ...) 命令:
type=1400 audit(0.0:41): avc: denied { read } for name="hidraw0" dev="tmpfs" ino=229381 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:device:s0 tclass=chr_file permissive=0
“/dev/hidraw0”的"ls -l"是:
crw------- 1 root root 229
如何打开设备?
我尝试只更改节点上的权限,但更改没有生效(Android 立即恢复)。
谢谢!
有一个 API 可以直接处理 USB 设备。看一下: https://developer.android.com/guide/topics/connectivity/usb/host.html
是否满足您的需求?
@y30 是正确的。
在我的应用程序中使用 root 命令,我通过使用 "setenforce 0" 命令将 SELinux 设置为 "Permissive" 模式使其工作,然后我能够发送 "chmod 666 /dev/hidraw0" 命令和权限坚持 - 然后我能够从我的应用程序成功地与设备通信。
虽然有时它仍然有点不稳定 - 我发现有时我的应用程序没有设置权限,即使我在 运行 启动我的命令后没有收到任何错误应用程序,我必须去终端以 root 身份手动执行命令,然后返回我的应用程序。
感谢您的帮助!