如何控制Android或任何其他播放器的默认音乐播放器?通过控制我的意思是暂停,播放,下一个等等。我必须绑定服务吗?我曾尝试使用IMediaPlaybackService
,但它无效。因为我在Android市场上看到了控制音乐播放器的应用程序,所以肯定有一条出路。有什么想法吗?
答案 0 :(得分:21)
AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
if(mAudioManager.isMusicActive()) {
Intent i = new Intent(SERVICECMD);
i.putExtra(CMDNAME , CMDSTOP );
YourApplicationClass.this.sendBroadcast(i);
}
您可以通过获取audiomanager然后向其发送命令。
这些是命令。
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";
答案 1 :(得分:10)
向广播接收方发送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设备上测试过此代码。
此代码模仿免提(耳机)的播放/暂停按钮操作。
答案 2 :(得分:3)
如果你想控制音乐播放器(当前正在播放的音乐播放器),有一种方法可以向它发送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或更多。
答案 3 :(得分:3)
似乎引用的KeyEvent方法在最新的SDK上不适用于我。使用AudioManager的dispatchMediaKeyEvent()方法和定义的KeyEvent为我工作。
请参阅:here
代码示例:
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);
答案 4 :(得分:1)
在Android 4.4中有一种叫做RemoteController的新方法,但它很痛苦,我无法让它工作。它还要求您将用户定向到全局安全设置,并允许您应用访问所有通知!我不确定谷歌在想什么。
无论如何,我遵循了所有说明,但 registerRemoteController()
仍然返回false
,所以我无能为力(显然Google从未听说过错误代码)。
鉴于user2572182的方法似乎不适用于Android 4.4,似乎这是不可能的。
编辑:我在所有地方的XDA上找到了一个使用RemoteController
的示例应用(谁知道那里有有用的内容?)。它可以在我的手机上运行,但你仍然需要告诉你的用户去更改一些不起眼的安全设置,因此它并不理想:
http://forum.xda-developers.com/showthread.php?p=51535568
编辑2: Google have changed this again in Android "L".我猜他们认为RemoteControlClient
过于复杂。
答案 5 :(得分:1)
所有最新和较旧版本的解决方案(低于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*/
答案 6 :(得分:0)
KeyEvent在最新的Android中无法正常运行,并且不支持Spotify等应用。最好的解决方案是使用MediaController。对于当前正在播放且要控制的每个应用程序,必须创建不同的MediaController。它需要Context和MediaSession.Token。令牌“标识”播放音乐的过程。例如,如果您播放了Google Play音乐,而现在播放了Spotify,则可以为两者创建MediaController。如何找回令牌?有两种方法:
您从MediaController检查会话的当前状态:
getPlaybackState().getState() //e.g. PlaybackStateCompat.STATE_PLAYING
并使用传输控件来控制应用,例如:
getTransportControls().skipToNext()
取决于您的minSDK使用Compat还是不使用版本。您可以使用以下方法将MediaSession.Token强制转换为MediaSessionCompat.Token:
MediaSessionCompat.Token.fromToken(token)