How to control the default music player of android or any other player? By controlling i mean pause, play, next etc. Do i have to bind the service? I have tried to use the <
There's a new method in Android 4.4 called RemoteController, but it's a pain in the arse and I couldn't get it to work. It also requires you to direct the user to the global security settings and allow you app access to all their notifications!!! I'm not sure what Google was thinking here.
Anyway I followed all the instructions but registerRemoteController()
still returns false
so there's little else I can do (apparently Google have never heard of error codes).
Given that user2572182's method doesn't seem to work on Android 4.4 it seems this is impossible.
Edit: I found an example app using RemoteController
on XDA of all places (who knew there was useful content there?). It works on my phone, but you still need to tell your users to go and change some obscure security setting so it's not ideal:
http://forum.xda-developers.com/showthread.php?p=51535568
Edit 2: Google have changed this again in Android "L". I guess they realised RemoteControlClient
was too complicated.
KeyEvent's don't work properly in newest Android, as well as don't support applications like Spotify. The best solution is to use MediaController. For each application that is currently playing and you want to control it you have to create different MediaController. It requires Context and MediaSession.Token. Token 'identifies' process that plays music. For example if you played Google Play Music and you now play Spotify you can create MediaControllers for both. How to retrieve tokens? There are two ways:
You check current state of session from MediaController:
getPlaybackState().getState() //e.g. PlaybackStateCompat.STATE_PLAYING
and control app using transport controls, e.g.:
getTransportControls().skipToNext()
Depending on your minSDK use Compat or not version. You can cast MediaSession.Token to MediaSessionCompat.Token with:
MediaSessionCompat.Token.fromToken(token)
If you want to control the music player (the current playing one) there is a way to send KeyEvents to it:
if (mAudioManager == null) mAudioManager = (AudioManager)getSystemService(AUDIO_SERVICE);
KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY);
mAudioManager.dispatchMediaKeyEvent(event);
This is a safer way, cause usually broadcasting keyEvent could cause to play more than one player at a time.
Note: it needs to have minSdk 19 or more.
Seems like the referenced KeyEvent methods don't work for me on the latest SDK. Using the AudioManager's dispatchMediaKeyEvent() method with a defined KeyEvent worked for me.
See: here
Code example:
this.mAudioManager = (AudioManager) this.context.getSystemService(Context.AUDIO_SERVICE);
long eventtime = SystemClock.uptimeMillis();
KeyEvent downEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_NEXT, 0);
mAudioManager.dispatchMediaKeyEvent(downEvent);
KeyEvent upEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_NEXT, 0);
mAudioManager.dispatchMediaKeyEvent(upEvent);
AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
if(mAudioManager.isMusicActive()) {
Intent i = new Intent(SERVICECMD);
i.putExtra(CMDNAME , CMDSTOP );
YourApplicationClass.this.sendBroadcast(i);
}
you can by getting the audiomanager then sending commands to it.
these are the commands.
public static final String CMDTOGGLEPAUSE = "togglepause";
public static final String CMDPAUSE = "pause";
public static final String CMDPREVIOUS = "previous";
public static final String CMDNEXT = "next";
public static final String SERVICECMD = "com.android.music.musicservicecommand";
public static final String CMDNAME = "command";
public static final String CMDSTOP = "stop";
Solution for all latest and older versions (below kitkat to Android 10).
/*global variable for audiomanager*/
AudioManager mAudioManager;
/*initalize audiomanager in oncreate or onCreateView if using fragment*/
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
/*trigger keyEvent to play system music */
KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
mAudioManager.dispatchMediaKeyEvent(event);
}
else
{
Intent i = new Intent(SERVICECMD);
i.putExtra(CMDNAME , CMDPLAY );
sendBroadcast(i);
}
/*you can use same code for stop system music but you need to change MEDIA_PLAY to MEDIA_STOP*/