Я пытаюсь захватить, когда кнопка мультимедиа нажата, когда мой экран выключен. Сначала я использую 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);