android插上耳机的时候仍然使用机身的麦克风录音,解决!

问题:我希望在插上耳机的时候,仍然使用机身的麦克风接受外界输入,耳机播放音频与机身麦克风接受外音互不干扰。

但是:在采用录音音源MediaRecorder.AudioSource.MIC时,插上耳机之后,除了扬声器以外,麦克风也切换到了耳机(没有带麦的用听筒录音哈哈),机身麦克风被屏蔽。

于是:改变录音音源为MediaRecorder.AudioSource.CAMCORDER

Microphone audio source with same orientation as camera if available, the main device microphone otherwise

麦克风音源为与摄像头同向的(如果有的话),或者为主设备的麦克风。

结果:插上耳机的时候仍然使用机身的麦克风接受外界输入。解决!

其余东西:

1.audio source


2.Audio输出通道的切换

Android通话或播放音乐等使用Audio输出过程中,可能发生Audio输出通道的切换。比如,插入有线耳机播放音乐时,声音是从耳机发出的;而此时拔出耳机,Audio输出通道会发生切换。

public static final String ACTION_AUDIO_BECOMING_NOISY

广播intent,提示应用程序音频信号由于音频输出的变化将变得“嘈杂”。例如,当拔出一个有线耳机,或断开一个支持A2DP的音频接收器,这个intent就会被发送,且音频系统将自动切换音频线路到扬声器。收到这个intent后,控制音频流的应用程序会考虑暂停,减小音量或其他措施,以免扬声器的声音使用户惊奇。

常量值:"android.media.AUDIO_BECOMING_NOISY"





  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
实现从耳机和自带麦克风切换录音需要利用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是一个标志位,用于控制录制的开始和结束。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值