- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个应用程序可以从服务中复制网络广播(使用 AACDecoder 库)并在 Activity 未恢复时在简单的持续通知中显示正在播放的内容。我想要的是通过 NotificationCompat.MediaStyle 添加一个按钮来停止(并最终重新开始)从通知播放,而不需要打开 Activity 。尽管它是一个网络广播播放器而不是一个有复制列表的播放器,我只需要一个播放暂停按钮。但即使在阅读了各种指南 (like this) 之后,我仍然无法正确理解和实现此功能,主要是因为最近弃用了此场景的新兼容性类。
欢迎任何帮助。提前致谢!
最佳答案
您正在寻找的更多是 MediaStyle 通知的折叠版本。虽然我不确定如何强制它保持折叠状态,但这应该会让您走上正确的道路。我使用了一些在 UniversalMusicPlayer 中找到的代码,它们是为 Android 提供的示例代码的一部分。
具体来说 - 您想要查看 MediaNotificationManager 和 MusicService 类。
两者对于您要实现的目标来说都有些过于复杂,但可以作为引用的好地方。特别是 createNotification 方法(请参阅下面的播放/暂停版本)。
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;
}
关于android - 使用 NotificationCompat.MediaStyle 和 MediaSessionCompat 从通知中控制我的网络广播播放器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31836149/
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_C
我正在阅读关于 google official website for building Notification 的教程 在实现代码时,我注意到 NotificationCompat 存在于 Sup
嗨,当我尝试更新(迁移到 andoridx,我在本文末尾添加了一些图片)我的应用程序时遇到问题,尤其是在此代码中: .setStyle(new android.support.v4.media.app
我想在规定的时间显示通知。我使用“setWhen()”。但是 setWhen() 的任何参数都被忽略并且通知总是立即显示。我做错了什么?我的代码: NotificationCompat.Builder
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this, channelId)
我是 Android 新手,收到错误消息:“NotificationCompat 无法解析为类型” MinSDK=9, TargetSDK=18, 到目前为止,所有来源都非常模糊地说明如何解决此问题,
具体来说,我认为任何使用 NotificationCompat 完成的事情都可以使用默认 API(级别 8)完成。我在这里错过了什么? NotificationCompat 引入了哪些使用 2.2 A
我有一个简单的 Android 应用程序,其中包含一个 Activity和 Service源自 MediaBrowserServiceCompat .我已通过使用 MediaBrowserCompat
出于某种原因我的NotificationCompat.Builder不会接受第二个参数,我不知道如何解决它。我看到了其他一些答案,但主要问题出在 gradle 版本中,但我的是最新的,如下所示: if
我正在使用 NotificationCompat 显示来电,但问题是时间限制较少,我想显示 NotificationCompat 40 秒,有什么办法可以增加显示通知的时间,因为当前显示通知的时间小于
我正在关注关于为媒体播放控件创建自定义通知的 android 文档。我读到建议将通知的样式设置为 DecoratedMediaCustomViewStyle,但这会给我以下编译错误。 错误:找不到符号
我正在尝试向我的应用添加通知。 API 级别是 8,所以,我需要使用 NotificationCompat 而不是 Notification,不是吗? 这是我的代码: NotificationMa
想知道是否有人可以提供帮助,我在使用 NotificationCompat.BigPictureStyle 时遇到了一些问题 - 我不知道我是否遗漏了什么,但是除了图片之外我的通知有效..我已经包含了
我在 AndroidStudio 1.4.1 中设置通知时遇到了 setStyle 函数的错误。 这是代码: NotificationCompat.Builder builder =
我正在尝试制作一个聊天应用程序,我的用户将在其中收到通知。通知量如此之大,如果我为每个通知创建一个条目,那么它会填满所有的地方,所以我想到应用 BigTextView 通知或 Stack of not
我想知道是否有人对这种类型的通知有一些经验。 在我的用例中,我想从我的服务触发一个通知,而不是它应该打开一个全屏视频。 setFullScreenIntent 方法看起来恰好解决了这个问题,因为它在文
String ns = Context.NOTIFICATION_SERVICE; NotificationManager mNotificationManager = (Notifi
当我添加通知时: NotificationCompat.Builder mBuilder = new NotificationC
当我尝试将我的通知代码设置为按钮时这部分总是给我错误 NotificationCompat.Builder mBuilder =new NotificationCompat.Builder(this)
我将如何使用它在类中创建的通知来停止前台服务? Intent stopnotificationIntent = new Intent(this, HelloIntentService.class);
我是一名优秀的程序员,十分优秀!