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);
}
}
można mieć pewność, że Twoje .MediaButtonIntentReceiver naprawdę jest włączony? – cygery
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
Urządzenia, na których testujesz? –