DOMException:无法启动音频源



我正在编写一个React应用程序,并使用Web Speech API进行语音和语音识别。我已经写了一些在桌面Chrome上运行的代码。我请求用户许可的方式如下:

navigator.mediaDevices
.getUserMedia({ audio: true })
.then(function (stream) {
console.log('Succeeded');
/*Handle success*/
})
.catch(function (err) {
console.log('Failed: ', err)
/*Handle failure*/
});

然而,当从我的Android手机上使用时,这个相同的代码总是会进入catch回调,并在控制台中写入以下内容:

Failed: DOMException: Could not start audio source

该网站询问我是否允许使用麦克风,当我进入网站设置时,它说麦克风和声音都是允许的,这让我相信我在用户交互部分做得很好。该网站是通过HTTPS提供服务的(已经解决了这个问题(,所以我认为这也不是一个问题。

我在这次测试中使用的是Chrome浏览器86.0.4240.185的小米小米9。

我的第一直觉是我在这里做错了什么?如果是这样的话,怎么办?否则,我该怎么办才能解决此问题?

检查您的Android应用程序是否具有所需权限:

android.permission.RECORD_AUDIO
android.permission.MODIFY_AUDIO_SETTINGS (might be optional)

您可以检查html或ejs文件;您必须在正文标签中使用

例如:

<body>
<div id="video-grid">
</div>
<script src="script.js"></script>
</body>

我也有同样的错误,只是设法解决了它

步骤1:AndroidManifest.xml

向RECORD_AUDIO和MODIFY_AUDIO_SETTINGS添加权限。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
</manifest>

步骤2:MainActivity.java

当被要求时,授予对网络视图的所有访问权限。启用javascript。启动应用程序时请求录制音频的权限。

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = findViewById(R.id.webView);
webView.setWebViewClient(new WebViewClient());
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onPermissionRequest(final PermissionRequest request) {
runOnUiThread(new Runnable() {
@Override
public void run() {
request.grant(request.getResources());
}
});
}
});
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
// Check and request permissions
if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, REQUEST_CODE);
} else {
// Load the web content
webView.loadUrl("https://....com/");
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
webView.setWebContentsDebuggingEnabled(true);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission granted, load the web content
webView.loadUrl("https://....com/");
} else {
// Permission denied, show a message to the user or handle as needed
}
}
}

最新更新