Search code examples
androidandroid-mediaplayerkeyeventandroid-audiomanager

java.lang.NoSuchMethodException: dispatchMediaKeyEvent [class android.view.KeyEvent]


I'm trying to use media events to play, pause, next, previous music from my android application.

When I run it on Samsung s4 (Android version 4.4.2), I can perform all actions. But I'm unable to perform those actions from my Nexus 5 (Android version 5.0.1).

I get error while handling key events.

My code is:

private void handleMediaKeyEvent(KeyEvent keyEvent) {

    /*
     * Attempt to execute the following with reflection. 
     * 
     * [Code]
     * IAudioService audioService = IAudioService.Stub.asInterface(b);
     * audioService.dispatchMediaKeyEvent(keyEvent);
     */
    boolean dispatchMediaKeyEvent = false;
    try {

        // Get binder from ServiceManager.checkService(String)
        IBinder iBinder  = (IBinder) Class.forName("android.os.ServiceManager")
        .getDeclaredMethod("checkService",String.class)
        .invoke(null, Context.AUDIO_SERVICE);

        // get audioService from IAudioService.Stub.asInterface(IBinder)
        Object audioService  = Class.forName("android.media.IAudioService$Stub")
                .getDeclaredMethod("asInterface",IBinder.class)
                .invoke(null,iBinder);

        // Dispatch keyEvent using IAudioService.dispatchMediaKeyEvent(KeyEvent)
        Class.forName("android.media.IAudioService")
        .getDeclaredMethod("dispatchMediaKeyEvent",KeyEvent.class)
        .invoke(audioService, keyEvent);            

        dispatchMediaKeyEvent = true;
    }  catch (Exception e1) {
        e1.printStackTrace();
    }
    // If dispatchMediaKeyEvent failed then try using broadcast
    if (!dispatchMediaKeyEvent) {
        Intent intent = new Intent(Intent.ACTION_MEDIA_BUTTON);
        intent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent);
        mContext.sendOrderedBroadcast(intent, null);
    }
}

And I get error:

02-14 15:37:08.744: W/System.err(3474): java.lang.NoSuchMethodException: dispatchMediaKeyEvent [class android.view.KeyEvent]
02-14 15:37:08.745: W/System.err(3474):     at java.lang.Class.getMethod(Class.java:664)
02-14 15:37:08.745: W/System.err(3474):     at java.lang.Class.getDeclaredMethod(Class.java:626)

Can anyone suggest solution to make it run on all android devices?


Solution

  • dispatchMediaKeyEvent is inherited from AudioManager class. You're referencing it as a boolean.

    http://developer.android.com/reference/android/media/AudioManager.html#dispatchMediaKeyEvent(android.view.KeyEvent)

    This is how a code using this event should look like

    AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
    
    long eventtime = SystemClock.uptimeMillis() - 1;
    KeyEvent downEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE, 0);
    am.dispatchMediaKeyEvent(downEvent);