Android使用USB web camera时无法启用设备麦克风相关问题咨询
Android USB摄像头占用音频通道/内置麦克风无法调用解决方案
优先选择应用层强制指定内置麦克风的方案,无需修改系统设置,普通三方应用即可实现。
方案1:应用层强制路由音频输入到内置麦克风
- 权限配置:在Manifest中声明必选权限
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- Android 12+ 如需访问USB设备可额外添加,不需要可忽略 --> <uses-permission android:name="android.permission.HOST_USB" /> - 运行时筛选内置麦克风设备,Android 10及以上可直接指定偏好输入设备,示例代码如下:
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); AudioDeviceInfo[] allInputDevices = audioManager.getDevices(AudioManager.GET_DEVICES_INPUTS); AudioDeviceInfo builtInMic = null; // 筛选类型为内置麦克风的音频输入设备 for (AudioDeviceInfo device : allInputDevices) { if (device.getType() == AudioDeviceInfo.TYPE_BUILTIN_MIC) { builtInMic = device; break; } } if (builtInMic != null) { // 构建指定用内置麦克风的AudioRecord实例 AudioRecord audioRecord = new AudioRecord.Builder() .setAudioSource(MediaRecorder.AudioSource.VOICE_RECOGNITION) .setAudioFormat(new AudioFormat.Builder() .setEncoding(AudioFormat.ENCODING_PCM_16BIT) .setSampleRate(16000) .setChannelMask(AudioFormat.CHANNEL_IN_MONO) .build()) .setPreferredDevice(builtInMic) .build(); // 自行采集音频流输入到Google Speech To Text SDK即可,不要使用SDK默认的音频采集逻辑 } - Android 9及以下兼容方案:使用已废弃的
setRouting方法强制切换音频路由audioManager.setRouting(AudioManager.MODE_IN_COMMUNICATION, AudioManager.ROUTE_SPEAKER, AudioManager.ROUTE_ALL);
方案2:代码修改开发者选项「Disable USB audio routing」开关
该方案需要特殊权限,仅适合系统预装应用、ROOT设备或者可引导用户手动授权的场景,开关全局生效会影响所有应用的USB音频使用。
- 权限要求:需要
android.permission.WRITE_SECURE_SETTINGS权限,普通应用可通过adb命令手动授权:
系统签名应用可直接在Manifest中声明该权限。adb shell pm grant 你的应用包名 android.permission.WRITE_SECURE_SETTINGS - 修改开关代码:
// 1代表开启Disable USB audio routing,0代表关闭 Settings.Secure.putInt(getContentResolver(), "usb_audio_disable_routing", 1);
注意:部分厂商定制ROM修改了原生音频路由逻辑,上述方案可能需要针对特定机型做适配。
内容的提问来源于stack exchange,提问作者Thirumoorthy
相关产品推荐
相关产品推荐

