Как открыть узел устройства (/dev / hidraw0) в Android-приложении (через C++)?
В настоящее время я портирую коммуникационную библиотеку C++ с Linux на Android с помощью JNI/NDK. Прибор представляет собой USB-детектор для проведения научных измерений. Это просто сырой HID, который появляется как "/dev / hidraw0 "
Мне нужно получить файловый дескриптор ('_fileHandle') на устройство, что я и делаю через:
_fileHandle = open(_devicePath.c_str(), O_RDONLY | O_NONBLOCK);
Где '_devicePath' - узел устройства "/dev / hidraw0". К сожалению, я столкнулся с проблемой с Android (разрешения / SELinux, скорее всего), и я получаю следующее ошибка в моем logcat сразу после того, как я пытаюсь выполнить 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
"ls-l" из "/dev / hidraw0 " - это:
crw------- 1 root root 229
Как я могу заставить устройство открыться?
Я попытался просто chmod разрешения на узле и изменения не прилипают (Android немедленно отменяет их).
Спасибо!
2 ответов:
Существует API для обработки USB-устройств напрямую. Взгляните на: https://developer.android.com/guide/topics/connectivity/usb/host.html
Удовлетворяет ли она вашу потребность?
@y30 был прав.
Используя команды root из моего приложения, я заставил его работать, установив SELinux в "разрешающий" режим с помощью команды "setenforce 0", а затем я могу отправить команду" chmod 666 /dev/hidraw0 " и палку разрешений - тогда я могу успешно взаимодействовать с устройством из моего приложения.
Это все еще немного неустойчиво время от времени, хотя - я нахожу, что иногда разрешения не устанавливаются из моего приложения, даже если я не получаю никаких ошибок после запуска команды при запуске моего приложения, и я должен перейти к терминалу, чтобы вручную выполнить команды от имени root, а затем вернуться к моему приложению.
Спасибо за помощь!
Comments