2014-10-21 15 views
7

Stiamo eseguendo la migrazione della notifica di riproduzione in corso alle notifiche MediaStyle introdotte in Lollipop. RemoteControlClient sembra essere deprecato e la notifica MediaStyle non gestisce gli eventi del pulsante multimediale (come pausa/riproduzione tramite cuffie remote).La notifica MediaStyle non risponde agli eventi RemoteControl.

Qualcuno ha avuto questo lavoro? Nessuno degli eventi in MediaSessionCallback viene chiamato.

Ecco come la sessione di supporto viene inizializzata

mSession = new MediaSessionCompat(this, TAG); 
    mSession.setCallback(new MediaSessionCallback()); 
    mSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS); 
    mSession.setPlaybackToLocal(AudioManager.STREAM_MUSIC); 
    mSession.setActive(true); 

Ecco come metadati sono è impostato

MediaMetadataCompat.Builder metadataBuilder = new MediaMetadataCompat.Builder(); 
    metadataBuilder 
      .putLong(MediaMetadata.METADATA_KEY_DURATION, clip.getDuration()) 
      .putString(MediaMetadata.METADATA_KEY_MEDIA_ID, clip.getClipId()) 
      .putString(MediaMetadata.METADATA_KEY_TITLE, clip.getTitle()) 
      .putString(MediaMetadata.METADATA_KEY_ARTIST, clip.getSourceName()) 
      .putString(MediaMetadata.METADATA_KEY_ALBUM_ART_URI, clip.getImageUrl()) 
      .putLong(MediaMetadata.METADATA_KEY_DURATION, clip.getDuration()); 
    mSession.setMetadata(metadataBuilder.build()); 

Infine, il codice di notifica:

 MediaSession mediaSession = (MediaSession) session.getMediaSession(); 
     Notification.Builder builder = 
       new Notification.Builder(c) 
         .setDefaults(0) 
         .setSmallIcon(R.drawable.ic_notif) 
         .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) 
         .setContentTitle(clip.getTitle()) 
         .setContentText(clip.getSourceName()) 
         .setProgress((int)duration, (int)progress, false) 
         .setWhen(0) 
         .setContentIntent(pendingIntent); 

     if (playing) { 
      builder.addAction(R.drawable.ic_media_pause, c.getString(R.string.media_pause), 
        getPendingIntentForKeyCode(app.getApplicationContext(), KeyEvent.KEYCODE_MEDIA_PAUSE)); 
     } else { 
      builder.addAction(R.drawable.ic_media_play, c.getString(R.string.media_play), 
        getPendingIntentForKeyCode(app.getApplicationContext(), KeyEvent.KEYCODE_MEDIA_PLAY)); 
     } 
     builder.addAction(R.drawable.ic_media_next, c.getString(R.string.media_next), 
        getPendingIntentForKeyCode(app.getApplicationContext(), KeyEvent.KEYCODE_MEDIA_NEXT)); 

     builder.setStyle(new Notification.MediaStyle() 
       .setMediaSession(mediaSession.getSessionToken()) 
       .setShowActionsInCompactView(new int[] {1, 2}) 
       ) 
     ); 

     notification = builder.build(); 

risposta

5

Impostare lo stato di riproduzione in MediaSession con le azioni supportate:

PlaybackState state = new PlaybackState.Builder() 
     .setActions(
       PlaybackState.ACTION_PLAY | PlaybackState.ACTION_PLAY_PAUSE | 
       PlaybackState.ACTION_PLAY_FROM_MEDIA_ID | PlaybackState.ACTION_PAUSE | 
       PlaybackState.ACTION_SKIP_TO_NEXT | PlaybackState.ACTION_SKIP_TO_PREVIOUS) 
     .setState(PlaybackState.STATE_PLAYING, position, speed, SystemClock.elapsedRealtime()) 
     .build(); 
mSession.setPlaybackState(state); 
+2

Per la libreria di compatibilità dovrebbe essere qualcosa come: PlaybackStateCompat.Builder stateBuilder = new PlaybackStateCompat.Builder(); stateBuilder.setActions (PlaybackState.ACTION_PLAY | PlaybackState.ACTION_PLAY_PAUSE | PlaybackState.ACTION_PLAY_FROM_MEDIA_ID | PlaybackState.ACTION_PAUSE | PlaybackState.ACTION_SKIP_TO_NEXT | PlaybackState.ACTION_SKIP_TO_PREVIOUS); stateBuilder.setState (PlaybackState.STATE_PLAYING, 0, 1); m_objMediaSession.setPlaybackState (stateBuilder.build()); – goRGon

+1

^lieve correzione, sarebbe 'PlaybackStateCompat.ACTION_PLAY' ecc – hypd09

Problemi correlati