web-dev-qa-db-fra.com

Contrôleur de la musique par défaut d'Android ou de tout autre lecteur de musique

Comment contrôler le lecteur de musique par défaut d'Android ou de tout autre lecteur? En contrôlant, je veux dire pause, lecture, à côté, etc. Dois-je lier le service? J'ai essayé d'utiliser la IMediaPlaybackService mais cela ne fonctionne pas. Il existe certainement un moyen de sortir car j'ai vu des applications sur le marché Android qui contrôlent le lecteur de musique. Une idée?

19
Naddy
AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

if(mAudioManager.isMusicActive()) {
    Intent i = new Intent(SERVICECMD);
    i.putExtra(CMDNAME , CMDSTOP );
    YourApplicationClass.this.sendBroadcast(i);
}

vous pouvez obtenir le audiomanager puis lui envoyer des commandes.

ce sont les commandes.

 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";
21
Ahmed Ekri

Le problème avec l'envoi de Intent pour le récepteur de radiodiffusion est que, l'utilisateur doit ouvrir Music Player au moins une fois. De plus, cela ne fonctionne pas pour de nombreux lecteurs de musique tiers.

Le code donné ci-dessous fonctionne sur tous les lecteurs de musique.

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

J'ai testé ce code sur des appareils Sony, HTC et Samsung.

Ce code imite l’action des boutons lecture/pause des mains libres (écouteurs).

10
Viraj Tank

Si vous souhaitez contrôler le lecteur de musique (celui en cours de lecture), il existe un moyen d'envoyer KeyEvents à celui-ci:

if (mAudioManager == null) mAudioManager = (AudioManager)getSystemService(AUDIO_SERVICE);

KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY);
mAudioManager.dispatchMediaKeyEvent(event);

C'est une manière plus sûre, car généralement, la diffusion de keyEvent peut entraîner la lecture de plusieurs joueurs à la fois. 

Note: il faut avoir minSdk 19 ou plus. 

3
MojAmiri

On dirait que les méthodes KeyEvent référencées ne fonctionnent pas pour moi sur le dernier SDK. L'utilisation de la méthode dispatchMediaKeyEvent () du AudioManager avec un KeyEvent défini a fonctionné pour moi.

Voir: ici

Exemple de code:

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);
3
mpkasp

Il y a une nouvelle méthode dans Android 4.4 appelée RemoteController, mais c'est pénible et je n'arrive pas à la faire fonctionner. Il vous oblige également à diriger l'utilisateur vers les paramètres de sécurité globaux et à vous permettre d'accéder à toutes ses notifications via l'application !!! Je ne suis pas sûr de ce que Google pensait ici.

Quoi qu'il en soit, j'ai suivi toutes les instructions, mais registerRemoteController() renvoie toujours false, de sorte que je ne peux rien faire d'autre (apparemment, Google n'a jamais entendu parler de codes d'erreur).

Étant donné que la méthode de user2572182 ne semble pas fonctionner sous Android 4.4, cela semble impossible.

Edit: J'ai trouvé un exemple d'application utilisant RemoteController sur XDA de tous les lieux (qui savait qu'il y avait du contenu utile là-bas?). Cela fonctionne sur mon téléphone, mais vous devez toujours demander à vos utilisateurs de modifier certains paramètres de sécurité obscurs pour que ce ne soit pas idéal:

http://forum.xda-developers.com/showthread.php?p=51535568

Edit 2: Google a encore changé cela dans Android "L". Je suppose qu’ils ont compris que RemoteControlClient était trop compliqué.

1
Timmmm

KeyEvent ne fonctionne pas correctement dans le dernier Android et ne supporte pas les applications telles que Spotify. La meilleure solution consiste à utiliser MediaController . Pour chaque application en cours de lecture et que vous souhaitez contrôler, vous devez créer un MediaController différent. Il nécessite Context et MediaSession.Token. Le jeton "identifie" le processus qui joue de la musique. Par exemple, si vous avez joué à Google Play Music et que vous jouez maintenant à Spotify, vous pouvez créer MediaControllers pour les deux. Comment récupérer des jetons? Il y a deux manières:

  • Obtenir la liste de MediaSessionManager . Vous pouvez le trouver dans exemple de projet Google
  • Obtenez-le à partir des notifications - si vous avez accès aux notifications (NotificationListenerService), vous pouvez rechercher des notifications d'applications de musique et obtenir leur jeton actuel. 

Vous vérifiez l’état actuel de la session depuis MediaController: 

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

et application de contrôle à l'aide des commandes de transport, par exemple:

getTransportControls().skipToNext()

Selon votre minSDK, utilisez Compat ou pas la version. Vous pouvez convertir MediaSession.Token en MediaSessionCompat.Token avec:

MediaSessionCompat.Token.fromToken(token)
0
pkleczko