我在开发媒体播放器时遇到了类似的情况。我的解决方案是使用AudioManager的
OnAudioFocusChangeListener
。
您可以像以下这样在类中实现该监听器。
public class VideoPlayerHelper implements AudioManager.OnAudioFocusChangeListener {
然后你重写
onAudioFocusChange
方法。
@Override
public void onAudioFocusChange(int focusChange) {
switch (focusChange) {
case AudioManager.AUDIOFOCUS_LOSS:
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
LogUtil.log(LogUtil.DEBUG, TAG, "AUDIOFOCUS_LOSS or AUDIOFOCUS_LOSS_TRANSIENT");
if (isPlaying()) {
pause();
mAudioManager.abandonAudioFocus(VideoPlayerHelper.this);
}
break;
case AudioManager.AUDIOFOCUS_GAIN:
LogUtil.log(LogUtil.DEBUG, TAG, "AUDIOFOCUS_GAIN");
break;
default:
break;
}
}
重点在于
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT
。当闹钟响起时(在Note 5上),监听器一直收到这个代码。因此,我通过暂停媒体播放器并释放音频焦点来处理
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT
和
AudioManager.AUDIOFOCUS_LOSS
相同。
当我们设置媒体播放器时,在添加数据源之前,我添加了这行代码。
player.setAudioStreamType(AudioManager.STREAM_MUSIC)
确保你启动媒体播放器的代码也包含这行代码(我在启动代码和onResume
代码中都有它,以防闹钟在应用程序在后台时响起)。
mAudioManager.requestAudioFocus(VideoPlayerHelper.this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT)
那行代码可以在你关闭闹钟后,帮助你重新获取音频焦点。当你使用完媒体播放器后,也应该释放音频焦点。我将这行代码放在onStop和onDetach方法中。
mAudioManager.abandonAudioFocus(VideoPlayerHelper.this)
你可能认为这需要大量设置,但实际上不是。这使得你可以在出现意外音频(例如闹钟或计时器响起)时调整媒体播放器。
Intent
动作不是SDK的一部分--任何以“com.android”开头的内容都不是SDK的一部分。不要依赖那个Intent
。它可能无法在某些设备上使用(那些用自定义应用程序替换了标准闹钟的设备)。此外,它可能无法在未来的Android版本上工作。http://www.androidguys.com/2009/12/14/code-pollution-reaching-past-the-sdk/ - CommonsWare