【发布时间】:2020-04-09 16:07:13
【问题描述】:
我正在编写信使(具有 VoIP 功能),用户可以在其中单独关闭/打开扬声器和麦克风。我刚刚添加了一个功能,用户可以将手机放在耳边,然后屏幕关闭,他可以通过耳机听到对话。这是问题所在。在一台设备上(使用自定义固件),当我同时打开扬声器和麦克风并将手机放在耳边时,我什么也听不见。
我的部分代码:
打开扬声器:
private void headsetStart()
{
if (mPlayMessages == null)
{
mHeadsetButton.setBackgroundResource(R.drawable.headset_on);
audioManager.setMode(audioManager.MODE_IN_COMMUNICATION);
audioManager.setSpeakerphoneOn(!nearProximity);
// turn off screen on near proximity sensor
mWakeLock = mPowerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, ":headsetStart");
mWakeLock.acquire();
mBeOnAirThread = new BeOnAirThread();
mBeOnAirThread.start();
if (partnerOnAir && !mIsStarted)
{
micStart();
}
}
}
private class BeOnAirThread extends Thread {
// Sample rate must be one supported by Opus.
static final int SAMPLE_RATE = 16000;
// Number of samples per frame is not arbitrary,
// it must match one of the predefined values, specified in the standard.
static final int FRAME_SIZE = 160;
// 1 or 2
static final int NUM_CHANNELS = 1;
@Override
public void run() {
Process.setThreadPriority(Process.THREAD_PRIORITY_MORE_FAVORABLE);
int minBufSize = AudioRecord.getMinBufferSize(SAMPLE_RATE,
NUM_CHANNELS == 1 ? AudioFormat.CHANNEL_IN_MONO : AudioFormat.CHANNEL_IN_STEREO,
AudioFormat.ENCODING_PCM_16BIT);
// init audio track
AudioTrack track = new AudioTrack(AudioManager.STREAM_VOICE_CALL,
SAMPLE_RATE,
NUM_CHANNELS == 1 ? AudioFormat.CHANNEL_OUT_MONO : AudioFormat.CHANNEL_OUT_STEREO,
AudioFormat.ENCODING_PCM_16BIT,
minBufSize,
AudioTrack.MODE_STREAM);
.....................................
初始化麦克风:
private class RecordThread extends Thread {
// Sample rate must be one supported by Opus.
static final int SAMPLE_RATE = 16000;
// Number of samples per frame is not arbitrary,
// it must match one of the predefined values, specified in the standard.
static final int FRAME_SIZE = 160;
// 1 or 2
static final int NUM_CHANNELS = 1;
byte[] textBuf;
int iav;
int off;
@Override
public void run() {
Process.setThreadPriority(Process.THREAD_PRIORITY_MORE_FAVORABLE);
int minBufSize = AudioRecord.getMinBufferSize(SAMPLE_RATE,
NUM_CHANNELS == 1 ? AudioFormat.CHANNEL_IN_MONO : AudioFormat.CHANNEL_IN_STEREO,
AudioFormat.ENCODING_PCM_16BIT);
// initialize audio recorder
AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION,
SAMPLE_RATE,
NUM_CHANNELS == 1 ? AudioFormat.CHANNEL_IN_MONO : AudioFormat.CHANNEL_IN_STEREO,
AudioFormat.ENCODING_PCM_16BIT,
minBufSize);
..........................................
经验证明,如果在“audioManager.setSpeakerphoneOn(!nearProximity)”之前停止 RecordThread 并在它之后重新启动它,那么耳机就可以工作。 但是对我来说重新连接到服务器是不可取的。所以我也尝试在“audioManager.setSpeakerphoneOn(!nearProximity)”之前做“recorder.stop();recorder.release()”并在它之后重建新的AudioRecord,但它没有帮助。
有什么想法吗?
【问题讨论】: