У вас могут быть проблемы с драйвером камеры USB и выбором камеры, а не с разрешениями.
- Драйверы USB-камеры
Первый шаг - убедиться, что ваша USB-камера обнаружена и работает на вашем устройстве. Вы не указали, подтвердили ли вы это или нет. Насколько я понимаю, поддержка android.hardware.camera2 для USB-камер все еще довольно слабая. Если ваша камера поддерживается, то, надеюсь, она будет перечислять вместе с остальными камерами. В моем тесте с Android 8.1.0 подключенная USB-камера не была перечислена с CameraManager, а с библиотекой ниже.
Библиотека USB-камеры https://github.com/saki4510t/UVCCamera часто используется для обеспечения более широкой поддержки USB-камер, но из моего ограниченного опыта работы с библиотекой она пишет в TextureView и поэтому, вероятно, не будет хорошо работать с WebRTC в WebView. В очень кратком исследовании я не увидел хуков WebView, которые бы поддерживали подключение внешнего источника видео.
- Выбор камеры
Вы упомянули, что в вашем тесте всегда использовалась камера по умолчанию, поэтому похоже, что вы не будете активно перечислять и выбирать целевую камеру. Выбор камеры 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});
}