Авто резюме Фоновая музыка играет в Android - PullRequest
0 голосов
/ 05 июля 2018

Я работаю над музыкальным проигрывателем, который запускает музыку в качестве аудио-службы в фоновом режиме.

Предположим, что музыка воспроизводится через мое приложение в фоновом режиме, и пользователь воспроизводит другой медиа-файл из другого приложения (например, Youtube), а затем закрывает это приложение. Что это приостанавливает воспроизведение музыки через мое приложение, и теперь пользователь должен возобновить музыку вручную.

Как автоматически возобновить музыкальный файл после закрытия внешнего медиа-файла?

1 Ответ

0 голосов
/ 06 июля 2018

Я думаю, что вы ищете для управления Audio Focus . Здесь обсуждается, как реализовать изменения, когда другое приложение / ваше приложение получает контроль над аудио-фокусом, то есть настройки усиления (приглушение громкости).

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;
        }
    }
}

Однако, пожалуйста, обратите внимание, как указано в документации :

Постоянная потеря фокуса

Если потеря фокуса звука является постоянной (AUDIOFOCUS_LOSS), другое приложение воспроизводит звук. Ваше приложение должно остановиться воспроизведение немедленно, так как оно никогда не получит AUDIOFOCUS_GAIN Перезвоните. Чтобы возобновить воспроизведение, пользователь должен предпринять явное действие, например, нажав кнопку управления воспроизведением транспорта в интерфейсе уведомлений или приложения.

Предполагается, что получена постоянная потеря фокуса звука, однако я вижу некоторые обходные пути, например опрос фокуса звука, но, вероятно, лучше этого не делать. Как сказано, они прямо заявили, что:

пользователь должен предпринять явное действие

...