2012-06-30 11 views
5

El título hace que este sonido sea mucho más simple de lo que es ... Estoy intentando transmitir un intento que pausará a la mayoría de los reproductores de música.Pausa confiablemente Reproducción multimedia en todo el sistema en Android

Sé que puedo utilizar para crear un KeyEvent que difundirá KEYCODE_MEDIA_PLAY_PAUSE con esto:

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); 
    ctx.sendOrderedBroadcast(downIntent, null); 

y que funciona. Pausará el reproductor multimedia original como yo quiero, junto con la mayoría de los otros reproductores de música compatibles con los botones reproducir/pausa de los auriculares. Pero por alguna razón, solo funciona una vez con el reproductor de música en stock. Puedo presionar el botón para llamar a esto y pausará la música. Si comienzo a reproducirlo nuevamente y presiono el botón de pausa nuevamente, no funciona. Una vez que reinicie el dispositivo, funcionará una vez más. Pero luego, con Pandora, funciona de manera consistente como debería.

Pensé que podría ser capaz de evitar eso y hacer una pausa sin usar un KeyEvent. Intenté esto con AudioManager y otra intención:

AudioManager mAudioManager = (AudioManager) ctx.getSystemService(Context.AUDIO_SERVICE);  
    if (mAudioManager.isMusicActive()) { 
     Intent mediaIntent = new Intent("com.android.music.musicservicecommand"); 
     mediaIntent.putExtra("command", "pause"); 
     ctx.sendBroadcast(mediaIntent); 
    } 

Y esto también funciona, y funciona constantemente. Pero es intrínsecamente frágil, porque al enviar el intento directamente al reproductor de música de Android, es el único jugador con el que trabajará. No tengo control de Pandora, Last.FM, etc. y necesito que funcione con la mayoría de los reproductores de música.

No estoy seguro de a dónde ir después. No soy exigente con respecto al tipo de solución que recibo, siempre y cuando funcione. Si puedes ayudarme a hacer funcionar el KeyEvent, fantástico, si tienes una solución totalmente diferente, fantástico. ¡Solo quiero que funcione! ¡Gracias!

+0

Todo lo que hagas aquí será "inherentemente frágil". Además, habrá muchos reproductores multimedia que ignorarán por completo este evento. Y es muy posible que algún día el sistema operativo comience a bloquear los eventos 'ACTION_MEDIA_BUTTON' falsificados de la misma forma que bloquean otros eventos simulados similares. Si está escribiendo su propio reproductor multimedia, use las funciones de enfoque de audio en 'AudioManager' para adquirir el enfoque de audio. – CommonsWare

+0

No estoy escribiendo mi propio reproductor multimedia. Sé que hay muchas aplicaciones completamente funcionales en la Play Store que detendrán la música después de un tiempo determinado, pero no estoy particularmente contento con ninguna de ellas. Solo estoy tratando de escribir mi opinión sobre una, y necesito poder pausar la mayoría de las aplicaciones de música. – Geniusdog254

Respuesta

2

Para pausar audio de todo el sistema, no inicia un intento, sino que solicita el enfoque de audio desde el sistema.

Así que cuando se desea hacer una pausa en todo lo que haga lo siguiente (se sugiere en onCreate):

//The Variables we'll need to create 
AudioManager am; 
OnAudioFocusChangeListener af; 

//I do nothing with this listener, but it's required for the next step. 
af = new OnAudioFocusChangeListener() { 

     public void onAudioFocusChange(int focusChange) { 
      if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) { 
       // Lower the volume 
      } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) { 
       // Raise it back to normal 
      }  
     } 

}; 

//Do the actual pause 
am = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 
int request = am.requestAudioFocus(af, 
    AudioManager.STREAM_MUSIC, 
    AudioManager.AUDIOFOCUS_GAIN); 

pero no se olvide de dejar de lado el enfoque usando:

am.abandonAudioFocus(af); 
+0

Estos if/else dentro del oyente solo se copian de la documentación de Android y no hacen nada, puedes eliminarlos. –

4

me encontré con este también. Gracias a tu descripción, creo que entiendo lo que está pasando. Envía el evento de selección, pero nunca la tecla, por lo que el sistema cree que el botón Reproducir/Pausa se está presionando continuamente. Utilicé este fragmento de código con éxito.

Intent mediaEvent = new Intent(Intent.ACTION_MEDIA_BUTTON); 
KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY); 
mediaEvent.putExtra(Intent.EXTRA_KEY_EVENT, event); 
context.sendBroadcast(mediaEvent); 

new Timer().schedule(new TimerTask() { 
    @Override 
    public void run() { 
     Intent mediaEvent = new Intent(Intent.ACTION_MEDIA_BUTTON); 
     KeyEvent event = new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_MEDIA_PLAY); 
     mediaEvent.putExtra(Intent.EXTRA_KEY_EVENT, event); 
     context.sendBroadcast(mediaEvent); 
    } 
}, 100); 
Cuestiones relacionadas