Modifica 8 Maggio 2016controllo WebView con eventi pulsante blocchi attenzione dei media in Android 5
ho trovato il motivo per i miei guai la ricezione di eventi mediatici dei pulsanti nella mia app. Vedi la risposta qui sotto. Ho modificato il titolo di questa domanda per facilitare la ricerca del problema. Il titolo originale era "Cosa può eventualmente bloccare i pulsanti multimediali su Android Lollipop".
domandaoriginale, Aprile 2015:
graffiare la mia testa e fissando tutto il codice per 2 giorni senza alcun risultato ... Il mio Android dovrebbe reagire a pulsanti multimediali (ad esempio, da un auricolare, testarlo con un auricolare Bluetooth), come play/pausa, prossimo, riavvolgere. Funziona bene su KitKat e sotto. Lo giuro anche lavorato su Lollipop così fino a pochi giorni fa. Ora niente, nessuna traccia che sente premere i pulsanti multimediali. Qualcuno avere un rapido suggerimento dove andare a cercare per il disturbo? Testato con due telefoni Lollipop, lo stesso auricolare Bluetooth, e lo stesso auricolare funziona bene per le versioni inferiori di Android. Anche la stessa cuffia funziona bene, i pulsanti multimediali vengono ascoltati in altre app. Che cosa potrei eventualmente rompere ???
ho Testato vecchie e nuove modalità di ascolto pulsanti multimediali. In AndroidManifest.xml:
<receiver android:name=".MediaButtonIntentReceiver" android:enabled="false">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
Il fatto che si dice enabled = "false" è OK - I attivare e disattivare il ricevitore, se necessario, e il MediaButtonIntentReceiver.java ottiene gli eventi fine su KitKat e inferiore, completo silenzio su Lollipop.
ho accanto passare a l'ultimo appcompat (v22.1) e ha cercato con oggetto MediaSessionCompat e relativo codice come segue. Questo ha funzionato alla perfezione in una piccola app di test, solo un'attività che ho scritto - ha ottenuto i miei messaggi Logcat confermando che i tasti multimediali sono stati premuti su Lollipop. Ma quando inserito nella mia app, di nuovo non funziona su Lollipop. Che diamine???
private MediaSessionCompat _mediaSession;
final String MEDIA_SESSION_TAG = "some_tag";
void initMediaSessions(Context context) {
// Start a new MediaSession
if (context == null)
return;
Lt.d("initMediaSession()...");
ComponentName eventReceiver = new ComponentName(context.getPackageName(), MediaButtonIntentReceiver.class.getName());
PendingIntent buttonReceiverIntent = PendingIntent.getBroadcast(
context,
0,
new Intent(Intent.ACTION_MEDIA_BUTTON),
PendingIntent.FLAG_UPDATE_CURRENT
);
// Parameters for new MediaSessionCompat():
// context The context.
// tag A short name for debugging purposes.
// mediaButtonEventReceiver The component name for your receiver. This must be non-null to support platform
// versions earlier than LOLLIPOP. May not be null below Lollipop.
// mbrIntent The PendingIntent for your receiver component that handles media button events. This is optional
// and will be used on JELLY_BEAN_MR2 and later instead of the component name.
_mediaSession = new MediaSessionCompat(context, MEDIA_SESSION_TAG, eventReceiver, buttonReceiverIntent);
_mediaSession.setCallback(new MediaSessionCallback());
_mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |
MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
_mediaSession.setActive(true);
PlaybackStateCompat state = new PlaybackStateCompat.Builder()
.setActions(
PlaybackStateCompat.ACTION_PLAY | PlaybackStateCompat.ACTION_PLAY_PAUSE |
PlaybackStateCompat.ACTION_PAUSE |
PlaybackStateCompat.ACTION_SKIP_TO_NEXT | PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS)
.setState(PlaybackStateCompat.STATE_STOPPED, 0, 1, SystemClock.elapsedRealtime())
.build();
_mediaSession.setPlaybackState(state);
}
final class MediaSessionCallback extends MediaSessionCompat.Callback {
@Override
public void onPlay() {
Lt.d("play");
}
@Override
public void onPause() {
Lt.d("pause");
}
@Override
public void onStop() {
Lt.d("stop.");
}
@Override
public void onSkipToNext() {
Lt.d("skipToNext");
}
@Override
public void onSkipToPrevious() {
Lt.d("skipToPrevious");
}
@Override
public boolean onMediaButtonEvent(final Intent mediaButtonIntent) {
Lt.d("GOT MediaButton EVENT");
KeyEvent keyEvent = (KeyEvent) mediaButtonIntent.getExtras().get(Intent.EXTRA_KEY_EVENT);
// ...do something with keyEvent, super... does nothing.
return super.onMediaButtonEvent(mediaButtonIntent);
}
}
si può fare in modo che il vostro .MediaButtonIntentReceiver sia realmente viene attivato? – cygery
Sì, è, ha anche un messaggio logcat e abilita bene. Lo stesso codice esatto funziona su tutte le versioni inferiori di Android ... E per il nuovo codice su Lollipop con oggetto MediaSessionCompat, il ricevitore non è necessario, può essere impostato su null. Provato in questo modo (e commentato tutto il codice MediaButtonIntentReceiver), niente. Funzionava bene con null nella piccola app di prova ... – gregko
Dispositivi su cui stai effettuando il test? –