允许网站使用相机和麦克风_是否可以检查用户是否有相机和麦克风,并且是否已经通过Javascript授予权限?...

现场演示:

如果用户没有允许网络摄像头和/或麦克风,则媒体设备的“label”属性将具有“NULL”值.以上页面将显示此消息:“请调用getUserMedia一次”.

PS.您可以在Chrome控制台开发人员工具中输入“DetectRTC.MediaDevices”.

注意:它仅适用于Chrome. Firefox还不支持类似的API. (更新:Firefox支持)

于2015年12月16日更新

注意:以下代码段在Chrome和Firefox中都可用.

if (navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) {

// Firefox 38+ seems having support of enumerateDevicesx

navigator.enumerateDevices = function(callback) {

navigator.mediaDevices.enumerateDevices().then(callback);

};

}

var MediaDevices = [];

var isHTTPs = location.protocol === 'https:';

var canEnumerate = false;

if (typeof MediaStreamTrack !== 'undefined' && 'getSources' in MediaStreamTrack) {

canEnumerate = true;

} else if (navigator.mediaDevices && !!navigator.mediaDevices.enumerateDevices) {

canEnumerate = true;

}

var hasMicrophone = false;

var hasSpeakers = false;

var hasWebcam = false;

var isMicrophoneAlreadyCaptured = false;

var isWebcamAlreadyCaptured = false;

function checkDeviceSupport(callback) {

if (!canEnumerate) {

return;

}

if (!navigator.enumerateDevices && window.MediaStreamTrack && window.MediaStreamTrack.getSources) {

navigator.enumerateDevices = window.MediaStreamTrack.getSources.bind(window.MediaStreamTrack);

}

if (!navigator.enumerateDevices && navigator.enumerateDevices) {

navigator.enumerateDevices = navigator.enumerateDevices.bind(navigator);

}

if (!navigator.enumerateDevices) {

if (callback) {

callback();

}

return;

}

MediaDevices = [];

navigator.enumerateDevices(function(devices) {

devices.forEach(function(_device) {

var device = {};

for (var d in _device) {

device[d] = _device[d];

}

if (device.kind === 'audio') {

device.kind = 'audioinput';

}

if (device.kind === 'video') {

device.kind = 'videoinput';

}

var skip;

MediaDevices.forEach(function(d) {

if (d.id === device.id && d.kind === device.kind) {

skip = true;

}

});

if (skip) {

return;

}

if (!device.deviceId) {

device.deviceId = device.id;

}

if (!device.id) {

device.id = device.deviceId;

}

if (!device.label) {

device.label = 'Please invoke getUserMedia once.';

if (!isHTTPs) {

device.label = 'HTTPs is required to get label of this ' + device.kind + ' device.';

}

} else {

if (device.kind === 'videoinput' && !isWebcamAlreadyCaptured) {

isWebcamAlreadyCaptured = true;

}

if (device.kind === 'audioinput' && !isMicrophoneAlreadyCaptured) {

isMicrophoneAlreadyCaptured = true;

}

}

if (device.kind === 'audioinput') {

hasMicrophone = true;

}

if (device.kind === 'audiooutput') {

hasSpeakers = true;

}

if (device.kind === 'videoinput') {

hasWebcam = true;

}

// there is no 'videoouput' in the spec.

MediaDevices.push(device);

});

if (callback) {

callback();

}

});

}

// check for microphone/camera support!

checkDeviceSupport(function() {

document.write('hasWebCam: ', hasWebcam, '
');

document.write('hasMicrophone: ', hasMicrophone, '
');

document.write('isMicrophoneAlreadyCaptured: ', isMicrophoneAlreadyCaptured, '
');

document.write('isWebcamAlreadyCaptured: ', isWebcamAlreadyCaptured, '
');

});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现从耳机和自带麦克风切换录音需要利用Android系统的AudioManager和AudioRecord类。以下是一种可能的实现方法: 1. 通过AudioManager获取当前的音频输入源,可以使用getMode()方法获取当前的音频模式,使用getRouting()方法获取当前音频输入输出路由信息。 2. 如果当前的音频输入源是耳机,则使用setMode()方法将音频模式设置为MODE_IN_COMMUNICATION,这样就可以在插入耳机的情况下继续使用机身的麦克风。 3. 创建一个AudioRecord对象,并使用setAudioSource()方法将音频源设置为MIC,这样就可以使用麦克风录制音频。 4. 开始录制音频之前,需要设置音频格式、采样率、音频通道数等参数,并调用startRecording()方法开始录制。 5. 录制结束后,调用stop()方法停止录制,并使用release()方法释放资源。 以下是示例代码: ``` AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); // 获取当前的音频输入源 int mode = audioManager.getMode(); int routing = audioManager.getRouting(AudioManager.MODE_IN_COMMUNICATION); if (routing == AudioManager.ROUTE_EARPIECE && mode == AudioManager.MODE_IN_COMMUNICATION) { // 如果当前的音频输入源是耳机,则将音频模式设置为MODE_IN_COMMUNICATION audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION); } // 创建AudioRecord对象 int bufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT); AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT, bufferSize); // 开始录制音频 audioRecord.startRecording(); byte[] buffer = new byte[bufferSize]; while (isRecording) { int length = audioRecord.read(buffer, 0, bufferSize); // 处理音频数据 } audioRecord.stop(); audioRecord.release(); ``` 其中,SAMPLE_RATE、CHANNEL_CONFIG和AUDIO_FORMAT分别表示音频采样率、通道配置和格式,可以根据实际需要进行设置。isRecording是一个标志位,用于控制录制的开始和结束。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值