Controla el reproductor de música predeterminado de Android o cualquier otro reproductor de música

¿Cómo controlar el reproductor de música predeterminado de Android o cualquier otro jugador? Al controlar me refiero a pausa, juego, siguiente, etc. ¿Tengo que vincular el servicio? Intenté usar el IMediaPlaybackService pero no funciona. Sin duda hay una salida ya que he visto aplicaciones en el mercado de Android que controla el reproductor de música. ¿Alguna idea?

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

puede obtener el audiomanager y luego enviarle comandos.

estos son los comandos.

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

El problema con el envío de la Intent para el receptor de difusión es que el usuario tiene que abrir el reproductor de música al menos una vez. Tampoco funciona para muchos reproductores de música de terceros.

El código que se proporciona a continuación funciona en todos los reproductores de música.

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

He probado este código en dispositivos Sony, Htc y Samsung.

Este código imita la acción del botón reproducir / pausa desde manos libres (auriculares).

Si desea controlar el reproductor de música (el reproductor actual), hay una forma de enviarle KeyEvents:

 if (mAudioManager == null) mAudioManager = (AudioManager)getSystemService(AUDIO_SERVICE); KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY); mAudioManager.dispatchMediaKeyEvent(event); 

Esta es una forma más segura, ya que la transmisión de keyEvent por lo general podría ocasionar que se reproduzca más de un jugador a la vez.

Nota: necesita tener minSdk 19 o más.

Parece que los métodos KeyEvent referenciados no funcionan para mí en el último SDK. Usando el método dispatchMediaKeyEvent () de AudioManager con un KeyEvent definido funcionó para mí.

Ver: aquí

Ejemplo de código:

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

Hay un nuevo método en Android 4.4 llamado RemoteController, pero es un dolor en el trasero y no pude hacerlo funcionar. ¡También requiere que dirija al usuario a la configuración de seguridad global y le permita a la aplicación acceder a todas sus notificaciones! No estoy seguro de lo que Google estaba pensando aquí.

De todos modos, seguí todas las instrucciones, pero registerRemoteController() todavía devuelve false así que no hay mucho más que pueda hacer (al parecer, Google nunca ha oído hablar de códigos de error).

Dado que el método de user2572182 no parece funcionar en Android 4.4, parece que esto es imposible.

Editar: encontré una aplicación de ejemplo que usa RemoteController en XDA de todos los lugares (¿quién sabía que había contenido útil allí?). Funciona en mi teléfono, pero aún necesita decirle a sus usuarios que vayan a cambiar alguna configuración de seguridad oscura para que no sea ideal:

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

Editar 2: Google ha cambiado esto nuevamente en Android “L”. Supongo que se dieron cuenta de que RemoteControlClient era demasiado complicado.

Si desea reanudar la música nuevamente, elimine el bucle if de la respuesta de @Ahmad Ekri.

¡Pero una respuesta muy útil!