Skip to content

Commit 33daa84

Browse files
authored
Merge pull request #263 from AndreiMisiukevich/fixes
Fix: Safari/Firefox mic permission request
2 parents c4f27dd + 0a421e4 commit 33daa84

File tree

1 file changed

+20
-6
lines changed

1 file changed

+20
-6
lines changed

lib/_internal/twilio_voice_web.dart

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,8 @@ class TwilioVoiceWeb extends MethodChannelTwilioVoice {
237237

238238
html.Permissions? get _webPermissionsDelegate => _webNavigatorDelegate.permissions;
239239

240+
html.MediaDevices? get _webMediaDevicesDelegate => _webNavigatorDelegate.mediaDevices;
241+
240242
late final Call _call = Call();
241243

242244
@override
@@ -327,13 +329,25 @@ class TwilioVoiceWeb extends MethodChannelTwilioVoice {
327329
Future<bool?> requestMicAccess() async {
328330
Logger.logLocalEvent("requesting mic permission");
329331
try {
330-
/// TODO(cybex-dev) - Check browser type, if it is Firefox (or Safari), use the permissions API else use the getUserMedia API
331-
// final perm = await _webPermissionsDelegate?.request({"name": "microphone"});
332-
// return (perm == "granted");
333-
334-
/// This dirty hack to get media stream. Request (to show permissions popup on Chrome and other browsers, then stop the stream to release the permission)
332+
final isSafariOrFirefox = RegExp(r'^((?!chrome|android).)*safari|firefox', caseSensitive: false)
333+
.hasMatch(_webNavigatorDelegate.userAgent);
334+
335+
if (isSafariOrFirefox && _webPermissionsDelegate != null) {
336+
try {
337+
final result = await _webPermissionsDelegate!.request({"name": "microphone"});
338+
if (result.state == "granted") return true;
339+
} catch (e) {
340+
printDebug("Failed to request microphone permission");
341+
printDebug(e);
342+
}
343+
}
344+
345+
// Default approach for all browsers (and fallback for Safari & Firefox)
346+
/// This dirty hack to get media stream. Request (to show permissions popup on Chrome
347+
/// and other browsers, then stop the stream to release the permission)
335348
/// TODO(cybex-dev) - check supported media streams
336-
html.MediaStream mediaStream = await _webNavigatorDelegate.getUserMedia(audio: true);
349+
html.MediaStream mediaStream = await _webMediaDevicesDelegate?.getUserMedia({"audio": true}) ??
350+
await _webNavigatorDelegate.getUserMedia(audio: true);
337351
mediaStream.getTracks().forEach((track) => track.stop());
338352
return hasMicAccess();
339353
} catch (e) {

0 commit comments

Comments
 (0)