2017-08-30 20 views
7

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.

+0

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

Odpowiedz

4

Rozwiązany. On „Android 8.0 Behavior Changes” strona Google znaleźć ten tekst:

W Androidzie 8.0 (poziom API 26) postępowanie z przycisków medialnych wydarzeń jest inna:

  1. Posługiwanie się przyciskami mediów w działalności UI ma niezmienione: działania na pierwszym planie wciąż mają pierwszeństwo w obsłudze zdarzeń przycisku multimedialnego.
  2. Jeśli aktywność pierwszego planu nie obsługuje zdarzenia przycisku multimediów, system kieruje wydarzenie do aplikacji, która ostatnio odtwarzała dźwięk lokalnie. Aktywny status, flagi i stan odtwarzania sesji medialnej nie są brane pod uwagę przy ustalaniu, która aplikacja otrzymuje zdarzenia przycisku multimediów.
  3. Jeśli sesja medialna aplikacji została zwolniona, system wysyła zdarzenie przycisku multimedialnego do aplikacji MediaButtonReceiver, jeśli ma taką.
  4. W każdym innym przypadku system odrzuca zdarzenie przycisku multimediów.

Wszystko co musiałem zrobić, aby moje prace banalny próbkę grać jakiś dźwięk z MediaPlayer. Najwyraźniej odtwarzanie dźwięku za pomocą interfejsu API Text-to-Speech nie kwalifikuje się, co moim zdaniem jest błędem.

Oto kod dodałem do mojego trywialny próbki, aby to działało, grając bardzo krótki i cichy plik WAV z surowego katalogu zasoby: raport o błędzie

final MediaPlayer mMediaPlayer; 
    mMediaPlayer = MediaPlayer.create(this, R.raw.silent_sound); 
    mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     @Override 
     public void onCompletion(MediaPlayer mediaPlayer) { 
      mMediaPlayer.release(); 
     } 
    }); 
    mMediaPlayer.start(); 

Aktualizacja

Zgłoszony Android śledzenia błędów w https://issuetracker.google.com/issues/65344811

Update 2, Oct. 10, 2017

Google twierdzi teraz, że zachowanie Oreo w tym zakresie jest "zgodne z projektem" i nie naprawi go. Przeczytaj odpowiedź pod koniec wpisu dotyczącego śledzenia błędów powyżej. Muszę powiedzieć, że jestem rozczarowany.

+0

Jeśli zależy Ci na rozwiązaniu tego problemu w Androidzie Oreo, dodaj gwiazdkę do opisu problemu w narzędziu Google Issue Tracker, https: // issuetracker. google.com/issues/65344811 – gregko

+0

Zadziwiające, że to zadziałało. Wiele wysokiej piątki dla ciebie. Mam nadzieję, że to naprawią. – cottonBallPaws

Powiązane problemy