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?
7 回答
AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
if(mAudioManager.isMusicActive()) {
Intent i = new Intent(SERVICECMD);
i.putExtra(CMDNAME , CMDSTOP );
YourApplicationClass.this.sendBroadcast(i);
}
您可以通过获取音频管理器然后向其发送命令。
这些是命令。
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";
发送Intent
广播接收器的问题是,用户必须至少打开一次音乐播放器,而且它不适用于许多第三方音乐播放器。
下面给出的代码适用于所有音乐播放器。
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);
我已经在 Sony、Htc 和 Samsung 设备上测试了此代码。
此代码模仿免提(耳机)的播放/暂停按钮操作。
如果您想控制音乐播放器(当前播放的播放器),有一种方法可以将 KeyEvents 发送给它:
if (mAudioManager == null) mAudioManager = (AudioManager)getSystemService(AUDIO_SERVICE);
KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY);
mAudioManager.dispatchMediaKeyEvent(event);
这是一种更安全的方式,因为通常广播 keyEvent 可能会导致一次播放多个玩家。
注意:它需要具有 minSdk 19 或更高版本。
似乎引用的 KeyEvent 方法在最新的 SDK 上对我不起作用。使用 AudioManager 的 dispatchMediaKeyEvent() 方法和定义的 KeyEvent 对我有用。
见:这里
代码示例:
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);
Android 4.4 中有一个新方法称为 RemoteController,但它很麻烦,我无法让它工作。它还要求您将用户定向到全局安全设置并允许您的应用访问他们的所有通知!!!我不确定谷歌在这里的想法。
无论如何,我遵循了所有说明,但registerRemoteController()
仍然返回false
,所以我无能为力(显然谷歌从未听说过错误代码)。
鉴于 user2572182 的方法似乎不适用于 Android 4.4,这似乎是不可能的。
编辑:我在所有地方的 XDA 上找到了一个示例应用程序RemoteController
(谁知道那里有有用的内容?)。它可以在我的手机上使用,但您仍然需要告诉您的用户去更改一些晦涩的安全设置,因此它并不理想:
http://forum.xda-developers.com/showthread.php?p=51535568
编辑2: 谷歌在Android“L”中再次改变了这一点。我猜他们意识到RemoteControlClient
这太复杂了。
KeyEvent 在最新的 Android 中无法正常工作,也不支持 Spotify 等应用程序。最好的解决方案是使用MediaController。对于当前正在播放的每个应用程序并且您想要控制它,您必须创建不同的 MediaController。它需要上下文和 MediaSession.Token。令牌“识别”播放音乐的进程。例如,如果您播放 Google Play Music,而现在播放 Spotify,您可以为两者创建 MediaController。如何检索令牌?有两种方法:
- 从MediaSessionManager获取列表。您可以在Google 示例项目中找到它
- 从通知中获取 - 如果您有权访问通知 (NotificationListenerService),则可以搜索来自音乐应用的通知并获取其当前令牌。
您从 MediaController 检查当前会话状态:
getPlaybackState().getState() //e.g. PlaybackStateCompat.STATE_PLAYING
并使用传输控件控制应用程序,例如:
getTransportControls().skipToNext()
根据您的 minSDK 是否使用 Compat 版本。您可以使用以下方法将 MediaSession.Token 转换为 MediaSessionCompat.Token:
MediaSessionCompat.Token.fromToken(token)
适用于所有最新和旧版本的解决方案(低于 Android 10 的 kitkat)。
/*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*/