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?
dispatchMediaKeyEvent
is inherited from AudioManager
class.
You're referencing it as a boolean
.
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);