2015-04-23 6 views
7

Edycja 8 maja 2016kontrola WebView z wydarzeniami przycisku blokuje ostrość mediów w Androida 5

znalazłem przyczynę moje kłopoty odbieranie multimedialnych przycisków wydarzeń w mojej aplikacji. Zobacz odpowiedź poniżej. Edytuję tytuł tego pytania, aby ułatwić znalezienie problemu. Oryginalny tytuł brzmiał: "Co może blokować przyciski multimedialne w Androidzie Lollipop".

oryginalne pytanie, kwiecień 2015 r

Drapanie głowę i wpatrując się cały kod na 2 dni bezskutecznie ... Moja aplikacja Android ma reagować na przyciski multimedialne (np od A zestaw słuchawkowy, przetestuj go za pomocą zestawu słuchawkowego Bluetooth), takich jak odtwarzanie/pauza, następnie przewijanie do tyłu. Działa dobrze na KitKat i poniżej. Przysięgam, że działało nawet na Lollipop aż do kilku dni temu. Teraz nic, bez śladu, że słyszy naciśnięcia przycisków multimedialnych. Czy ktoś ma szybką sugestię, gdzie szukać kłopotów? Testowane z dwoma telefonami Lollipop, tym samym zestawem słuchawkowym Bluetooth i tym samym zestawem słuchawkowym działa dobrze dla niższych wersji Androida. Również ten sam zestaw słuchawkowy działa dobrze, naciśnięcia przycisków multimedialnych są słyszalne w innych aplikacjach. Co mógłbym przełamać ???

Testowałem teraz stare i nowe sposoby słuchania przycisków multimedialnych. W AndroidManifest.xml:

<receiver android:name=".MediaButtonIntentReceiver" android:enabled="false"> 
    <intent-filter> 
     <action android:name="android.intent.action.MEDIA_BUTTON" /> 
    </intent-filter> 
</receiver> 

Fakt, że mówi enabled = „false” jest OK - włączyć i wyłączyć odbiornik, ile potrzeba, a MediaButtonIntentReceiver.java wystąpią zdarzenia dobrze na KitKat i niżej, kompletnej ciszy na Lollipop.

Następnie przełączyłem się na najnowszy appcompat (v22.1) i próbowałem użyć obiektu MediaSessionCompat i kodu powiązanego w następujący sposób. To zadziałało dobrze w małej aplikacji testowej, tylko jedna aktywność, którą napisałem - otrzymała moje komunikaty Logcat potwierdzające, że słyszy klawisze multimedialne wciśnięte na Lollipop. Ale po włożeniu do mojej aplikacji znowu nie działa na Lollipop. Co za cholera???

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

można mieć pewność, że Twoje .MediaButtonIntentReceiver naprawdę jest włączony? – cygery

+0

Tak, jest tam również komunikat logcat, który włącza grzywnę. Ten sam dokładny kod działa na każdej niższej wersji Androida ... A dla nowego kodu na Lollipop z obiektem MediaSessionCompat, odbiornik nie jest potrzebny, można go ustawić na wartość null. Wypróbowałem to również (i skomentowałem cały kod MediaButtonIntentReceiver), nic. Dobrze działa z wartościami zerowymi w małej aplikacji testowej ... – gregko

+0

Urządzenia, na których testujesz? –

Odpowiedz

2

08 maja 2016: Zrobione na pewno końcu znalazłem powód przyciski multimedialne nie działa z moim app, gdy główny ekran był włączony. Później zauważyłem, że zadziałały, gdy jakakolwiek inna aplikacja była aktywna, lub wyłączono ekran itd. - ale nie wtedy, gdy moja główna działalność była na wyższym poziomie. Okazuje się, że przynajmniej w Androidzie 5 kontrolka WebView, której używam na moim głównym ekranie, blokuje przyciski mediów, , jeśli ma ostroœć. Wywołanie:

webView.setFocusable(false); 

lub

webView.setFocusableInTouchMode(false); 

lub ustawiania samego atrybutu w układzie, rozwiązuje ten problem. Dzięki Androidowi 6 ustawienie ostrości w WebView nie miało znaczenia dla odbierania zdarzeń przycisku multimediów.

24 kwietnia 2015 r .: rozwiązano? - Nie całkiem ... Od komentarzu do tego postu: Handling media buttons in Android 5.0 Lollipop przez @mangini:

do odbierania zdarzeń przycisk Media w czasie, gdy działalność jest na pierwszym planie, wezwanie setMediaController() na swojej działalności z MediaController instancja podłączona do aktywnej sesji MediaSession.- Mangini 23 stycznia w 18:35

ja testował cały czas z ekranu, a moja działalność na otwartym na to, jak to zawsze działało w ten sposób pod starszymi wersjami Androida zbyt ... jak tylko nacisnąłem przycisk home lub wyłączyłem ekran, mój stary MediaButtonIntentReceiver zaczął działać normalnie.

Aktualizacja przycisk Media wydarzenia przyjść do mojego app tylko jeśli mój menedżer blokady ekranu, za pomocą zamortyzowanego RemoteControlClient jest włączona, i oczywiście moja działalność nie jest w planie. Jeśli wyłączę menedżera ekranu blokady (co jest opcją w mojej aplikacji) i usuń RemoteControlClient, znowu nie mogę uzyskać żadnych zdarzeń medialnych.

To wydanie pod Lollipopem to kompletny bałagan. A przynajmniej teraz w moim umyśle jest przynajmniej kompletny bałagan. Szkoda ktoś pisał jasną próbki kodu do obsługi przycisków multimedialnych, które będą pracować pod starszymi wersjami Androida i Lollipop ...

Greg

0

Pls przesłonić funkcja return false.

@Override 
    public boolean dispatchKeyEvent(KeyEvent event) { 
     return false; 
    } 
Powiązane problemy