我正在尝试从Android ndk访问USB网络摄像头。
Android系统有V4L内核模块,所以我认为最好使用V4L库。它们在ndk中都是固定的,因此将它们包含在我的项目中并不是什么大不了的事。
我的问题如下:
我需要打开/ dev / video4并将ioctl发送到该文件描述符,但我没有访问/ dev / video4的权限。我想到了三件事:
1)为什么我缺少/ dev / video4的权限?我的应用程序使用android.permission.CAMERA权限,因此运行应用程序的用户应该在相机组中,并且相机组对/ dev / video4具有r + w权限,那么为什么我无法打开它?
2)我试图从java端获取文件描述符,这可以使用UsbManager类,但文件描述符点是/ dev / bus / usb / 001/004。有没有办法从Java端请求/ dev / video4的权限?或者我可以包含用户空间V4L库并将指针传递到/ dev / bus / usb / 001/004中的通用USB设备吗?
3)OpenCV的Android版本是否支持V4L?我是否可以使用它来预览相机而无需访问/ dev / video4?
以前有人试过这样的事吗?
另外,我知道有些库使用libusb和libuvc来连接相机(例如https://github.com/saki4510t/UVCCamera),但这个库非常不完整,并且不能提供令人满意的结果。
答案 0 :(得分:1)
拥有权限CAMERA实际上并不意味着您在任何特定的Linux用户组中。它只表示您拥有Android OS权限检查权限。
通常,应用程序无法直接访问内核驱动程序接口。这是一个很大的安全问题,因为驱动程序通常不会对恶意应用程序进行强化。
唯一可以与非root设备一起使用的解决方案是UVCCamera项目或类似的其他项目,它们在Android公共USB API之上构建一个完整的UVC接口。
此外,一些Android设备实际上通过标准相机API支持网络摄像头,但这还不是基准Android中的一项功能。
答案 1 :(得分:0)
我来到这里是因为我得出了与你相同的结论。我没有进一步的建议。这些年后你有没有找到别的东西?
我可以添加以下内容: