4
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    int action = event.getAction();
    int keyCode = event.getKeyCode();
        switch (keyCode) {
        case KeyEvent.KEYCODE_VOLUME_UP:
            if (action == KeyEvent.ACTION_UP) {
                //TODO
            }
            return true;
        case KeyEvent.KEYCODE_VOLUME_DOWN:
            if (action == KeyEvent.ACTION_DOWN) {
                //TODO
            }
            return true;
        default:
            return super.dispatchKeyEvent(event);
        }
    }

This code is working when screen is on. But not when screen is locked. Is there a way to get the volume key event when the screen is locked?

Eric Leschinski
  • 146,994
  • 96
  • 417
  • 335
user2306862
  • 171
  • 1
  • 2
  • 8

1 Answers1

4

The event only trigger when the screen is on..other wise root permission is needed.

Make a BroadcastReceiver extended class

 public class YourBoardcastReceiver extends BroadcastReceiver {
                @Override
                public void onReceive(Context context, Intent intent) {


Log.e("get something", "i dont know what!!");

        String intentAction = intent.getAction();
        KeyEvent event = null;
        if (Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {
            event = (KeyEvent) intent
                    .getParcelableExtra(Intent.EXTRA_KEY_EVENT);
        }

        if (event == null) {
            return;
        }

        int keycode = event.getKeyCode();
        int action = event.getAction();
        long eventtime = event.getEventTime();

        if (keycode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE
                || keycode == KeyEvent.KEYCODE_HEADSETHOOK) {
            if (action == KeyEvent.ACTION_DOWN) {
                // Start your app here!

                // ...
                Log.e("event/////", "Trigerd");

                if (isOrderedBroadcast()) {
                    abortBroadcast();
                }
            }
        }
    }
                }
        }

And in your Manifest :

<receiver android:name="YourBoardcastReceiver">
                <intent-filter>
                        <action android:name="android.intent.action.SCREEN_ON" />
                </intent-filter>
</receiver>

and Call it like this.

mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    mRemoteControlResponder = new ComponentName(getPackageName(),
            YourBoardcastReceiver.class.getName());
XEENA
  • 569
  • 2
  • 6
  • I don't understand: is this an answer to the OP? The text at the top is a bit ambiguous: does it or does it not in fact invoke the callback `onReceive` when the screen is locked? – corwin.amber Nov 20 '16 at 19:21