【发布时间】:2013-09-18 23:03:38
【问题描述】:
如何控制安卓或其他播放器的默认音乐播放器?通过控制我的意思是暂停,播放,下一个等。我必须绑定服务吗?我曾尝试使用IMediaPlaybackService,但它不起作用。肯定有一条出路,因为我在 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);
我已经在 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 对我有用。
见: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);
【讨论】:
downIntent 和 upIntent 不是必需的,upIntent 行中有错字,但这非常有效!谢谢!
mMusicReceiver = 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"); 等获取曲目、专辑等
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 have changed this again in Android "L". 我猜他们意识到 RemoteControlClient 太复杂了。
【讨论】:
KeyEvent 在最新的 Android 中无法正常工作,也不支持 Spotify 等应用程序。最好的解决方案是使用MediaController。对于当前正在播放的每个应用程序并且您想要控制它,您必须创建不同的 MediaController。它需要上下文和 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)
【讨论】:
所有最新和旧版本的解决方案(低于 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*/
【讨论】: