Le code pour gérer les boutons multimédia des casques que j'utilise dans mon application Text-to-Speech fonctionne très bien sous Android API 22 à 25 (dans les anciennes versions d'Android, ils sont géré par d'autres moyens, maintenant dépréciés). Cependant, sous Android 8 "Oreo", la version bêta publique et la version finale, cela ne fonctionne pas. Voici le code correspondant:Android "O" (Oreo, 8) boutons de boutons problème
Lorsque le service démarre, je crée l'objet MediaSessionCompact:
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);
Il y a de rappel médiatique de la session de cours définis:
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
};
J'ai aussi expérimenté avec PendingIntent, en utilisant MediaButtonReceiver.buildMediaButtonPendingIntent() et définissez mSession.setMediaButtonReceiver (pendingIntent) pour toutes les actions qui m'intéressent, puis dans mon service onStartCommand() j'appelle MediaButtonReceiver.handleIntent (mSession, intention):
// 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));
et au service onStartCommand():
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// ...
if (intent != null) {
MediaButtonReceiver.handleIntent(mSession, intent);
// ...
}
return START_NOT_STICKY;
}
Rien, il est tout à fait muet aux boutons de médias presse événements. Quel est le problème avec "O" ou mon code là? Je suis complètement déconcerté.
Mise à jour 8/32/2017
J'ai aussi créé un projet d'application trivial, mais de travail qui illustre le problème, s'il vous plaît voir: https://github.com/gregko/PlayerServiceSample. Ce projet affiche la sortie LogCat quand un bouton multimédia est pressé sur un casque sous Android 5.x à 7.x, mais échoue complètement sous Android 8 "Oreo".
Mise à jour 01/09/2017 Il y a maintenant une question ouverte sur Android Issue Tracker à ce sujet, que je soumettais à https://issuetracker.google.com/issues/65175978. Toujours les boutons de médias fonctionnent dans plusieurs applications de lecteur de musique que j'ai examinées sur Oreo, je ne peux juste pas comprendre ce qu'ils font différemment pour les faire fonctionner ... Le contexte de mon application ne joue pas la musique, mais la lecture à haute voix au service Speech, donc beaucoup de code provenant d'exemples de Music Player ne s'applique pas.
Depuis que j'ai résolu le problème par moi-même peu de temps après avoir posté la prime, la prime devrait être effectivement fermée maintenant. Aucun moyen de le faire ici que je peux voir, alors voyons ce qui se passe ... – gregko