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

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

С другой стороны, как только полученное сфокусированное приложение перестанет воспроизводиться, сфокусированное потерянное приложение снова начнет играть.

Может ли кто-нибудь предложить, чего мне здесь не хватает, чтобы добиться того же в моем приложении? Я хочу, чтобы как только другое приложение перестанет воспроизводить, мое приложение должно НАБРАТЬ Фокус и начать играть.

private void setupAudioManager() {
        audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
        audioManager.requestAudioFocus(audioFocusListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
        audioFocusListener = new OnAudioFocusChangeListener() {
            @Override
            public void onAudioFocusChange(int focusChange) {
                switch (focusChange) {
                    case AUDIOFOCUS_GAIN:
                        if (mediaPlayer == null) setupMediaPlayer();
                        else if (!mediaPlayer.isPlaying()) {
                            play();
                        }
                        mediaPlayer.setVolume(MEDIA_PLAYER_LEFT_VOLUME, MEDIA_PLAYER_RIGHT_VOLUME);
                        break;

                    case AUDIOFOCUS_LOSS:
                        if (isPlaying()) {
                            Intent intent = new Intent("HomeActivity");
                            intent.putExtra("playerState", "pause");
                            LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);
                        }

                        break;

                    case AUDIOFOCUS_LOSS_TRANSIENT:
                        if (isPlaying()) pause();
                        break;

                    case AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
                        if (isPlaying()) mediaPlayer.setVolume(MEDIA_PLAYER_LEFT_VOLUME_LOW,
                                MEDIA_PLAYER_RIGHT_VOLUME_LOW);
                        break;

                }
            }
        };
    }

Ищу ваше предложение.


person Hi Ten    schedule 09.06.2017    source источник
comment
с какой проблемой вы столкнулись ??   -  person sumit    schedule 09.06.2017
comment
объясните проблему. какой конкретный код работает не так, как ожидалось?   -  person Ispas Claudiu    schedule 09.06.2017
comment
Например, мой проигрыватель воспроизводит звук, и как только я начинаю играть в GANA APP, он вызывает AUDIOFOCUS_LOSS и приостанавливает мой проигрыватель. Теперь, по прошествии некоторого времени, я останавливаю звук в приложении GANA и хочу, чтобы мой проигрыватель снова запустился ... Нужно ли мне запускать какой-либо радиослушатель или что-то еще.   -  person Hi Ten    schedule 09.06.2017
comment
Отметьте это stackoverflow.com/questions/1838055/   -  person Ninja    schedule 10.06.2017
comment
@Ninja, я уже обработал onCallStateChanged и отлично работает. после того, как Google и с помощью stackoverflow обнаружил, что мне нужно использовать MediaController Ответить на изменение фокуса звука, но все равно не удалось.   -  person Hi Ten    schedule 10.06.2017


Ответы (1)


Вот мои выводы

В случае постоянной потери фокуса

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

После приостановки ваше приложение должно подождать короткий интервал, а затем остановить сеанс мультимедиа, чтобы освободить ресурсы и отказаться от аудиофокуса. Отсрочка вызова остановки дает пользователю возможность перезапустить воспроизведение вашего приложения. Это может быть полезно, если ваше приложение перестает работать, потому что пользователь случайно запустил другое приложение, которое запросило аудиофокус.

Следующий фрагмент кода демонстрирует, как реализовать OnAudioFocusChangeListener и его обратный вызов onAudioFocusChange (). Обратите внимание на использование обработчика для задержки обратного вызова остановки при постоянной потере аудиофокуса.

private Handler mHandler = new Handler();
AudioManager.OnAudioFocusChangeListener afChangeListener =
  new AudioManager.OnAudioFocusChangeListener() {
    public void onAudioFocusChange(int focusChange) {
      if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
        // Permanent loss of audio focus
        // Pause playback immediately
        mediaController.getTransportControls().pause();
        // Wait 30 seconds before stopping playback
        mHandler.postDelayed(mDelayedStopRunnable,
          TimeUnit.SECONDS.toMillis(30));
      }
      else if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT) {
        // Pause playback
      } else if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) {
        // Lower the volume, keep playing
      } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
        // Your app has been granted audio focus again
        // Raise volume to normal, restart playback if necessary
      }
    }
  };

Обработчик использует Runnable, который выглядит так:

private Runnable mDelayedStopRunnable = new Runnable() {
    @Override
    public void run() {
        mediaController.getTransportControls().stop();
    }
};

Чтобы гарантировать, что отложенная остановка не сработает, если пользователь перезапустит воспроизведение, вызовите mHandler.removeCallbacks (mDelayedStopRunnable) в ответ на любые изменения состояния. Например, вызовите removeCallbacks () в функциях обратного вызова onPlay (), onSkipToNext () и т. Д. Вы также должны вызвать этот метод в обратном вызове onDestroy () вашей службы при очистке ресурсов, используемых вашей службой.

person Hi Ten    schedule 10.06.2017