Android 如何在其他应用程序播放音乐时暂停视频,并在音乐停止后恢复?

Android 如何在其他应用程序播放音乐时暂停视频,并在音乐停止后恢复?,android,android-mediaplayer,android-videoview,Android,Android Mediaplayer,Android Videoview,当播放视频并且我从音乐应用程序中的通知恢复音乐时,视频仍在播放。音乐和视频同时播放。我想要的是在音乐开始时暂停视频。Youtube应用程序就是我在这里解释的。当谷歌搜索时,我发现AudioFocus在这种情况下用于MediaPlayer。VideoView支持AudioFocus吗?如果支持,那么如何使用它来实现上述目标?您可以调用changeAudioFocus(true) 当您开始从应用程序播放媒体时。它将在AudioFocusChangeListener上创建一个并使用AudioManag

当播放视频并且我从音乐应用程序中的通知恢复音乐时,视频仍在播放。音乐和视频同时播放。我想要的是在音乐开始时暂停视频。Youtube应用程序就是我在这里解释的。当谷歌搜索时,我发现AudioFocus在这种情况下用于MediaPlayer。VideoView支持AudioFocus吗?如果支持,那么如何使用它来实现上述目标?

您可以调用
changeAudioFocus(true)

当您开始从应用程序播放媒体时。它将在AudioFocusChangeListener上创建一个
并使用
AudioManager
进行设置,当您收到
AUDIOFOCUS\u LOSS
AUDIOFOCUS\u LOSS\u TRANSIENT
消息时,您将收到一个回调

您还可以获得
AUDIOFOCUS\u LOSS\u TRANSIENT\u CAN\u DUCK
,用于降低播放机的音量,某些媒体播放机在收到通知声音时会这样做

/**
  * Used to indicate a transient loss of audio focus where the loser of the audio focus can
     * lower its output volume if it wants to continue playing (also referred to as "ducking"), as
     * the new focus owner doesn't require others to be silent.
     * @see OnAudioFocusChangeListener#onAudioFocusChange(int)
     */
代码


调用onPause时是否尝试暂停MediaPlayer/ExoPlayer?我使用的是videoview,在这种情况下,不会调用onPause。我播放视频并向下滑动状态栏,其中有一个音乐应用程序的服务通知以播放音乐。我可能错了,但您可以尝试使用广播接收器,因此当它检测到音乐开始播放时,视频将停止,因为它收到广播接收器的通知。尝试了此操作,但不起作用,所以我做了一个肮脏的工作。我使用了_onWindowFocusChanged()_,当状态栏向下滑动时会调用它,并检查mediaPlayer是否正在播放此函数。这只适用于我的应用程序的音乐。应该已经工作,在此应用程序中使用相同的代码:并且工作正常。
    private final OnAudioFocusChangeListener mAudioFocusListener = createOnAudioFocusChangeListener();
    private AudioManager mAudioManager = null;
    private boolean mHasAudioFocus = false;
    private void changeAudioFocus(boolean acquire) {
        if (mAudioManager == null)
            mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
        if (mAudioManager == null)
            return;

        if (acquire) {
            if (!mHasAudioFocus) {
                final int result = mAudioManager.requestAudioFocus(mAudioFocusListener,
                        AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
                if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
                    mAudioManager.setParameters("bgm_state=true");
                    mHasAudioFocus = true;
                }
            }
        } else if (mHasAudioFocus) {
            mAudioManager.abandonAudioFocus(mAudioFocusListener);
            mAudioManager.setParameters("bgm_state=false");
            mHasAudioFocus = false;
        }
    }

private OnAudioFocusChangeListener createOnAudioFocusChangeListener() {
    return new OnAudioFocusChangeListener() {
        int audioDuckLevel = -1;
        private int mLossTransientVolume = -1;
        private boolean wasPlaying = false;

        @Override
        public void onAudioFocusChange(int focusChange) {
            /*
             * Pause playback during alerts and notifications
             */
            switch (focusChange) {
                case AudioManager.AUDIOFOCUS_LOSS:
                    if (BuildConfig.DEBUG) Log.i(TAG, "AUDIOFOCUS_LOSS");
                    // Pause playback
                    changeAudioFocus(false);
                    pause();
                    break;
                case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                    if (BuildConfig.DEBUG) Log.i(TAG, "AUDIOFOCUS_LOSS_TRANSIENT");
                    // Pause playback
                    pausePlayback();
                    break;
                case AudioManager.AUDIOFOCUS_GAIN:
                    if (BuildConfig.DEBUG) Log.i(TAG, "AUDIOFOCUS_GAIN: ");
                    // Resume playback
                    if (mLossTransientVolume != -1) {
                            mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mLossTransientVolume, 0);
                        mLossTransientVolume = -1;
                    }
                    if (mLossTransient) {
                        if (wasPlaying && mSettings.getBoolean("resume_playback", true))
                            play();
                        mLossTransient = false;
                    }
                    break;
            }
        }

        private void pausePlayback() {
            if (mLossTransient) return;
            mLossTransient = true;
            wasPlaying = isPlaying();
            if (wasPlaying) pause();
        }
    };
}