首页 > 解决方案 > 如何在android中构建通知并实现点击监听?

问题描述

你好朋友我正在创建 mp3 播放器应用程序我的应用程序已成功构建我想在用户进入后台时实现点击事件通知他们从通知面板控制媒体我的通知也成功构建但问题是如何控制音乐和更改通知上的图像.addaction( )当用户单击暂停时,图像更改为播放,歌曲播放时图像更改为暂停,媒体播放器也是,我也想获取歌曲标题,艺术家在这里我的代码你可以很容易地理解!

public void play(int songindex) {
song = songList.get(songindex);

try {

    if (mediaPlayer != null) {
        mediaPlayer.release();
        mediaPlayer = null;
    }
    Uri uri = Uri.parse("file:///" + song.getGetpath());
    mediaPlayer = MediaPlayer.create(mContext, uri);
     title.setText(song.getTitle());
    artist.setText(song.getArtist());

     notificationTitleText=title.getText();
    notificationDescText=artist.getText();
    handler = VisualizerDbmHandler.Factory.newVisualizerHandler(getApplicationContext(), mediaPlayer);
    audioVisualization.linkTo(handler);
    mediaPlayer.start();
    seekBar.setProgress(0);
    seekBar.setMax(100);
    updateProgressBar();

    if (mediaPlayer != null && mediaPlayer.isPlaying()) {
        play.setVisibility(View.GONE);
        pause.setVisibility(View.VISIBLE);
        play_main.setVisibility(View.GONE);
        pause_main.setVisibility(View.VISIBLE);
        Animation aniRotate = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.rotate);
        rotate.startAnimation(aniRotate);

        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {


                if (checked) {
                    mediaPlayer.setLooping(true);
                    mediaPlayer.start();
                } else if (isShuffle) {
                    // shuffle is on - play a random song
                    Random rand = new Random();
                    currentSongIndex = rand.nextInt((songList.size() - 1) - 0 + 1) + 0;
                    play(currentSongIndex);
                } else {
                    // no repeat or shuffle ON - play next song
                    if (currentSongIndex < (songList.size() - 1)) {
                        play(currentSongIndex + 1);
                        currentSongIndex = currentSongIndex + 1;
                    } else {
                        // play first song
                        play(0);
                        currentSongIndex = 0;
                    }
                }
            }
        });
    }


} catch (Exception e) {

    Toast.makeText(getApplicationContext(), "" + e, Toast.LENGTH_SHORT).show();


}

}

public  void  shownotification(){
    Bitmap largeImage = BitmapFactory.decodeResource(getResources(),R.drawable.dog);




    Notification channel = new NotificationCompat.Builder(getApplicationContext(),CHANNEL_ID_1)
            .setSmallIcon(R.drawable.ic_music)
            .setContentTitle(notificationTitleText
            )
            .setContentText(notificationDescText)
            .setLargeIcon(largeImage)
            .addAction(R.drawable.ic_like,"like",null)
            .addAction(R.drawable.ic_prev,"prev",null)
            .addAction(R.drawable.ic_pause,"pause",null)
            .addAction(R.drawable.ic_next,"next",null)
            .addAction(R.drawable.ic_dislike,"dislike",null)
            .setStyle(new android.support.v4.media.app.NotificationCompat.MediaStyle().
                    setShowActionsInCompactView(1,2,3))
            .build();



    mNotificationManagerCompat.notify(1,channel);

}

gettext() 方法工作正常,但如果歌曲播放完成且下一首歌曲未获得文本值,则在发生任何点击事件时它首先工作

标签: javaandroidandroid-activity

解决方案


我假设您正在播放 Activity 中的歌曲,但这也适用于服务。

将此放入您的活动或服务中

private final BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if(action.equals("com.mypackage.ACTION_PAUSE_MUSIC")){
            //Do whatever you want. Ex. Pause
        }
        //Similarly this can be done for all actions
    }};

像这样制作您的节目通知方法

public  void  shownotification(){
Bitmap largeImage = BitmapFactory.decodeResource(getResources(),R.drawable.dog);

Intent pauseIntent = new Intent("com.mypackage.ACTION_PAUSE_MUSIC");
PendingIntent pausePendingIntent = PendingIntent.getBroadcast(this, 1, pauseIntent, 0);
// Similarly you can create an intent and pending intent pair for each action you want just change the string in intent constructor

Notification channel = new NotificationCompat.Builder(getApplicationContext(),CHANNEL_ID_1)
        .setSmallIcon(R.drawable.ic_music)
        .setContentTitle(notificationTitleText
        )
        .setContentText(notificationDescText)
        .setLargeIcon(largeImage)
        .addAction(R.drawable.ic_like,"like",null)
        .addAction(R.drawable.ic_prev,"prev",null)
        .addAction(R.drawable.ic_pause,"pause",pausePendingIntent)  //like this attach every action with respective pending intent
        .addAction(R.drawable.ic_next,"next",null)
        .addAction(R.drawable.ic_dislike,"dislike",null)
        .setStyle(new android.support.v4.media.app.NotificationCompat.MediaStyle()
        .setShowActionsInCompactView(1,2,3))
        .build();

mNotificationManagerCompat.notify(1,channel);}

推荐阅读