Доступ к внешней USB-камере из веб-просмотра в Android - PullRequest
0 голосов
/ 30 августа 2018

У меня есть веб-просмотр в моем приложении для Android. Из веб-просмотра я могу получить доступ к камере по умолчанию на телефоне. Следующий код работает нормально.

webview.setWebChromeClient(new WebChromeClient(){
    // Need to accept permissions to use the camera
    @Override
    public void onPermissionRequest(final PermissionRequest request) {
        L.d("onPermissionRequest");
        request.grant(request.getResources());
    }
});

Моя проблема заключается в доступе к внешней USB-камере из этого веб-просмотра. Выше разрешения открывает камеру по умолчанию в веб-представлении.

Мне не удалось найти документацию, в которой даже говорится, что это возможно. Это из-за какой-то проблемы безопасности?

1 Ответ

0 голосов
/ 12 сентября 2018

У вас могут быть проблемы с драйвером камеры USB и выбором камеры, а не с разрешениями.

  1. Драйверы USB-камеры

Первый шаг - убедиться, что ваша USB-камера обнаружена и работает на вашем устройстве. Вы не указали, подтвердили ли вы это или нет. Насколько я понимаю, поддержка android.hardware.camera2 для USB-камер все еще довольно слабая. Если ваша камера поддерживается, то, надеюсь, она будет перечислять вместе с остальными камерами. В моем тесте с Android 8.1.0 подключенная USB-камера не была перечислена с CameraManager, а с библиотекой ниже.

Библиотека USB-камеры https://github.com/saki4510t/UVCCamera часто используется для обеспечения более широкой поддержки USB-камер, но из моего ограниченного опыта работы с библиотекой она пишет в TextureView и поэтому, вероятно, не будет хорошо работать с WebRTC в WebView. В очень кратком исследовании я не увидел хуков WebView, которые бы поддерживали подключение внешнего источника видео.

  1. Выбор камеры

Вы упомянули, что в вашем тесте всегда использовалась камера по умолчанию, поэтому похоже, что вы не будете активно перечислять и выбирать целевую камеру. Выбор камеры WebRTC может быть выполнен в Javascript с использованием интерфейса navigator.mediaDevices. Например,

function chooseDevice(videoInDevices) {
    // return selected device
}

// Filter devices so we only consider video sources
function filterForVideoInputs(devices) {
    return devices.filter(d => d.kind === 'videoinput');
}

// Simply pull out deviceId from selected device struct
function getDeviceId(deviceInfo) {
    return deviceInfo.deviceId;
}

// Request video stream from selected deviceId
function requestDevice(deviceId) {
    return navigator.mediaDevices.getUserMedia({
        video: {
            deviceId: {
                exact: deviceId
            }
        }
    });
}

// Connect stream from getUserMedia to HTML5 video element
function startStream(stream) {
    let video = document.querySelector('video');
    video.srcObject = stream;
    video.onloadedmetadata = function () {
        video.play();
    }
}

navigator.mediaDevices.enumerateDevices()
    .then(filterForVideoInputs)
    .then(chooseDevice)
    .then(getDeviceId)
    .then(requestDevice)
    .then(startStream)
    .catch(err => console.log(err));

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

Обратите внимание, как вы, возможно, знаете, в документации есть предупреждение о том, что не ослепляет, предоставляя разрешение Webkit . При переходе к производству не забудьте заменить

request.grant(request.getResources())

возможно, с чем-то более похожим

if (isRequestOriginOrWhateverApproved(request)) {
    request.grant(new String[]{PermissionRequest.RESOURCE_VIDEO_CAPTURE});
}
...