如何从外部应用程序启动MusicPlaybackService?

时间:2012-04-20 16:33:06

标签: android android-intent android-music-player

我尝试通过位于Google Play音乐应用程序顶部并通过广播与之通信的服务和接收器来扩展有线麦克风遥控按钮的功能。我在ICS上使用Google Nexus S.

我遇到的问题是我的代码在MusicPlaybackService运行后效果很好,但情况并非总是如此。如何在不显示任何UI的情况下启动此服务(用户不知道)。我的代码有以下定义:

public static final String SERVICECMD = "com.android.music.musicservicecommand";
public static final String CMDNAME = "command";
public static final String CMDTOGGLEPAUSE = "togglepause";
public static final String TOGGLEPAUSE_ACTION = "com.android.music.musicservicecommand.togglepause";

我尝试了以下选项:

1)基于this SO question。我不确定是否关于SERVICECMD,因为问题是我应该使用" com.android.music.musicservicecommand"虽然对于ICS我相信包名已经改变了。

Intent i = new Intent(SERVICECMD); 
i.putExtra(CMDNAME, CMDTOGGLEPAUSE); 
sendBroadcast(i);

我也尝试用TOGGLEPAUSE_ACTION替换SERVICECM。

2)来自this android项目问题。

Intent musicIntent = new Intent();
musicIntent.setClassName("com.google.android.music", "com.google.android.music.MusicPlaybackService");
musicIntent.setAction(TOGGLEPAUSE_ACTION);
musicIntent.putExtra(CMDNAME, CMDTOGGLEPAUSE); // or "next" or "previous"
sendBroadcast(musicIntent);

3)此代码因以下错误而崩溃。我不确定如何进一步使用此选项。

  

引起:android.content.ActivityNotFoundException:无法找到显式活动类{com.google.android.music / com.google.android.music.MusicPlaybackService};你有没有在AndroidManifest.xml中声明这个活动?

Intent intent = new Intent();
intent.putExtra(CMDNAME, CMDTOGGLEPAUSE); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setClassName("com.google.android.music", "com.google.android.music.MusicPlaybackService");
startActivity(intent);

4)我注意到当从手机中移除耳机时,MusicPlaybackService已启动,因为它正在响应WiredAccessoryObserver接收的Intent.ACTION_HEADSET_PLUG广播。我尝试使用LogCat中显示的值在代码中复制该广播。

Intent intent = new Intent(Intent.ACTION_HEADSET_PLUG);
intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
intent.putExtra("state", 0);
intent.putExtra("name", "h2w");
intent.putExtra("microphone", 1);
sendBroadcast(intent);

我真的在寻找一种能够一直启动服务的方法。我对任何事情都持开放态度。我仍然需要尝试绑定到使用IMediaPlaybackService.aidl的服务,该服务应该随机破坏,并且不理想。在此先感谢您的帮助。

修改

我尝试使用下面的代码绑定到服务,该代码引发了错误:

  

引起:java.lang.SecurityException:不允许绑定到服务Intent {cmp = com.google.android.music / .MusicPlaybackService}

在我的OnCreate功能

if (mPlaybackService == null) { 
    Intent i = new Intent(); 
    i.setClassName("com.google.android.music","com.google.android.music.MusicPlaybackService" ); 
    bindService(i, connection, Context.BIND_AUTO_CREATE); 
}

在我班上

IMediaPlaybackService mPlaybackService = null;
ServiceConnection connection = new ServiceConnection() {
    public void onServiceConnected(ComponentName name, IBinder service) {     
        mPlaybackService = IMediaPlaybackService.Stub.asInterface(service);
}

    public void onServiceDisconnected(ComponentName name) { 
         mPlaybackService = null; 
    } 
};

1 个答案:

答案 0 :(得分:2)

我不认为这是可能的。我的解决方法是让应用程序拥有广播接收器在按下按钮时唤醒服务。我只是为我的应用程序请求audiofocus,等待它丢失。