if (queueItem.getQueueId() == activeQueueItemId) { MediaDescriptionCompat description = queueItem.getDescription(); Bundle extras = description.getExtras(); if (extras != null) { for (String key : extras.keySet()) { if (description.getTitle() != null) { String title = String.valueOf(description.getTitle()); builder.putString(MediaMetadataCompat.METADATA_KEY_TITLE, title); builder.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, title); if (description.getSubtitle() != null) { builder.putString( MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE, String.valueOf(description.getSubtitle())); if (description.getDescription() != null) { builder.putString( MediaMetadataCompat.METADATA_KEY_DISPLAY_DESCRIPTION, String.valueOf(description.getDescription())); if (description.getIconBitmap() != null) { builder.putBitmap( MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON, description.getIconBitmap()); if (description.getIconUri() != null) { builder.putString( MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON_URI, String.valueOf(description.getIconUri()));
private static NotificationCompat.Builder generateNotificationBuilderFrom(Context context, MediaSessionCompat mediaSession) { MediaControllerCompat controller = mediaSession.getController(); MediaMetadataCompat mediaMetadata = controller.getMetadata(); MediaDescriptionCompat description = mediaMetadata.getDescription(); NotificationCompat.Builder builder = new NotificationCompat.Builder(context); builder .setContentTitle(description.getTitle()) .setContentText(description.getSubtitle()) .setSubText(description.getDescription()) .setLargeIcon(description.getIconBitmap()) .setContentIntent(controller.getSessionActivity()) // always null... .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) .setDeleteIntent(generateActionIntent(context, KeyEvent.KEYCODE_MEDIA_STOP)); return builder; }
.setSmallIcon(smallIcon) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) .setContentTitle(description.getTitle()) //歌名 .setContentText(description.getSubtitle()); //艺术家
MediaMetadataCompat.Builder builder = new MediaMetadataCompat.Builder() .putText(MediaMetadataCompat.METADATA_KEY_TITLE, item.getTitle()) .putText(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, item.getTitle()) .putText( MediaMetadataCompat.METADATA_KEY_DISPLAY_DESCRIPTION, item.getDescription()) .putBitmap( MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON, item.getIconBitmap()) .putText(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, item.getMediaId()); if (item.getIconUri() != null) { builder.putString( MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON_URI, item.getIconUri().toString()); Bundle extras = item.getExtras(); if (extras != null) { String backgroundArtUri = extras.getString(EXTRA_BACKGROUND_ART);
.setContentTitle(description.getTitle()) .setContentText(description.getSubtitle()) .setLargeIcon(MusicLibrary.getAlbumBitmap(mService, description.getMediaId()))
private void playMedia(MediaDescriptionCompat media) { mPlayerGlue.setTitle(media.getTitle()); mPlayerGlue.setSubtitle(media.getDescription()); mPlayerGlue.getPlayerAdapter().setDataSource(media.getMediaUri()); }
/** * This differs from real Android search logic. Search results will contain all {@link * MediaItem}'s with a title that {@param query} is a substring of. */ @Implementation protected void search( @NonNull final String query, final Bundle extras, @NonNull SearchCallback callback) { if (isConnected) { final List<MediaItem> searchResults = new ArrayList<>(); for (MediaItem item : mediaItems.values()) { final String mediaTitle = item.getDescription().getTitle().toString().toLowerCase(); if (mediaTitle.contains(query.toLowerCase())) { searchResults.add(item); } } handler.post(() -> callback.onSearchResult(query, extras, searchResults)); } else { handler.post(() -> callback.onError(query, extras)); } }
@Override public boolean equals(MediaDescriptionCompat d1, MediaDescriptionCompat d2) { return Util.areEqual(d1.getMediaId(), d2.getMediaId()); }
private Object fullDescription(MediaMetadataCompat metadata) { Bundle bundle = metadata.getDescription().getExtras(); if (bundle != null) { bundle.putAll(metadata.getBundle()); } return bundle; }
.setContentTitle(description.getTitle()) .setContentText(description.getSubtitle()) .setSubText(description.getDescription()) .setLargeIcon(description.getIconBitmap()) .setContentIntent(controller.getSessionActivity()) .setDeleteIntent(MediaButtonReceiver.buildMediaButtonPendingIntent(
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC) .setContentIntent(createContentIntent()) .setContentTitle(description.getTitle()) .setContentText(description.getSubtitle()) .setTicker(description.getTitle() + " - " + description.getSubtitle()) .setLargeIcon(art) .setOngoing(false);
/** * This differs from real Android search logic. Search results will contain all {@link * MediaItem}'s with a title that {@param query} is a substring of. */ @Implementation protected void search( @NonNull final String query, final Bundle extras, @NonNull SearchCallback callback) { if (isConnected) { final List<MediaItem> searchResults = new ArrayList<>(); for (MediaItem item : mediaItems.values()) { final String mediaTitle = item.getDescription().getTitle().toString().toLowerCase(); if (mediaTitle.contains(query.toLowerCase())) { searchResults.add(item); } } handler.post(() -> callback.onSearchResult(query, extras, searchResults)); } else { handler.post(() -> callback.onError(query, extras)); } }
/** * 获取 id 为 mediaId 的媒体在播放队列中的下标 */ public static int getMusicIndexOnQueue(Iterable<MediaSessionCompat.QueueItem> queue, String mediaId) { int index = 0; for (MediaSessionCompat.QueueItem item : queue) { if (mediaId.equals(item.getDescription().getMediaId())) { return index; } index++; } return -1; }
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC) .setContentIntent(mService.createContentIntent()) .setContentTitle(description.getTitle()) .setContentText(description.getSubtitle()) .setOngoing(mPlaybackState.getState() == PlaybackStateCompat.STATE_PLAYING);
/** * 判断传入的媒体跟正在播放的媒体是否一样 */ public boolean isSameBrowsingCategory(@NonNull String mediaId) { MediaSessionCompat.QueueItem current = getCurrentMusic(); if (current == null) { return false; } return mediaId.equals(current.getDescription().getMediaId()); }
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC) .setOnlyAlertOnce(true) .setContentTitle(description.getTitle()) //歌名 .setContentText(description.getSubtitle()) //艺术家 .setLargeIcon(art);
/** * 对比两个列表 */ public static boolean equals(List<MediaSessionCompat.QueueItem> list1, List<MediaSessionCompat.QueueItem> list2) { if (list1 == list2) { return true; } if (list1 == null || list2 == null) { return false; } if (list1.size() != list2.size()) { return false; } for (int i = 0; i < list1.size(); i++) { if (list1.get(i).getQueueId() != list2.get(i).getQueueId()) { return false; } if (!TextUtils.equals(list1.get(i).getDescription().getMediaId(), list2.get(i).getDescription().getMediaId())) { return false; } } return true; }
@Override public void playFromMedia(MediaMetadataCompat metadata) { mCurrentMedia = metadata; final String mediaId = metadata.getDescription().getMediaId(); playFile(MusicLibrary.getMusicFilename(mediaId)); }
@Override public void onPrepare() { if (mQueueIndex < 0 && mPlaylist.isEmpty()) { // Nothing to play. return; } final String mediaId = mPlaylist.get(mQueueIndex).getDescription().getMediaId(); mPreparedMedia = MusicLibrary.getMetadata(MusicService.this, mediaId); mSession.setMetadata(mPreparedMedia); if (!mSession.isActive()) { mSession.setActive(true); } }
/** * List<MediaMetadataCompat> 转 List<MediaSessionCompat.QueueItem> */ private static List<MediaSessionCompat.QueueItem> convertToQueue(List<MediaMetadataCompat> tracks) { List<MediaSessionCompat.QueueItem> queue = new ArrayList<>(); int count = 0; for (MediaMetadataCompat track : tracks) { MediaMetadataCompat trackCopy = new MediaMetadataCompat.Builder(track) .putString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, track.getDescription().getMediaId()) .build(); MediaSessionCompat.QueueItem item = new MediaSessionCompat.QueueItem( trackCopy.getDescription(), count++); queue.add(item); } return queue; }