2015-04-23 6 views
7

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

domanda

originale, 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); 
    } 
} 
+0

si può fare in modo che il vostro .MediaButtonIntentReceiver sia realmente viene attivato? – cygery

+0

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

+0

Dispositivi su cui stai effettuando il test? –

risposta

2

8 MAGGIO 2016: Risolto di sicuro ho finalmente trovato la ragione per cui pulsanti multimediali non ha funzionato con la mia app, quando lo schermo principale era su. In seguito ho notato che funzionavano se era attiva un'altra app o lo schermo era spento, ma non quando la mia attività principale era attiva. Si scopre che almeno in Android 5, il controllo WebView che utilizzo sulla mia schermata principale blocca i pulsanti multimediali, se ha lo stato attivo. Chiamando:

webView.setFocusable(false); 

o

webView.setFocusableInTouchMode(false); 

o modificando lo stesso attributo nel layout, risolve il problema. Con Android 6 l'impostazione focalizzabile di WebView non aveva importanza per la ricezione degli eventi dei pulsanti multimediali.

24 aprile 2015: risolto? - non del tutto ... Dal commento a questo post: Handling media buttons in Android 5.0 Lollipop da @mangini:

per ricevere gli eventi dei pulsanti supporto durante la vostra attività è in primo piano, chiamata setMediaController() sulla vostra attività con un MediaController istanza collegata alla tua MediaSession attiva.- Mangini 23 gennaio al 18:35

stavo testando tutto il tempo con schermo acceso e aperto la mia attività su di esso, come ha sempre funzionato in questo modo con le versioni precedenti di Android troppo ... Appena ho premuto il tasto Home o spento lo schermo, il mio vecchio MediaButtonIntentReceiver ha iniziato a funzionare normalmente.

Aggiornamento eventi pulsante Media vengono a mio app solo se il mio manager di blocco dello schermo, utilizzando il RemoteControlClient ammortizzato è abilitato, e, naturalmente, la mia attività non è in primo piano. Se disattivo il gestore della schermata di blocco (che è un'opzione nella mia app) ed elimina RemoteControlClient, di nuovo, non riesco a ottenere alcun evento multimediale.

Questo problema in Lollipop è un disastro completo. O almeno un casino completo esiste nella mia mente adesso. Che qualcuno ha postato un esempio di codice chiaro per la gestione di pulsanti multimediali, che avrebbe funzionato con le versioni precedenti di Android, e Lollipop ...

Greg

0

Pls ignorare la funzione return false.

@Override 
    public boolean dispatchKeyEvent(KeyEvent event) { 
     return false; 
    } 
Problemi correlati