Kod obsługi przycisków multimedialnych z zestawów słuchawkowych, których używam w mojej aplikacji do konwersji tekstu na mowę działa świetnie pod Androidem API od 22 do 25 (w starszych wersjach Androida są one obsługiwane przez inne, obecnie zamortyzowane środki). Jednak pod Androidem 8 "Oreo", zarówno publiczna wersja beta, jak i wersja ostateczna, nie działa. Oto odpowiedni kod:Android "O" (Oreo, 8) przyciski multimedialne wydanie
Po uruchomieniu usługi, tworzę MediaSessionCompact obiektu:
mSession = new MediaSessionCompat(getApplicationContext(), "my.package.name._player_session");
mSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
mSession.setActive(true);
mSession.setCallback(myMediaSessionCallback);
PlaybackStateCompat state = new PlaybackStateCompat.Builder()
.setActions(ACTION_PLAY_PAUSE | ACTION_PLAY | ACTION_PAUSE |
ACTION_SKIP_TO_NEXT | ACTION_SKIP_TO_PREVIOUS |
ACTION_FAST_FORWARD | ACTION_REWIND
)
.setState(PlaybackStateCompat.STATE_PAUSED, 0 /*PlaybackStateCompat.PLAYBACK_POSITION_UNKNOWN*/, 1f)
.build();
mSession.setPlaybackState(state);
Istnieje oczywiście mediów sesja zwrotnego zdefiniowane:
private MediaSessionCompat.Callback myMediaSessionCallback = new MediaSessionCompat.Callback() {
@Override
public boolean onMediaButtonEvent(Intent mediaButtonIntent) {
// The log output below never appears on "Oreo", nothing comes here.
Log.d(TAG, "callback onMediaButtonEvent() Compat");
MediaButtonIntentReceiver.handleIntent(mediaButtonIntent.getAction(), (KeyEvent) mediaButtonIntent.getParcelableExtra(Intent.EXTRA_KEY_EVENT));
return true;
}
@Override
public void onSkipToNext() {
//...
}
// etc. other overrides
};
ja również eksperymentował z PendingIntent, używając MediaButtonReceiver.buildMediaButtonPendingIntent() i ustaw mSession.setMediaButtonReceiver (pendingIntent) dla wszystkich działań, które mnie interesują, następnie w mojej usłudze onStartCommand() Dzwonię do MediaButtonReceiver.handleIntent (mSession, intent):
// still in the same service:
mSession.setMediaButtonReceiver(
MediaButtonReceiver.buildMediaButtonPendingIntent(
this,
mMediaButtonReceiverComponentName,
ACTION_PLAY));
mSession.setMediaButtonReceiver(
MediaButtonReceiver.buildMediaButtonPendingIntent(
this,
mMediaButtonReceiverComponentName,
ACTION_PAUSE));
mSession.setMediaButtonReceiver(
MediaButtonReceiver.buildMediaButtonPendingIntent(
this,
mMediaButtonReceiverComponentName,
ACTION_PLAY_PAUSE));
iw służbie onStartCommand():
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// ...
if (intent != null) {
MediaButtonReceiver.handleIntent(mSession, intent);
// ...
}
return START_NOT_STICKY;
}
Nic, kompletnie głupi, żeby nacisnąć przyciski multimedialne zdarzenia. Co jest nie tak z "O" lub moim kodem? Jestem kompletnie zaskoczony.
Aktualizacja 8/32/2017
ja też stworzył trywialny ale praca z aplikacjami projekt, który demonstruje problem, proszę zobaczyć: https://github.com/gregko/PlayerServiceSample. Ten projekt wyświetla dane wyjściowe LogCat po naciśnięciu przycisku multimediów na zestawie słuchawkowym w systemie Android w wersji 5.x do 7.x, ale nie udaje się całkowicie pod systemem Android 8 "Oreo".
Aktualizacja 1.09.2017 Obecnie kwestią otwartą na Android Issue Tracker o tym, co ja złożonego na https://issuetracker.google.com/issues/65175978. Mimo to przyciski multimedialne działają w kilku aplikacjach muzycznych, które testowałem na Oreo, po prostu nie wiem, co one robią inaczej, aby działały ... Kontekst mojej aplikacji nie odtwarza muzyki, ale czyta na głos tekst z tekstem do usługi Mowy, więc wiele kodu z przykładów odtwarzacza muzyki nie ma zastosowania.
Ponieważ samodzielnie rozwiązałem problem wkrótce po zaksięgowaniu nagrody, nagroda powinna zostać skutecznie zamknięta. Nie widzę sposobu, aby to zrobić, więc zobaczmy, co się stanie ... – gregko