如何在未经验证的Android设备上访问外部USB摄像头

时间:2015-08-19 12:06:49

标签: android android-ndk v4l2

我想通过Android上的v4l访问extern usb相机。

我试过了SimpleWebCam。经过对原始源代码的一些细微修改后,我实现了它在一个有根的Android设备上工作。但是,在无根设备上,它一直在抱怨"没有权限访问" / dev / video *"。我用" ls -l / dev / video *"检查了/ dev / video *的许可,并得到了

crw-rw---- system camera 81, 0 2015-08-18 18:31 video0

据我所知,这意味着/ dev / video *归系统所有,并且对于组中的用户是可读/可写的#34;相机"。所以我想如果我添加

<uses-permission android:name="android.permission.CAMERA" />

在我的应用清单中,我的应用的用户ID将被添加到群组&#34;相机&#34;,然后我的应用将被允许从/ dev / video *读取数据。

但是,它仍然抱怨&#34;没有权限访问/ dev / video *&#34;现在

我也试过

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

,但仍然无法正常工作。

我是否想念某事或误解某事。任何帮助或讨论将不胜感激。

我用来打开设备的代码是

int opendevice(int i)
{
struct stat st;

sprintf(dev_name,"/dev/video%d",i);

if (-1 == stat (dev_name, &st)) {
    LOGE("Cannot identify '%s': %d, %s", dev_name, errno, strerror (errno));
    return ERROR_LOCAL;
}

if (!S_ISCHR (st.st_mode)) {
    LOGE("%s is no device", dev_name);
    return ERROR_LOCAL;
}

fd = open (dev_name, O_RDWR);// | O_NONBLOCK, 0);

if (-1 == fd) {
    LOGE("Cannot open '%s': %d, %s", dev_name, errno, strerror (errno));
    return ERROR_LOCAL;
}
return SUCCESS_LOCAL;
}

open的返回值始终为-1,使用logcat:

 Cannot open '/dev/video3': 13, Permission denied

2 个答案:

答案 0 :(得分:2)

我终于实现了使用名为uvccamera的开源项目在未经验证的Android设备上从外部USB摄像头读取图像。 这是链接OwnerDraw

答案 1 :(得分:0)

尝试添加

<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
清单文件中的

http://developer.android.com/reference/android/hardware/Camera.html