Android 7 jni open() не работает + управление камерой USB

Я использовал этот пример с ioctl на Android 4.4, 5.1 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-камеру, подключенную к планшету, и Android 7 не позволяет met получить устройство FD, хотя я использую chmod 666 или 777 для установки разрешения. Есть ли способ обойти это или другой способ получить контроль над экспозицией, контрастом, усилением, белым 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!");
    }

Спасибо за помощь

1 ответ

Вам нужно использовать API-интерфейс Android USB-менеджера, чтобы получить FD для вашего USB-устройства; прямой доступ к узлу /dev обходит соблюдение разрешений Android (см. руководство по USB здесь) для доступа к USB-устройствам.

Поэтому приложения, имеющие доступ к узлу /dev, представляют собой уязвимость системы безопасности, которая была заблокирована в более поздних выпусках Android.

Если у вас есть FD для USB-устройства из Java USB API, вы можете манипулировать им в собственном коде, если хотите.

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