добавление поддержки navigator.mediaDevices.getUserMedia в Dart - PullRequest
0 голосов
/ 11 апреля 2020

Dart SDK пока не поддерживает некоторые методы в классе MediaDevices, включая getUserMedia https://github.com/dart-lang/sdk/issues/35253. Для таких браузеров, как Chrome и Firefox, это было нормально, поскольку более старая реализация getUserMedia на основе обратного вызова все еще находится непосредственно в объекте window.navigator. Но с Safari, который, я думаю, только недавно реализовал эту функциональность, поддерживается только более новый вариант MediaDevices, который возвращает обещание.

Я пытаюсь выяснить, как добавить этот метод в существующий класс Dart MediaDevices, так что он может вызывать встроенную функцию javascript, обрабатывать полученное обещание и преобразовывать результат, переданный в случае успеха, обратно в объект Dart MediaStream.

Здесь есть старая публикация, которая казалась многообещающей, но я не могу заставить этот пример успешно работать сейчас и подозреваю, что он либо не имеет отношения к Dart 2+, либо неуместен, если класс Dart уже существует (что является ошибка, которую я получаю, указывает). Дарт JS Взаимодействие 0.6.0 и JS Обещания - разрешение

Самое близкое, что я достиг к успеху, - это go назад к более старому подходу Дарта к взаимодействию JsObject. Я могу вызвать метод getUserMedia и получить объект обещания, но в настоящее время он всегда завершается с ошибкой, в которой говорится, что я должен запросить аудио или видео. Так что что-то не так с моим синтаксисом параметра или с тем, как он преобразуется в JS:

JsObject jsObj = context['navigator']['mediaDevices'];
JsObject promise = jsObj.callMethod("getUserMedia", 
    [{'audio': true, 'video': false}]);
promise.callMethod('then', [
    (_){ 
        completer.complete(true); 
        print('success...'); 
    }, 
    (e){ 
        completer.complete(false); 
        print('fail...'); 
    }
]);

Однако, даже если я пройду мимо этого, я все еще не вижу, как преобразовать результат обратно в объект Dart MediaStream. Кто-нибудь знает какую-либо информацию для заполнения недостающих частей SDK, как это?

1 Ответ

0 голосов
/ 11 апреля 2020

Это обходной путь. Вместо того чтобы заставить Dart правильно взаимодействовать с navigator.mediaDevices.getUserMedia, я вместо этого добавил реализацию обратного вызова getUserMedia к объекту навигатора, если он еще не существует (ie. Safari). Он просто в свою очередь вызывает версию на основе обещаний для объекта mediaDevices.

<script>
    if (navigator.getUserMedia == undefined && navigator.mediaDevices.getUserMedia){
        navigator.getUserMedia = function(constraints, success, error){
            navigator.mediaDevices.getUserMedia({audio: true, video: false})
            .then((mediaStream) => {
                success(mediaStream);
            })
            .catch((err) => {
                error(err);
            });
        };
    }
</script>
...