Бутон за заснемане на мултимедия на 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