js+html5 getUserMedia конфликтует с микрофоном (Android) (мобильный телефон считает, что телефонный звонок активен)

Отредактировано - обновление внизу поста

Я создаю веб-приложение для Android с помощью phonegap, и я столкнулся с этой проблемой после инициализации getusermedia, когда я использую кнопку уменьшения/увеличения громкости, регулятор громкости предназначен для вызова, а не для динамика, даже если я этого не сделал. не начинать новую запись ... кроме того, я заметил, что телефон на самом деле думает, что это телефонный звонок, когда приложение работает, например: я запускаю свое приложение, затем я открываю WhatsApp и пытаюсь записать голосовое сообщение, сообщение передается отменен.

Я знаю, что следующий сегмент является проблемой (я прокомментировал его, и проблем не было)

/***recording audio block***/
function audioRecordingInit() {
navigator.getUserMedia = ( navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia ||
navigator.msGetUserMedia);
if (navigator.getUserMedia) {
    console.log('getUserMedia supported.');

    var constraints = {audio: true};
    var chunks = [];

    var onSuccess = function (stream) {
        $.globals.mediaRecorder = new MediaRecorder(stream);
        $.globals.mediaRecorder.onstop = function(e) {
            console.log("data available after MediaRecorder.stop() called.");
            var blob = new Blob(chunks, { 'type' : 'audio/ogg; codecs=opus' });
            chunks = [];
            if(!$("#recordBtn").hasClass("private"))
                $.globals.lastRecorded.audio.src = window.URL.createObjectURL(blob);
            else
                $.globals.lastRecordedPrivate.audio.src = window.URL.createObjectURL(blob);
            console.log("audio created");


        };
        $.globals.mediaRecorder.ondataavailable = function(e) {
            chunks.push(e.data);
        }
    };
    var onError = function (err) {
        console.log('The following error occured: ' + err);
    };

    navigator.getUserMedia(constraints, onSuccess, onError);// I think this is the problem
}
else{
    console.log('getUserMedia not supported on your browser!');
}
/***end of recording audio block***/
}

эта функция вызывается после готовности устройства

и я добавляю также функции начала записи и остановки записи ниже

function startRecording(event) { 
  document.getElementById("recordingTime").innerText = "00:00";
  $.globals.mediaRecorder.start();
  console.log($.globals.mediaRecorder.state);
  console.log("recorder started");
  $.globals.timerInterval = setInterval(function () {
      $.globals.sec += 1;
      if ($.globals.sec == 60) {
          $.globals.min++;
          $.globals.sec = 0;
      }
      if ($.globals.min < 10) {
          if ($.globals.sec < 10)
              $.globals.timeText = "0" + $.globals.min + ":0" + $.globals.sec;
        else
            $.globals.timeText = "0" + $.globals.min + ":" + $.globals.sec;
    }
    else if ($.globals.sec < 10)
        $.globals.timeText = min + ":0" + $.globals.sec;
    else
        $.globals.timeText = min + ":" + $.globals.sec;
    document.getElementById("recordingTime").innerText = $.globals.timeText;
}, 1000);
   }
    function stopRecording() {
  if($(".circleNav").hasClass("recording"))
      $(".circleNav").toggleClass("recording");
  $.globals.currentState="Recorded";
  console.log($.globals.mediaRecorder.state);
  if($.globals.mediaRecorder.state=="inactive"){
      $.globals.mediaRecorder.start();
   }
  $.globals.mediaRecorder.stop();

console.log("recorder stopped");
clearInterval($.globals.timerInterval);

  }

startRecording начинается, когда touchstarts на кнопку записи stopRecording вызывается, когда touchend на кнопку записи спасибо за вашу помощь

Обновление:

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


person Omri Himelbrand    schedule 06.12.2016    source источник


Ответы (1)


Итак, после того, как мы много прочитали о MediaRecorder, MediaStream и MediaStreamTrack. Я обнаружил проблему, поток аудио оставался активным и использовал микрофон, поэтому мне было отказано в доступе к телефонным звонкам и голосовым сообщениям в WhatsApp. Я добавлю свое решение ниже:

function audioRecordingInit() {
navigator.mediaDevices.getUserMedia = ( navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia ||
navigator.msGetUserMedia);
if (navigator.getUserMedia) {
    console.log('getUserMedia supported.');
    navigator.getUserMedia({audio:true}, onSuccessMedia, onErrorMedia);
    return true;
}
else{
    console.log('getUserMedia not supported on your browser!');
    return false;
}
}

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

 function onSuccessMedia(stream) {
var chunks = [];
$.globals.mediaStream=stream;
console.log(stream);
$.globals.mediaRecorder = new MediaRecorder(stream);
$.globals.mediaRecorder.onstop = function(e) {
    console.log("data available after MediaRecorder.stop() called.");
    var blob = new Blob(chunks, { 'type' : 'audio/mp3; codecs=opus' });
    chunks = [];
    if(!$("#recordBtn").hasClass("private"))
        $.globals.lastRecorded.audio.src = window.URL.createObjectURL(blob);
    else
        $.globals.lastRecordedPrivate.audio.src = window.URL.createObjectURL(blob);
    console.log("audio created");
};
$.globals.mediaRecorder.ondataavailable = function(e) {
    chunks.push(e.data);
};
$.globals.mediaRecorder.start();
console.log("recording start");
}
function onErrorMedia(err) {
   console.log('The following error occured: ' + err);
}

здесь я переместил mediaRecorder.start() в функцию onSuccess вместо начала записи...

и точно я изменил функцию начала записи на

 function startRecording(event) {
     if(audioRecordingInit()) {
        //here is all of the visual changes
      }
      }

и все работает корректно

person Omri Himelbrand    schedule 10.12.2016