控制Android或任何其他音乐播放器的默认音乐播放器

时间:2013-09-14 09:16:18

标签: android android-service

如何控制Android或任何其他播放器的默认音乐播放器?通过控制我的意思是暂停,播放,下一个等等。我必须绑定服务吗?我曾尝试使用IMediaPlaybackService,但它无效。因为我在Android市场上看到了控制音乐播放器的应用程序,所以肯定有一条出路。有什么想法吗?

7 个答案:

答案 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。如何找回令牌?有两种方法:

  • MediaSessionManager获取列表。您可以在Google example project
  • 中找到它
  • 从通知中获取通知-如果您有权访问通知(NotificationListenerService),则可以从音乐应用中搜索通知并获取其当前令牌。

您从MediaController检查会话的当前状态:

getPlaybackState().getState() //e.g. PlaybackStateCompat.STATE_PLAYING

并使用传输控件来控制应用,例如:

getTransportControls().skipToNext()

取决于您的minSDK使用Compat还是不使用版本。您可以使用以下方法将MediaSession.Token强制转换为MediaSessionCompat.Token:

MediaSessionCompat.Token.fromToken(token)