2017-02-11 18 views
1

Я адаптировал библиотеку для записи аудио MP3 через микрофон пользователя. Если пользователь разрешает или отклоняет запрос на доступ к микрофону, я в порядке, но я отмечаю, что MDN says это:getUserMedia - что делать, если пользователь не делает другого выбора?

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

Но, похоже, я не могу сказать, что, если что-нибудь, я могу поймать действие «без выбора». Если пользователь просто покидает диалоговое окно или вымывается из него без выбора, могу ли я его поймать и соответствующим образом настроить свой интерфейс?

Вот мой текущий код:

navigator.mediaDevices.getUserMedia({audio: true}).then(function(stream) { 
    build_ui(); 
    startUserMedia(stream); 
}).catch(function(e) { //<-- doesn't fire if no choice made 
    cfg.no_device_callback && cfg.no_device_callback(e); 
}); 
+0

Я думаю, вы можете использовать метод 'reject' для обещания поймать это, если ошибка не выбрасывается. –

+0

Но это просто - обещание * не * отклонено, если пользователь не делает другого выбора. – Utkanos

+0

Я не могу представить, что случай у пользователя не делает выбор за 5 минут, поэтому вы можете запустить таймаут, чтобы отклонить вручную, если пользователь не делает выбор в течение X минут. –

ответ

1

Вы могли бы осуществить тайм-аут на обещание у вас есть.

Например, вы могли бы расширить объект Promise и прототип следующим образом:

Promise.wait = function (ms) { 
    return new Promise(function (resolve) { 
     setTimeout(resolve, ms); 
    }); 
}; 

Promise.prototype.timeout = function(ms) { 
    return Promise.race([ 
     this, 
     Promise.wait(ms).then(function() { 
      throw new Error("time out"); 
     }) 
    ]) 
}; 

После того, как вы есть, что вы можете просто цепь в .timeout(10000):

navigator.mediaDevices.getUserMedia({audio: true}) 
     .timeout(10000).then(function(stream) { 
//  ^^^^^^^^^^^^^^^ 
    build_ui(); 
    startUserMedia(stream); 
}).catch(function(e) { //<-- now also fires if no choice made within 10 secs 
    cfg.no_device_callback && cfg.no_device_callback(e); 
}); 
0

Firefox (57) не позволяет пользователю отклонить диалог разрешений. Это диалоговое окно будет оставаться видимым до бесконечности, пока вы не сделаете выбор:

enter image description here

Safari (11) не позволяет пользователя, чтобы закрыть диалоговое окно. Кроме того, он также блокирует весь браузер (включая другие вкладки) и, таким образом, заставляет руки пользователя, чтобы сделать выбор:

enter image description here

Chrome (62) позволяет пользователя, чтобы закрыть диалоговое окно с помощью верхний правый [х] кнопка:

enter image description here

в этом случае выбор и Actionis очевидно поэтому Chrome бросает нон ошибки спецификации по имени PermissionDismissedError, но эта ошибка может быть удален в Chrome 64, который пытается двигаться в направлении зр (см. this Chromium bug).

Я написал больше abut getUserMedia ошибок в this article.