我正在使用以下代码在设备接近任何对象时将音频流切换到耳机:
@Override public void onSensorChanged(SensorEvent event) { if (mAudioManager.isWiredHeadseton() || !(mCurrentPlaybackStatus == STATUS_PLAYING || mCurrentPlaybackStatus == STATUS_PREPARING)) { return; } boolean isClose = event.values[0] < mSensor.getMaximumRange(); if (!mScreendisabled && isClose) { mAudioManager.setMode(AudioManager.STREAM_MUSIC); mAudioManager.setSpeakerphoneOn(false); disableScreen(); mScreendisabled = true; } else if (mScreendisabled && !isClose) { mAudioManager.setSpeakerphoneOn(true); mAudioManager.setMode(mAudioManagerMode); enableScreen(); mScreendisabled = false; } }
不幸的是,调用.setMode(AudioManager.STREAM_MUSIC)时会有很大的延迟; (> 500ms)
使用Android的默认MediaPlayer,可以毫不拖延地更改输出流:
mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); // ear piece mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); // speakerphone
有没有办法改变ExoPlayer的输出流?
解决方法
要更改ExoPlayer的流类型,您需要通过MediaCodecAudioTrackRenderer构造函数将流类型传递到(ExoPlayer的)AudioTrack构造函数中,
public AudioTrack() { this(null,AudioManager.STREAM_MUSIC); //default is STREAM_MUSIC } public AudioTrack(AudioCapabilities audioCapabilities,int streamType) { }
因此,在您的应用程序中,您将在构建渲染器时指定类型.
有关详细信息,请参阅https://github.com/google/ExoPlayer/issues/755