如何控制Android的默认音乐播放器或其他任何播放器? 控制指暂停,播放,下一曲等。我需要绑定服务吗? 我尝试使用IMediaPlaybackService
,但它无法正常工作。肯定有出路,因为我在Android市场上看到了可以控制音乐播放器的应用程序。 有什么想法吗?
如何控制Android的默认音乐播放器或其他任何播放器? 控制指暂停,播放,下一曲等。我需要绑定服务吗? 我尝试使用IMediaPlaybackService
,但它无法正常工作。肯定有出路,因为我在Android市场上看到了可以控制音乐播放器的应用程序。 有什么想法吗?
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);
我已经在索尼、HTC和三星设备上测试了这段代码。
这段代码模拟了耳机上的播放/暂停按钮操作。
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或更高版本。
最新的SDK似乎无法使用引用的KeyEvent方法。对于我来说,使用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);
downIntent
和upIntent
不需要,而且在upIntent
行中有一个拼写错误,但这个程序完美运行!谢谢! - TheWanderermMusicReceiver = new BroadcastReceiver(this); mIntentFilter = new IntentFilter(); mIntentFilter.addAction("com.apple.android.music.metachanged"); mIntentFilter.addAction("com.apple.android.music.playstatechanged");
你可以通过 this.track = intent.getStringExtra("track");
等方式获取曲目、专辑等信息。 - mpkasp在最新的Android系统中,KeyEvent无法正常工作,也不支持像Spotify这样的应用程序。最好的解决方案是使用MediaController。对于当前正在播放且您想要控制的每个应用程序,您都需要创建不同的MediaController。它需要Context和MediaSession.Token。Token“标识”播放音乐的进程。例如,如果您正在播放Google Play音乐,现在又在播放Spotify,则可以为两者创建MediaControllers。如何检索令牌?有两种方法:
您可以从MediaController中检查会话的当前状态:
getPlaybackState().getState() //e.g. PlaybackStateCompat.STATE_PLAYING
使用传输控制来控制应用程序,例如:
getTransportControls().skipToNext()
根据您使用的minSDK版本,可以使用Compat或非Compat版本。您可以使用以下方法将MediaSession.Token转换为MediaSessionCompat.Token:
MediaSessionCompat.Token.fromToken(token)
Android 4.4中有一种名为RemoteController的新方法,但它很麻烦,我无法使其正常工作。它还要求您将用户引导至全局安全设置,并允许您的应用程序访问其所有通知!!!我不确定Google在想什么。
无论如何,我按照所有说明进行操作,但registerRemoteController()
仍然返回false
,所以我几乎无能为力(显然Google从未听说过错误代码)。
鉴于user2572182的方法似乎在Android 4.4上无法使用,因此这似乎是不可能的。
编辑:我在XDA上找到了一个使用RemoteController
的示例应用程序(谁知道那里有有用的内容?)。它可以在我的手机上运行,但您仍然需要告诉用户去更改一些晦涩的安全设置,因此并不理想:
http://forum.xda-developers.com/showthread.php?p=51535568
编辑2:Google在Android“L”中再次更改了此项功能。我想他们意识到RemoteControlClient
太过复杂。
/*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*/