Опитвам се да снимам, когато медийният бутон е натиснат, докато екранът ми е изключен. Първо използвам 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);