Предварительный просмотр USB Webcamera на Android через ndk и V4L

Я пытаюсь получить доступ к веб-камере USB с Android ndk.

Система Android имеет модули ядра V4L, поэтому я подумал, что будет лучше использовать библиотеки V4L. Они запутались в ndk, так что было не сложно включить их в мой проект.

Моя проблема заключается в следующем:

Мне нужно открыть / dev / video4 и отправить ioctl в этот дескриптор файла, но у меня нет прав доступа к / dev / video4. Я думал о трех вещах:

1) Почему мне не хватает разрешений на /dev/video4? Мое приложение использует разрешение android.permission.CAMERA, поэтому пользователь, запускающий приложение, должен быть в группе камер, а группа камер имеет права r+w для /dev/video4, так почему я не могу открыть его?

2) Я пытался получить дескриптор файла со стороны java, что возможно с помощью класса UsbManager, но этот дескриптор файла указывает на /dev/bus/usb/001/004. Есть ли способ запросить разрешение для / dev / video4 со стороны Java? Или я могу включить библиотеку V4L пользовательского пространства и передать указатель на общее USB-устройство в / dev / bus / usb / 001/004?

3) Android-версия OpenCV поставляется с поддержкой V4L? Могу ли я использовать его для предварительного просмотра камеры без доступа к /dev/video4?

Кто-нибудь пробовал что-то подобное раньше?

Кроме того, я знаю, что есть библиотеки, которые используют libusb и libuvc для взаимодействия с камерой (например, https://github.com/saki4510t/UVCCamera), но эта библиотека очень непригодна и не дает удовлетворительных результатов.

2 ответа

Я приехал сюда, потому что пришел к тем же выводам, что и вы. У меня нет больше предложений, чтобы предложить. Вы нашли что-нибудь еще после всех этих лет?

Все, что я могу добавить, это следующее:

  • Доступ к файловым дескрипторам /dev/videoX дополнительно ограничен SELinux.
  • android.permission.CAMERA не делает то, что вы думаете, что делает. Все эти настройки разрешений / функций, в манифесте, обеспечивают доступ к службам инфраструктуры приложений, не имеют ничего общего с разрешениями групп Linux или SELinux.
  • Каркас Camera2 перечисляет только переднюю и заднюю камеры, поэтому его нельзя использовать для USB-камер, по крайней мере, из коробки.
  • Хотя драйверы V4L2 присутствуют в Android, драйвер "uvcvideo" по умолчанию отсутствует. Вам придется собрать собственное ядро.
  • Проект UVCCamera, на который вы указали, использует UsbManager (с пользовательским пространственным анализатором uvc). Вот как это преодолевает проблему с разрешениями. Кажется, это единственный способ, но эта реализация хрупкая и, похоже, имеет проблему с режимом массовой загрузки.

Обидно, что мы не можем просто использовать драйвер V4L2 + uvcvideo.

Наличие разрешения CAMERA на самом деле не означает, что вы находитесь в какой-либо конкретной группе пользователей Linux. Это просто означает, что у вас есть разрешение на проверку прав ОС Android.

В общем, приложения не получают прямого доступа к интерфейсам драйверов ядра. Это большая проблема безопасности, потому что драйверы часто не защищены от вредоносных программ.

Единственное текущее решение, которое может работать с некорневыми устройствами, - это проект UVCCamera или другие подобные ему, которые строят целый интерфейс UVC поверх общедоступных API-интерфейсов USB Android.

Кроме того, некоторые устройства Android действительно поддерживают веб-камеры через стандартные API-интерфейсы камеры, но это еще не функция в базовой версии Android.

Другие вопросы по тегам