在android中自动恢复播放背景音乐

在android中自动恢复播放背景音乐,android,android-service,android-storage,Android,Android Service,Android Storage,我正在开发一款音乐播放器,它在后台运行音乐作为音频服务 假设音乐在后台通过我的应用程序播放,用户从其他应用程序(如Youtube)播放另一个媒体文件,然后退出该应用程序。这会暂停通过我的应用程序播放的音乐,现在用户必须手动恢复音乐 如何在外部媒体文件关闭后自动恢复音乐文件?我想您正在寻找控制音乐文件的方法。本节讨论当另一个应用程序/您的应用程序控制音频焦点时,如何实施更改,即增益调整(回避音量) 但是,请注意,如合同中所述: 永久失去焦点 如果音频焦点丢失是永久性的 (AUDIOFOCUS_LO

我正在开发一款音乐播放器,它在后台运行音乐作为音频服务

假设音乐在后台通过我的应用程序播放,用户从其他应用程序(如Youtube)播放另一个媒体文件,然后退出该应用程序。这会暂停通过我的应用程序播放的音乐,现在用户必须手动恢复音乐


如何在外部媒体文件关闭后自动恢复音乐文件?

我想您正在寻找控制音乐文件的方法。本节讨论当另一个应用程序/您的应用程序控制音频焦点时,如何实施更改,即增益调整(回避音量)

但是,请注意,如合同中所述:

永久失去焦点

如果音频焦点丢失是永久性的 (AUDIOFOCUS_LOSS),另一个应用程序正在播放音频。你的应用程序应该暂停 立即播放,因为它永远不会获得音频聚焦增益 回拨。要重新启动播放,用户必须执行显式操作, 如在通知或应用程序UI中按播放传输控件

这是假设接收到永久性的音频焦点丢失,但是我可以看到一些解决方法,比如轮询音频焦点,但最好不要这样做。如上所述,他们明确表示:

用户必须采取明确的操作

mAudioManager = (AudioManager) Context.getSystemService(Context.AUDIO_SERVICE);
mPlaybackAttributes = new AudioAttributes.Builder()
        .setUsage(AudioAttributes.USAGE_GAME)
        .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
        .build();
mFocusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
        .setAudioAttributes(mPlaybackAttributes)
        .setAcceptsDelayedFocusGain(true)
        .setOnAudioFocusChangeListener(mMyFocusListener, mMyHandler)
        .build();
mMediaPlayer = new MediaPlayer();
final Object mFocusLock = new Object();

boolean mPlaybackDelayed = false;
boolean mPlaybackNowAuthorized = false;

// ...
int res = mAudioManager.requestAudioFocus(mFocusRequest);
synchronized(mFocusLock) {
    if (res == AudioManager.AUDIOFOCUS_REQUEST_FAILED) {
        mPlaybackNowAuthorized = false;
    } else if (res == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
        mPlaybackNowAuthorized = true;
        playbackNow();
    } else if (res == AudioManager.AUDIOFOCUS_REQUEST_DELAYED) {
       mPlaybackDelayed = true;
       mPlaybackNowAuthorized = false;
    }
}

// ...
@Override
public void onAudioFocusChange(int focusChange) {
    switch (focusChange) {
        case AudioManager.AUDIOFOCUS_GAIN:
            if (mPlaybackDelayed || mResumeOnFocusGain) {
                synchronized(mFocusLock) {
                    mPlaybackDelayed = false;
                    mResumeOnFocusGain = false;
                }
                playbackNow();
            }
            break;
        case AudioManager.AUDIOFOCUS_LOSS:
            synchronized(mFocusLock) {
                mResumeOnFocusGain = false;
                mPlaybackDelayed = false;
            }
            pausePlayback();
            break;
        case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
            synchronized(mFocusLock) {
                mResumeOnFocusGain = true;
                mPlaybackDelayed = false;
            }
            pausePlayback();
            break;
        case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
            // ... pausing or ducking depends on your app
            break;
        }
    }
}