首页 > 解决方案 > 更新 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);
    }

标签: javaandroidandroid-notificationsexoplayer2.x

解决方案


这是我在下一个和上一个按钮的通知状态栏中更改媒体文件的代码。

// 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;
}

推荐阅读