2012-04-20 2 views
2

J'essaie d'étendre les fonctionnalités du bouton Télécommande filaire par l'intermédiaire d'un service et d'un récepteur qui se trouve au-dessus de l'application Google Play Musique et communique avec elle via des diffusions. Je suis sur ICS avec un Google Nexus S.Comment démarrer MusicPlaybackService à partir d'une application externe?

Le problème que j'ai est mon code fonctionne très bien une fois que MusicPlaybackService est en cours d'exécution, ce qui n'est pas toujours le cas. Comment démarrer ce service sans afficher d'interface utilisateur (sans que l'utilisateur le sache). Mon code a les définitions suivantes:

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"; 

J'ai essayé les options suivantes:

1) Sur la base de this SO question. Je ne suis pas sûr si à propos de SERVICECMD, comme la question indique que je devrais utiliser "com.android.music.musicservicecommand" bien que pour ICS je crois que les noms de paquets ont changé.

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

J'ai également essayé de remplacer SERVICECMD par TOGGLEPAUSE_ACTION.

2) De this problème de projet 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) Ce code se bloque avec l'erreur ci-dessous. Je ne suis pas sûr de savoir comment aller plus loin avec cette option.

Caused by: android.content.ActivityNotFoundException: Unable to find explicit activity class {com.google.android.music/com.google.android.music.MusicPlaybackService}; have you declared this activity in your 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) J'ai remarqué que lorsque le casque est retiré de mon téléphone, le MusicPlaybackService est démarré parce qu'elle répond à l'émission Intent.ACTION_HEADSET_PLUG qui est capté par WiredAccessoryObserver. J'ai essayé de dupliquer cette diffusion dans mon code en utilisant les valeurs affichées dans LogCat. Je cherche vraiment une méthode qui fonctionne tout le temps qui démarre juste le service. Je suis ouvert à tout. Je dois encore essayer de lier le service qui utilise IMediaPlaybackService.aidl qui est supposé rompre au hasard, et n'est pas idéal. Merci d'avance pour votre aide.

EDIT

J'ai essayé de se lier au service à l'aide du code ci-dessous qui a jeté une erreur:

Caused by: java.lang.SecurityException: Not allowed to bind to service Intent { cmp=com.google.android.music/.MusicPlaybackService }

Dans ma fonction 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); 
} 

Dans ma classe

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; 
    } 
}; 

Répondre

2

I d On ne pense pas que ce soit possible. Ma solution de contournement consiste à laisser les applications posséder le broadcastreceiver réveiller le service quand le bouton est pressé. Je demande juste l'audiofocus pour mon application et attends jusqu'à ce qu'il soit perdu.

+0

avez-vous eu la solution? – Debugger

Questions connexes