Android WebView 的 Webrtc 枚举设备,报 NotReadableError, Could not start audio source 错误

今天,做了一个通过Webrtc接口枚举音频设备的测试代码,代码如下:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>WebRTC获取音视频设备</title>
	<meta name="viewport" content="width=device-width,initial-scale=1" />
	<style>
		.dev-item {
			height: 28px;
			
		}
		
		.dev-row {
			padding: 6px 10px;
			height: 28px;
		}
	</style>
	
</head>
<body>
	<div class="dev-row">
		<label>音频输入设备</label>
		<select class="dev-item" id="audio_input"></select>
	</div>
	<div class="dev-row">
		<label>视频输入设备</label>
		<select class="dev-item" id="video_input"></select>
	</div>
	<div class="dev-row">
		<label>音频输出设备</label>
		<select class="dev-item"  id="audio_output"></select>
	</div>
	<div class="dev-row" style="display:none" id="video-output-row">
		<label>视频输出设备</label>
		<select class="dev-item"  id="video_output"></select>
	</div
</body>
</html>

<script>
'use strict'
 
var audioInput = document.querySelector("select#audio_input");
var videoInput = document.querySelector("select#video_input");
var audioOutput = document.querySelector("select#audio_output");
var videoOutput = document.querySelector("select#video_output");
var videoOutputRow = document.querySelector("#video-output-row");

function HandleError(err) {
    console.log(err.name + "," + err.message);
	alert(err.name + "," + err.message);
}
 
function GetStream(stream) {
    return navigator.mediaDevices.enumerateDevices();
}
 
function GetDevices(deviceInfos) {
    deviceInfos.forEach(function(deviceInfo) {
        var option = document.createElement("option");
        
        option.value = deviceInfo.deviceId;
        if (deviceInfo.kind === "audioinput") {
			option.text = deviceInfo.label || `Microphone ${audioInput.length + 1}`;
            audioInput.appendChild(option);
        } else if (deviceInfo.kind === "videoinput") {
			option.text = deviceInfo.label || `Video Input ${videoInput.length + 1}`;
            videoInput.appendChild(option);
        } else if (deviceInfo.kind === "audiooutput") {
			option.text = deviceInfo.label || `Audio Output ${audioOutput.length + 1}`;
            audioOutput.appendChild(option);
        } else if (deviceInfo.kind === "videooutput") {
			option.text = deviceInfo.label || `Video Output ${videoOutput.length + 1}`;
            videoOutput.appendChild(option);
			videoOutputRow.style.display = 'block';
        } else {
            console.log("unknown device kind");
        }
    });
}
 
if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {
    console.log('enumerateDevices is not supported!');
} else {
    navigator.mediaDevices.getUserMedia({audio: true, video: true})
    .then(GetStream)
    .then(GetDevices)
    .catch(HandleError);
}
</script>

这个代码在 Chrome里测试正常,但在Android的WebView里却报错,报的错误名为  NotReadableError, 错误描述为:Could not start audio source。通过查阅相关资料,发现解决问题的方式如下:

在App的AndroidManifest.xml 里添加如下信息:

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

解决android调用录音不成功,h5录音权限问题android NotReadableError: Could not start audio source.

这两个都需要授权,h5页面的 navigator.mediaDevices.getUserMedia 才能调起录音功能

android.permission.RECORD_AUDIO
允许程序录制音频(Allows an application to record audio)

android.permission.MODIFY_AUDIO_SETTINGS
允许程序修改全局音频设置(Allows an application to modify global audio settings)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值