2017-08-30 1 views
7

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.

+0

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

Répondre

4

Résolu. Sur "Android 8.0 Behavior Changes" page de Google on trouve ce texte:

la gestion des événements de bouton de médias est différent dans Android 8.0 (niveau de l'API 26):

  1. La manipulation des boutons de médias dans une activité d'assurance-chômage a non modifié: les activités de premier plan sont toujours prioritaires dans la gestion des événements de bouton média.
  2. Si l'activité de premier plan ne gère pas l'événement de bouton multimédia, le système achemine l'événement vers l'application qui a récemment lu l'audio localement. L'état actif, les indicateurs et l'état de lecture d'une session multimédia ne sont pas pris en compte lors de la détermination de l'application qui reçoit les événements de bouton multimédia.
  3. Si la session multimédia de l'application a été publiée, le système envoie l'événement de bouton multimédia au MediaButtonReceiver de l'application s'il en a un.
  4. Dans tous les autres cas, le système rejette l'événement de bouton multimédia.

Tout ce que je devais faire pour mon travail trivial de l'échantillon était de jouer un son avec MediaPlayer. Apparemment, jouer avec l'API Text-to-Speech ne suffit pas, ce qui à mon avis est un bug.

Voici le code que j'ajouté à mon exemple trivial pour le faire fonctionner, la lecture d'un fichier WAV très bref et silencieux du répertoire des ressources brutes:

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(); 

Mise à jour

a présenté le rapport de bogue au suivi des problèmes Android à https://issuetracker.google.com/issues/65344811

Mise à jour 2, le 10 octobre 2017

Google indique maintenant que le comportement d'Oreo à cet égard est "par conception" et ne le réglera pas. Lisez la réponse à la fin du message de suivi des problèmes ci-dessus. Je dois dire que je suis déçu.

+0

Si vous souhaitez résoudre ce problème dans Android Oreo, veuillez ajouter une étoile à la description du problème sur Google Issue Tracker, https: // issuetracker. google.com/issues/65344811 – gregko

+0

Incroyable que cela a fonctionné. Beaucoup de high five à toi. J'espère qu'ils règlent ça. – cottonBallPaws