Как потоковое аудио в приложении phonegap

Я пытаюсь реализовать звуковые вызовы в приложении phonegap, которое я создаю. Я использую PeerJS, чтобы подключить 2 клиента. Эта часть работает. Но проблема связана с URL-адресом, созданным для медиапотока. Это выглядит так:

<audio src="blob:file%3A///6212fd77-7d1e-46ba-9abe-cfe96d414b28"></audio>

Вместо чего-то вроде:

<audio src="blob:http%3A///url-to-server.com/6212fd77-7d1e-46ba-9abe-cfe96d414b28"></audio>

Вот почему ничего не слышно с обоих устройств (я тестирую с помощью genymotion и моего смартфона).

Но странно, что он работает, когда я тестирую из браузера и моего телефона. Когда я разговариваю со встроенным микрофоном в своем ноутбуке, я слышу его на своем телефоне. Но когда я говорю в своем телефоне, на моем ноутбуке ничего не слышно.

Для справки это то, что я получаю, когда я выбираю элемент аудио, который воспроизводит медиапоток:

<audio src="blob:http%3A//localhost%3A8100/861180b2-2c12-4134-a6da-89fcb40ef372"></audio>

Не уверен, действительно ли это проблема.

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

Вот код для запроса микрофона:

function getAudio(successCallback, errorCallback){
    navigator.getUserMedia({
        audio: true,
        video: false
    }, successCallback, errorCallback);
}

И затем я вызываю его всякий раз, когда кто-то инициирует вызов:

getAudio(
    function(MediaStream){

        console.log('now calling ' + to);
        var call = peer.call(to, MediaStream);
        call.on('stream', onReceiveStream);
});

Затем onReceiveStream преобразует медиапоток в URL-адрес, который затем присваивается звуковому элементу:

function onReceiveStream(stream){
    var audio = document.querySelector('audio');
    audio.src = window.URL.createObjectURL(stream);
    audio.onloadedmetadata = function(e){
        console.log('now playing the audio');
        audio.play();
    }
}

Любые идеи? Спасибо заранее.

Обновление

Кажется, что реальная проблема заключается в том, что звук не может быть записан с телефона, потому что он не запрашивает доступ к микрофону при вызове navigator.getUserMedia. Я подтвердил, что navigator.getUserMedia доступен, когда я тестировал с помощью genymotion. Хотя он также не запрашивает доступ в genymotion. Я использую recordRTC в качестве поставщика прокладки.

обновление 2

ok Я отказался от этого. Невозможно запросить микрофон. То, что я сейчас пытаюсь сделать, это PhoneRTC. Но я снова застрял в проблеме. Это не здание, когда у меня установлен плагин. Пожалуйста, ознакомьтесь с этой проблемой на страницах проекта Github для получения более подробной информации: https://github.com/alongubkin/phonertc/issues/151

Ответы

Ответ 1

Чтобы получить доступ к ресурсам телефона, вы должны объявить их на AndroidManifest.xml, поэтому конечный пользователь знает об этом при установке приложения.

Кордоба и плагин Phongap создают приложение, даже если вы не используете их в качестве библиотеки веб-просмотра, поэтому вам нужно попросить разрешения в манифесте.

для микрофона и камеры разрешения:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />

но кажется, что некоторые плагины также делают некоторые трюки и нуждаются в еще одном:

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />