android - 无法在 OnAudioFocusChangeListener 中处理 "duck"我的音频的通知声音

标签 android service notifications listener android-audiomanager

我正在将音乐播放器作为一项服务实现,并希望在手机收到通知时降低音乐的音量。

这是我的做法:

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 应用播放音频并触发短信通知声音来验证。

这可能有两个原因

  1. 仅当其他应用在 AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK 上调用 audioFocus 时,才会触发 AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK。播放通知时,手机应用可以,但其他应用没有。

  2. 我推测: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/

相关文章:

android - 是否可以将通知从抬头移动到状态栏?

android - 启用 androidX 导致 'Cannot change strategy of configuration ' :app:compile' after it has been resolved' error

android - 在 Android 中定位内存泄漏

android - 如何从服务转到主屏幕?

android - 将 Intent 从广播接收器发送到android中正在运行的服务

google-chrome-extension - 如何在 chrome 扩展中实现带有声音的通知弹出窗口

android - 如何调整 LazyVerticalGrid 中项目的高度?

android - 完成尚未停用或关闭的游标 - ormlite android sqlcipher

android - IntentService 陷入困境

ios - 是否可以从应用程序本身访问应用程序的推送通知状态?