Странное мигание на экране блокировки клиента удаленного управления при остановке его из самого клиента

В настоящее время я создаю потоковое приложение для Android и пытаюсь интегрировать клиент удаленного управления (например, для управления с экрана блокировки на ICS+).

Для этого я делаю это при запуске в моей потоковой службе:

    int result = audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);

    if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
        stopSelf();
    }

    mediaButtonReceiverComponent = new ComponentName(this, RemoteControlReceiver.class);
    audioManager.registerMediaButtonEventReceiver(mediaButtonReceiverComponent);

    if (remoteControlClientCompat == null) {
        final Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
        mediaButtonIntent.setComponent(mediaButtonReceiverComponent);
        remoteControlClientCompat = new RemoteControlClientCompat(
                PendingIntent.getBroadcast(
                        getApplicationContext(),
                        0,
                        mediaButtonIntent,
                        PendingIntent.FLAG_UPDATE_CURRENT
                )
        );
        RemoteControlHelper.registerRemoteControlClient(audioManager, remoteControlClientCompat);
    }

    final int flags = RemoteControlClient.FLAG_KEY_MEDIA_STOP;
    remoteControlClientCompat.setTransportControlFlags(flags);

remoteControlClientCompat – это просто экземпляр RemoteControlClientCompat из примеров.

затем во время потоковой передачи я обновляю метаданные. все работает нормально, даже управление отправляется на мой RemoteControlReceiver. Данные и изображение хорошо отображаются на экране блокировки.

Остановка потоковой передачи из моего приложения уничтожает экран блокировки, но когда я пытаюсь уничтожить его из самого виджета (нажав кнопку остановки), он делает что-то странное. Нажатие кнопки остановки заставляет вещательный приемник останавливать мой потоковый сервис. Затем в методе службы onDestroy() я делаю это:

    RemoteControlHelper.unregisterRemoteControlClient(audioManager, remoteControlClientCompat);
    audioManager.unregisterMediaButtonEventReceiver(mediaButtonReceiverComponent);
    audioManager.abandonAudioFocus(this);

Виджет начинает мигать, как только вызывается audioManager.unregisterMediaButtonEventReceiver(mediaButtonReceiverComponent);. Я попытался прокомментировать строку, и мигание происходит с audioManager.abandonAudioFocus(this);. Комментирование этой другой строки также заставляет ее мигать, когда служба останавливается.

Я заметил, что это тоже происходит, когда я останавливаю потоковую передачу из своего уведомления.

Что я делаю неправильно? Я попытался изменить порядок этих вызовов, но не смог решить эту проблему. Я заметил, что пару версий назад у Spotify была точно такая же проблема. Интересно, как они это решили...


person Romain Piel    schedule 18.07.2013    source источник


Ответы (1)


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

remoteControlClientCompat.setPlaybackState(RemoteControlClient.PLAYSTATE_PAUSED);
person Romain Piel    schedule 18.07.2013