Control the default music player of android or any

2020-01-25 05:24发布

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 IMediaPlaybackService but it is not working. There is certainly a way out as i have seen apps in the android market which controls the music player. Any idea?

6条回答
可以哭但决不认输i
2楼-- · 2020-01-25 05:55

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);
查看更多
The star\"
3楼-- · 2020-01-25 05:56
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";
查看更多
神经病院院长
4楼-- · 2020-01-25 05:57

Problem with sending Intent for broadcast receiver is that, user has to open Music Player at least once, also, It does not work for many third party music players.

The code given below works on all music players.

long eventtime = SystemClock.uptimeMillis();

Intent downIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
KeyEvent downEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE, 0);
downIntent.putExtra(Intent.EXTRA_KEY_EVENT, downEvent);
sendOrderedBroadcast(downIntent, null);

Intent upIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
KeyEvent upEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE, 0);
upIntent.putExtra(Intent.EXTRA_KEY_EVENT, upEvent);
sendOrderedBroadcast(upIntent, null);

/*NEXT*/
Intent downIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
KeyEvent downEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_DOWN,   KeyEvent.KEYCODE_MEDIA_NEXT, 0);
downIntent.putExtra(Intent.EXTRA_KEY_EVENT, downEvent);
sendOrderedBroadcast(downIntent, null);

/*PREVIOUS*/
Intent downIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
KeyEvent downEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PREVIOUS, 0);
downIntent.putExtra(Intent.EXTRA_KEY_EVENT, downEvent);
sendOrderedBroadcast(downIntent, null);

I have tested this code on Sony, Htc and Samsung devices.

This code imitates play/pause button action from hands-free(ear phones).

查看更多
倾城 Initia
5楼-- · 2020-01-25 06:05

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.

查看更多
▲ chillily
6楼-- · 2020-01-25 06:10

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.

查看更多
成全新的幸福
7楼-- · 2020-01-25 06:17

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:

  • Get list from MediaSessionManager. You can find it in Google example project
  • Get it from Notifications - if you have access to Notifications (NotificationListenerService) you can search for notifications from music apps and get their current Token.

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)
查看更多
登录 后发表回答