【问题标题】:Android 7 jni open() fails + usb camera controlsAndroid 7 jni open() 失败 + USB 摄像头控件
【发布时间】:2018-05-28 07:20:41
【问题描述】:

我在 android 4.4、5.1 上将这个示例与 ioctl 一起使用 https://github.com/theicfire/simplewebcam/blob/master/jni/ImageProc.c

我正在使用此界面手动控制对比度、增益、曝光、白电平等参数。 当我尝试将应用程序移至 android 7 时,fd 文件无法打开。

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

有没有办法解决这个问题?

我已经检查过了,camera2.api 不允许控制我需要从相机获得的参数,并且本机代码因为这个错误而失败。

编辑: 更准确地说,我使用的是连接到平板电脑的 USB 摄像头,即使我使用 chmod 666 或 777 来设置权限,android 7 也不会让我得到设备 FD。有什么方法可以解决它或其他方法来控制曝光、对比度、增益、白色 lvl?

这是我在java部分添加的代码,canRead()部分代码失败

    private void InitCameraDevice() throws Exception {
        //set permissions to all /dev/video devices before checking them
        General.RunAsRoot("chmod 666 /dev/video*");

        NativeUtils.setLogName(General.getLogFileName());

        File dir = new File("/dev");
        File[] videoDevFiles = dir.listFiles(new FilenameFilter() {
            public boolean accept(File dir, String name) {
                return name.startsWith("video");
            }
        });

        boolean cameraFound = false;
        for (File deviceFile : videoDevFiles) {
            // Process file
            if(deviceFile.canRead()) {
                cameraFound = (NativeUtils.prepareCamera(deviceFile.getAbsolutePath(), frameWidth, frameHeight) != -1);
                if (cameraFound)
                    break;
            }
            else
                General.logd(STREAM_THREAD_TAG, "Insufficient permissions on [" +
                        deviceFile.getAbsolutePath() +"].");
        }

        if(!cameraFound)
            throw new Exception("UVC Camera not found!");
    }

感谢您的帮助

【问题讨论】:

  • 更准确地说,我使用的是连接到平板电脑的 USB 摄像头,即使我使用 chmod 666 或 777 设置权限,android 7 也无法获取设备 FD。跨度>

标签: android camera java-native-interface native ioctl


【解决方案1】:

您需要使用 Android USB 管理器 API 来为您的 USB 设备获取 FD;直接访问 /dev 节点会绕过 Android 对 USB 设备访问的权限强制执行(请参阅USB guide here)。

因此,可以访问 /dev 节点的应用程序是一个安全漏洞,在最近的 Android 版本中被锁定。

从 Java USB API 获得 USB 设备的 FD 后,您可以根据需要在本机代码中对其进行操作。

【讨论】:

  • 嗨,它对我不起作用,我已经添加了代码以及它失败的地方
  • 您没有在代码示例中使用 Android USB 管理器 API;通常不允许直接访问 /dev/video 节点。即使在有根设备上,SELinux 权限仍可能会给您带来麻烦,而且这肯定不适用于常规操作系统映像。
  • 你能告诉我如何使用usb api获取相机的fd,所以open()和canRead()都不会因为权限而失败?谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-17
  • 2022-12-03
  • 2016-10-19
  • 2020-01-10
  • 2017-11-25
  • 1970-01-01
  • 2017-07-13
相关资源
最近更新 更多