java - 更新 PlayerNotificationManager 信息而不创建另一个
问题描述
使用下面的代码,我可以获得有关音频流的信息(streamTitle),例如歌曲标题和艺术家姓名,每次歌曲更改时(streamTitle)也会更改,因此我需要使用新的歌曲标题和艺术家姓名更新信息通知,下面的代码有效,但我认为每次获得新信息时都创建新通知是错误的。
OnNewMetadataListener listener = new OnNewMetadataListener() {
@Override
public void onNewHeaders(String stringUri, List<String> name, List<String> desc, List<String> br, List<String> genre, List<String> info) {
}
@Override
public void onNewStreamTitle(String stringUri, final String streamTitle) {
MainActivity.songinfo.setText(streamTitle);
notificationManager.exoPlayerNotification(getApplicationContext(), exoPlayer, streamTitle);
}
};
AudiostreamMetadataManager.getInstance()
.setUri(uri)
.setOnNewMetadataListener(listener)
.setUserAgent(UserAgent.WINDOWS_MEDIA_PLAYER)
.start();
通知 :
void exoPlayerNotification(Context context, SimpleExoPlayer exoPlayer, String title) {
String titlesonge;
String artist;
try {
titlesonge = StringUtils.substringBefore(title, " - ");
artist = StringUtils.substringAfter(title, " - ");
} catch (Exception e) {
titlesonge = title.substring(0, title.indexOf(" - "));
artist = title.substring(title.lastIndexOf(" - ") - 1);
}
String finalArtist = artist;
String finalTitlesonge = titlesonge;
PlayerNotificationManager mPlayerNotificationManager = PlayerNotificationManager.createWithNotificationChannel(
context,
"PRIMARY_CHANNEL_ID",
R.string.plaza,
NOTIFICATION_ID,
new PlayerNotificationManager.MediaDescriptionAdapter() {
@Override
public String getCurrentContentTitle(Player player) {
return finalArtist;
}
@Nullable
@Override
public PendingIntent createCurrentContentIntent(Player player) {
Intent intent = new Intent(service, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
Intent.FLAG_ACTIVITY_SINGLE_TOP |
Intent.FLAG_ACTIVITY_NEW_TASK);
return PendingIntent.getActivity(service, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
}
@Override
public String getCurrentContentText(Player player) {
return finalTitlesonge;
}
@Nullable
@Override
public Bitmap getCurrentLargeIcon(Player player, PlayerNotificationManager.BitmapCallback callback) {
return BitmapFactory.decodeResource(service.getResources(), R.drawable.largeicon);
}
@Nullable
@Override
public String getCurrentSubText(Player player) {
return null;
}
}
);
mPlayerNotificationManager.setUseNavigationActions(false);
mPlayerNotificationManager.setFastForwardIncrementMs(0);
mPlayerNotificationManager.setRewindIncrementMs(0);
mPlayerNotificationManager.setColorized(true);
mPlayerNotificationManager.setColor(0xFFBDBDBD);
mPlayerNotificationManager.setUseChronometer(true);
mPlayerNotificationManager.setOngoing(true);
mPlayerNotificationManager.setPriority(NotificationCompat.PRIORITY_MAX);
mPlayerNotificationManager.setUsePlayPauseActions(true);
mPlayerNotificationManager.setSmallIcon(R.drawable.smallwidth);
mPlayerNotificationManager.setNotificationListener(new PlayerNotificationManager.NotificationListener() {
@Override
public void onNotificationStarted(int notificationId, Notification notification) {
service.startForeground(notificationId, notification);
}
@Override
public void onNotificationCancelled(int notificationId) {
service.stopSelf();
cancelNotify();
}
});
mPlayerNotificationManager.setPlayer(exoPlayer);
}
解决方案
这是我在下一个和上一个按钮的通知状态栏中更改媒体文件的代码。
// notification for music
final NotificationManager mNotificationManager =
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
playerNotificationManager = PlayerNotificationManager.createWithNotificationChannel(context,"exo_test",
R.string.noti_id,
5000,
new PlayerNotificationManager.MediaDescriptionAdapter() {
@Override
public String getCurrentContentTitle(Player player) {
int window = player.getCurrentWindowIndex();
return getTitle(window);
/*int track_number=0;
for (int i=0;i<playerList.size();i++) {
if (playerList.get(i).getId()==audioID) {
track_number=i;
return playerList.get(i).getMusicName();
}
}
return null;*/
}
@Nullable
@Override
public PendingIntent createCurrentContentIntent(Player player) {
Intent intent = new Intent(context, MediaActivity.class);
intent.putExtra("music_id",player.getCurrentWindowIndex());
return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
@Nullable
@Override
public String getCurrentContentText(Player player) {
int track_number=0;
for (int i=0;i<playerList.size();i++) {
if (playerList.get(i).getId()==audioID) {
track_number=i;
}
}
return null;
}
@Nullable
@Override
public Bitmap getCurrentLargeIcon(Player player, PlayerNotificationManager.BitmapCallback callback) {
return null;
}
}
);
playerNotificationManager.setNotificationListener(new PlayerNotificationManager.NotificationListener() {
@Override
public void onNotificationStarted(int notificationId, Notification notification) {
mNotificationManager.notify(notificationId,notification);
}
@Override
public void onNotificationCancelled(int notificationId) {
mNotificationManager.cancel(notificationId);
}
});
playerNotificationManager.setRewindIncrementMs(0);
playerNotificationManager.setFastForwardIncrementMs(0);
playerNotificationManager.setPlayer(playerPlay);
} catch (Exception e) {
Toast.makeText(context, e.getMessage(), Toast.LENGTH_LONG).show();
}
从下面的方法中,我得到了在通知状态栏中播放的音乐的名称,并且不要混淆 playerList(通过 exoplayer 的音乐列表)。
private String getTitle(int window) {
for (int i = 0; i <playerList.size() ; i++) {
if(playerList.get(i).getId()==window){
return playerList.get(i).getMusicName();
}
}
return null;
}
推荐阅读
- gitlab - 如何在与 GitLab 控制台相同的服务器上运行 GitLab 运行器
- windows - 如何使用 Powershell 更改表格中的多个标题
- swift - 快速工作区中的 GitHub 操作
- pandas - Python pandas:从两个不同的数据帧中过滤掉不匹配的对
- python - 如何使用 mysql 连接器执行 .sql 文件并将其保存在 python 的数据库中?
- javascript - 声明模块的类型
- c# - 如何将 List 类型的属性从 View 传递到 Controller 并再次返回?
- ubuntu - 在 Ubuntu 上运行的 LXC 容器会出现链接器错误(错误:ld.so)
- android - 第一次尝试在模拟器上运行 Flutter 时出现“连接超时:连接”错误
- maven - Maven 发布插件