Кнопка захвата мультимедиа Android, когда экран выключен

Я пытаюсь захватить, когда кнопка мультимедиа нажата, когда мой экран выключен. Сначала я использую getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);, чтобы поддерживать свою активность на экране блокировки, и PowerManager.PARTIAL_WAKE_LOCK (я знаю, что это разряжает батарею, но это будет только на короткое время). Затем, чтобы прослушать кнопку мультимедиа, я переопределяю public boolean onKeyDown(int keyCode, KeyEvent event) и использую if(keycode == KeyEvent.KEYCODE_HEADSETHOOK). Проблема в том, что это не работает, если экран выключен.

Я видел, как несколько человек использовали BroadcastReceiver для захвата кнопки мультимедиа. Будет ли это работать, если мой экран выключен?

Если это не сработает, могу ли я каким-либо образом зафиксировать это событие, когда экран выключен?

Если это сработает, как мне это реализовать? потому что я пытался следовать некоторому примеру здесь, но я не могу заставить его работать, даже когда экран включен. Если BroadcastReceiver будет работать, я могу опубликовать то, что у меня есть до сих пор, что не работает, даже когда экран включен.

ОБНОВИТЬ

Я нашел аналогичный ответ на странице использовать новый класс сеанса мультимедиа. Я могу снимать, когда нажата кнопка мультимедиа (даже когда экран выключен), но я не снимаю, когда нажата кнопка громкости (экран включен или выключен). Вот что я реализовал:

mediaSession = new MediaSession(getApplicationContext(), this.getLocalClassName());

if (mediaSession == null) {
    Log.e("TEST", "initMediaSession: mediaSession = null");
    return;
}

mediaSessionToken = mediaSession.getSessionToken();

myVolumeProvider = new VolumeProviderCompat(VolumeProviderCompat.VOLUME_CONTROL_RELATIVE, 1000, 0) {
    @Override
    public void onAdjustVolume(int direction) {
    Log.d("TEST", "onAdjustVolume called: ");

    }
};

mediaSession.setPlaybackToRemote((VolumeProvider) myVolumeProvider.getVolumeProvider());
mediaSession.setCallback(new MediaSession.Callback()
{
    public boolean onMediaButtonEvent(Intent mediaButtonIntent) {
    Log.d("TEST", "onMediaButtonEvent called: " + mediaButtonIntent);
    return false;
    }

    public void onPause() {
    Log.d("TEST", "onPause called (media button pressed)");
    super.onPause();
    }

    public void onPlay() {
    Log.d("TEST", "onPlay called (media button pressed)");
    super.onPlay();
    }

    public void onStop() {
    Log.d("TEST", "onStop called (media button pressed)");
    super.onStop();
    }

});

mediaSession.setFlags(MediaSession.FLAG_HANDLES_MEDIA_BUTTONS | MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS);

PlaybackState state = new PlaybackState.Builder()
    .setActions(PlaybackState.ACTION_PLAY)
    .setState(PlaybackState.STATE_STOPPED, PlaybackState.PLAYBACK_POSITION_UNKNOWN, 0)
    .build();

mediaSession.setPlaybackState(state);

mediaSession.setActive(true);

person Jonathon Gardner    schedule 18.02.2017    source источник
comment
Вы пытались зарегистрировать BroadcastReceiver в службе вместо своей активности? Службы выполняются, даже если экран выключен / приложение не находится на переднем плане.   -  person STremblay    schedule 21.08.2017