Una bona experiència d'usuari és imprescindible.
Les aplicacions multimèdia han d'oferir als usuaris poder controlar el volum de la seva aplicació utilitzant el hardware o el software de control del volum del dispositiu, auriculars Bluetooth o els auriculars.
De la mateixa manera, ha de ser possible aturar, pausar, saltar... Els mitjans que s'estan reproduint.
Android manté un flux (mediaplayer) d'àudio per a cada mitjà, notificació, trucada... que hi ha al dispositiu. Es pot controlar el volum de cadascun per separat.
La majoria d'aquests fluxos responen a STREAM_MUSIC, d'altres correspondrien com a fluxos del sistema, com l'alarma.
Per defecte, prémer les tecles del dispositiu canvia el volum del flux actiu. Si el dispositiu no està reproduint res, canvia el volum de la trucada.
Mitjançant setVolumeControlStream() es pot canviar el volum de l'àudio que s'està reproduint.
setVolumeControlStream(AudioManager.STREAM_MUSIC);
Fa que en prémer les tecles de volum funcionin com s'espera.
Per a això, necessitarem els permissos:
<uses-permission android:name="android.permission.WAKE_LOCK" />
Disposem de la possibilitat que respongui a les tecles de pausa, reproducció... perquè sigui la nostra app la que ho controli, necessitarà el broadcast, dins del manifest, seria el broadcast que escoltem. Normalment el llança el sistema, nosaltres normalment usem RemoteControlReceiver.
*<receiver android:name=".RemoteControlReceiver"><intent-filter><action android:name="android.intent.action.MEDIA_BUTTON" /></intent-filter></receiver>
`*
`
tindrem la classe broadcastReceiver que és i li fem fer l'acció.
i el receptor extreu la tecla que s'ha de prémer de la manera següent:
public class Receptor extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if ( Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())){ KeyEvent event =(KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); if (KeyEvent.KEYCODE_MEDIA_PLAY == event.getKeyCode()){ // tecla premuda } } } }*
Android utilitza el focus d'àudio per moderar quan diverses apps estan reproduint mitjans. Abans que una app iniciï la reproducció ha de demanar i rebre el focus. Amb requestAudioFocus() podrem demanar el focus i retornarà AUDIOFOCUS_REQUEST_GRANTED si ho ha aconseguit.
Cal especificar quin flux s'està utilitzant i si la petició serà puntual o permanent, per exemple un avís o reproducció de música.
AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE); ... // petició del focus per reproduir música int result = am.requestAudioFocus(afChangeListener, // utilitza un flux de música AudioManager.STREAM_MUSIC, // petició permanent AudioManager.AUDIOFOCUS_GAIN); if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { am.unregisterMediaButtonEventReceiver(RemoteControlReceiver); // comença la reproducció. }
Cada vegada que canvia el focus, canvia el changelistener i li podem dir què ha de fer.
Cada vegada que l'aplicació que roba el focus es dispara:
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
aquest anirà a buscar si hi ha alguna cosa programada.
Una vegada finalitza la reproducció cal alliberar el focus d'àudio amb abandonAudioFocus().am.abandonAudioFocus(afChangeListener);
Hi ha la possibilitat que el volum quedi baix fins que es torni a posar el focus a l'app inicial, per exemple un navegador de rutes per a un vehicle, això es fa amb:
int result = am.requestAudioFocus(afChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK );
També podem gestionar quan un focus canvia d'app:
// gestió quan es perd el focus, la qual depèn de la manera com es perd. OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() { public void onAudioFocusChange(int focusChange) { if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT // Pausa } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) { // Continua reproduint. } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) { am.unregisterMediaButtonEventReceiver(RemoteControlReceiver); am.abandonAudioFocus(afChangeListener); // Atura. } } };
Reduir el volum (ducking) ens permet puntualment reduir el volum quan una app té el focus d'àudio sense aturar la reproducció.
OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() { public void onAudioFocusChange(int focusChange) { if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) { // Baixa el volum } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) { // Puja el volum } } };
Els usuaris poden disposar d'altaveus, auriculars, etc., i cal saber com connectar i gestionar cadascun d'aquests dispositius.
Per saber quins dispositius s'estan utilitzant, utilitzarem la classe AudioManager.
if (isBluetoothA2dpOn()) { //ajustem per a Bluetooth. } else if (isSpeakerphoneOn()) { // ajustem per a altaveu } else if (isWiredHeadsetOn()) { // ajustem per a auriculars } else { // no hi ha cap sortida per escoltar l'àudio.}
En el cas de canviar algun d'aquests dispositius podem tenir problemes amb el volum. Disposarem d'un senyal que s'envia a les aplicacions ACTION_AUDIO_BECOMING_NOISY per controlar aquests casos.
private class Receptor extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if(AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())){ // Fem una pausa } } } private IntentFilter intentFilter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY); private void startPlayback() { registerReceiver(myNoisyAudioStreamReceiver(), intentFilter); } private void stopPlayback() { unregisterReceiver(myNoisyAudioStreamReceiver); }
- Desenvolupa una aplicació per a Android que reprodueixi una pista de música emmagatzemada als recursos del dispositiu. L'aplicació ha de disposar de botons per aturar, pausar i iniciar la pista de música. Ha de mostrar el temps de reproducció.
- A partir de l'exercici anterior, crea un servei en primer pla que realitzi la reproducció de música mostrant una notificació d'informació a l'usuari a la barra d'estat.
- Crea una aplicació mòbil per a Android que permeti accedir als continguts de música del teu dispositiu, els meostri en una llista, i en seleccionar una pista la reprodueixi. Crea una animació d'un botó que quan es premi desaparegui.