2015-08-05 1 views
1

У меня есть приложение, которое воспроизводит из сервиса webradio (с использованием AACDecoder lib) и показывает на простом постоянном уведомлении, что играет, пока активность не возобновляется. То, что я хочу, это добавить NotificationCompat.MediaStyle кнопку, чтобы остановить (и в конечном итоге возобновить) воспроизведение из уведомления без необходимости открытия активности. Несмотря на то, что это проигрыватель webradio, а не игрок с списком рецензирования, Мне нужна только кнопка паузы воспроизведения. Но даже после прочтения различных руководств (like this) им не удается правильно понять и реализовать эту функцию, главным образом из-за недавних оценок и новых классов совместимости в этом сценарии.Управление моим веб-радиопроигрывателем из уведомления с NotificationCompat.MediaStyle и MediaSessionCompat

Это как выглядит мое уведомление:

И это, как я хочу (приблизительно, нужно просто кнопку паузы, воспроизведения): enter image description here

Любая помощь приветствуется. Заранее спасибо!

ответ

1

Что вы ищете, это больше всего по свернутой версии уведомления MediaStyle. Хотя я не уверен, как заставить его оставаться рухнувшим, это должно привести вас к правильному пути. Я использовал немного кода, найденного в UniversalMusicPlayer, который является частью примера кода для Android.

В частности - вы хотите проверить классы MediaNotificationManager и MusicService.

https://github.com/googlesamples/android-UniversalMusicPlayer/blob/master/mobile/src/main/java/com/example/android/uamp/MediaNotificationManager.java

Оба из которых являются немного слишком сложным для того, что вы пытаетесь достичь, но может быть хорошим местом, чтобы обратиться к. В частности, метод createNotification (см. Версию Play/Pause ниже).

private Notification createNotification() { 
    if (mMetadata == null || mPlaybackState == null) { 
     return null; 
    } 

    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(mService); 
    int playPauseButtonPosition = 0; 


    addPlayPauseAction(notificationBuilder); 

    MediaDescriptionCompat description = mMetadata.getDescription(); 

    String fetchArtUrl = null; 
    Bitmap art = null; 
    if (description.getIconUri() != null) { 
     // This sample assumes the iconUri will be a valid URL formatted String, but 
     // it can actually be any valid Android Uri formatted String. 
     // async fetch the album art icon 
     String artUrl = description.getIconUri().toString(); 
     art = ChannelImageCache.getInstance().getBigImage(artUrl); 
     if (art == null) { 
      fetchArtUrl = artUrl; 
      // use a placeholder art while the remote art is being downloaded 
      art = BitmapFactory.decodeResource(mService.getResources(), 
        R.drawable.ic_default_art); 
     } 
    } 

    notificationBuilder 
      .setStyle(new NotificationCompat.MediaStyle() 
        .setShowActionsInCompactView(
          new int[]{playPauseButtonPosition}) // show only play/pause in compact view 
        .setMediaSession(mSession.getSessionToken())) 
      .setColor(mNotificationColor) 
      .setSmallIcon(R.drawable.ic_notification) 
      .setVisibility(Notification.VISIBILITY_PUBLIC) 
      .setUsesChronometer(true) 
      .setContentIntent(createContentIntent(description)) 
      .setContentTitle(description.getTitle()) 
      .setContentText(description.getSubtitle()) 
      .setLargeIcon(art); 

    setNotificationPlaybackState(notificationBuilder); 
    if (fetchArtUrl != null) { 
     fetchBitmapFromURLAsync(fetchArtUrl, notificationBuilder); 
    } 

    return notificationBuilder.build(); 
} 

private void addPlayPauseAction(NotificationCompat.Builder builder) { 
    String label; 
    int icon; 
    PendingIntent intent; 
    if (mPlaybackState.getState() == PlaybackStateCompat.STATE_PLAYING) { 
     label = mService.getString(R.string.mr_media_route_controller_pause); 
     icon = R.drawable.uamp_ic_pause_white_24dp; 
     intent = mPauseIntent; 
    } else { 
     label = mService.getString(R.string.mr_media_route_controller_play); 
     icon = R.drawable.uamp_ic_play_arrow_white_24dp; 
     intent = mPlayIntent; 
    } 
    builder.addAction(new NotificationCompat.Action(icon, label, intent)); 
} 

Это уведомление будет использовать MediaSession в службе (где я предполагаю, что ты AACDecoder/AACPlayer живет). Когда вы получите метаданные ID3 от игрока, вам нужно обновить метаданные и установить их в mediaSession.

private void updateMetadata() { 

    final MediaMetadataCompat track = generateMediaMetadataCompat(currentMetaData); 

    mediaSession.setMetadata(track); 
} 

    private MediaMetadataCompat generateMediaMetadataCompat(SomeMetadataModelObject streamMetadata) 
{ 
    currentMediaMetadataCompat = new MediaMetadataCompat.Builder() 
      .putString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, streamMetadata.getMediaId()) 
      .putString(MediaMetadataCompat.METADATA_KEY_ALBUM, streamMetadata.getAlbumName()) 
      .putString(MediaMetadataCompat.METADATA_KEY_ARTIST, streamMetadata.getArtistName()) 

      .putString(MediaMetadataCompat.METADATA_KEY_ALBUM_ART_URI, "http://somealbumart.png") 
      .putString(MediaMetadataCompat.METADATA_KEY_TITLE, streamMetadata.getSongTitle()) 

      .build(); 
    return currentMediaMetadataCompat; 
} 
+0

Я попробую. Спасибо. – Informatheus

Смежные вопросы