我正在将音乐播放器作为一项服务实现,并希望在手机收到通知时降低音乐的音量。
这是我的做法:
AudioManager audioManager = (AudioManager)getApplicationContext(). getSystemService(Context.AUDIO_SERVICE);
int result = audioManager.requestAudioFocus(mOnAudioFocusChangeListener, AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN);
我的听众是:
private AudioManager.OnAudioFocusChangeListener mOnAudioFocusChangeListener = new AudioManager.OnAudioFocusChangeListener() {
public void onAudioFocusChange(int focusChange) {
switch (focusChange) {
case AudioManager.AUDIOFOCUS_GAIN:
if (!mediaPlayer.isPlaying()){
mediaPlayer.start();
mediaPlayer.setVolume(1.0f, 1.0f);
}
break;
case AudioManager.AUDIOFOCUS_LOSS:
// Lost focus for an unbounded amount of time: stop playback and release media player
if (mediaPlayer.isPlaying()) mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
if (mediaPlayer.isPlaying()) mediaPlayer.pause();
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
// Lost focus for a short time, but it's ok to keep playing
// at an attenuated level
if (mediaPlayer.isPlaying()) mediaPlayer.setVolume(0.2f, 0.2f);
break;
default:break;
}
}
};
来电时,一切正常。当我收到短信、gmail、whatsapp 等...通知时,监听器不会捕获事件。
我也尝试过:
AudioManager audioManager = (AudioManager)getApplicationContext(). getSystemService(Context.AUDIO_SERVICE);
int result = audioManager.requestAudioFocus(mOnAudioFocusChangeListener, AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK);
就像这里解释的那样:Managin Audio Focus
但是监听器并没有监听通知输入。
而且我还尝试在服务中实现 AudioManager.OnAudioFocusChangeListener,但发生的情况相同,调用处理得很好,通知却没有。
我已经在 list 上添加了这个.... 使用权限 android:name="android.permission.MODIFY_AUDIO_SETTINGS
我能做什么?为什么通知不会改变 AudioFocus ??
最佳答案
Android audioFocus 就像一个生态系统标志。建议这样应用程序可以在音频使用方面相互“很好地播放”,但不是必需的。应用程序仍然可以在不获取 audioFocus 的情况下播放音频。
这也是 native 行为。通知不应调暗/暂停/停止您的音乐或通话音频。您可以通过原生 Android 应用播放音频并触发短信通知声音来验证。
这可能有两个原因
仅当其他应用在 AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK 上调用 audioFocus 时,才会触发 AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK。播放通知时,手机应用可以,但其他应用没有。
我推测:STREAM_RINGTONE audioFocus 不会影响 STREAM_MUSIC 或 STREAM_CALL 的 audioFocus。如果为真,则这是 Android 架构决定将 RINGTONE 视为次要音频而不干扰主要音频。
总而言之,根据设计和实现,STREAM_RINGTONE 会而且不应导致 STREAM_MUSIC 通过 audioFocus 闪避。
关于android - 无法在 OnAudioFocusChangeListener 中处理 "duck"我的音频的通知声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22361120/