我正在使用服务类构建一个小型音频播放器 . 我显示一个通知,显示音频详细信息和3个按钮:上一首歌曲按钮,下一首歌曲按钮和播放/暂停按钮 . 这首歌播放得很好,但问题是当我试着暂停这首歌时,它又开始播放了 . mediaplayer.isPlaying 返回false(我不是't know why). The onstartCommand of the service is called when I press the pause button in the notification. I'm遵循本教程:https://www.sitepoint.com/a-step-by-step-guide-to-building-an-android-audio-player-app/

码:

private void buildNotifications(PlaybackStatus playbackStatus){

    if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){

        createChannel();
    }

    int notificationAction = android.R.drawable.ic_media_pause;//needs to be initialized
    PendingIntent play_pauseAction = null;

    //Build a new notification according to the current state of the MediaPlayer
    if (playbackStatus == PlaybackStatus.PLAYING) {
        notificationAction = android.R.drawable.ic_media_pause;
        //create the pause action
        play_pauseAction = playbackAction(1);
    } else if (playbackStatus == PlaybackStatus.PAUSED) {
        notificationAction = android.R.drawable.ic_media_play;
        //create the play action
        play_pauseAction = playbackAction(0);
    }

   final NotificationCompat.Builder notiB = new NotificationCompat.Builder(this,CHANNEL_ID);
    notiB.setShowWhen(false);
    notiB.setStyle(new MediaStyle()
            .setMediaSession(mediaSession.getSessionToken())
            .setShowActionsInCompactView(0,1,2));
    notiB.setSmallIcon(R.drawable.play_song);
/*    Glide.with(getApplicationContext()).asBitmap().load(songInfoModelService.getAlbumIDArtwork()).apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.RESOURCE)).into(new SimpleTarget<Bitmap>() {
        @Override
        public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {

            notiB.setLargeIcon(resource);

        }
    });*/
    notiB.setContentTitle(songInfoModelService.getSongName());
    notiB.setContentText(songInfoModelService.getArtistName());
    notiB.addAction(android.R.drawable.ic_media_previous, "previous", playbackAction(3));
    notiB.addAction(notificationAction, "pause", play_pauseAction);
    notiB.addAction(android.R.drawable.ic_media_next, "next", playbackAction(2));

    notification = notiB.build();
    notificationManager.notify(NOTIFICATION_ID,notification);


}



    private void handleIncomingActions(Intent playbackAction) {
    if (playbackAction == null || playbackAction.getAction() == null) return;

    String actionString = playbackAction.getAction();
    if (actionString.equalsIgnoreCase(ACTION_PLAY)) {
        resumeMedia();
    } else if (actionString.equalsIgnoreCase(ACTION_PAUSE)) {
        pauseMedia();
    } else if (actionString.equalsIgnoreCase(ACTION_NEXT)) {
        skipToNext();
    } else if (actionString.equalsIgnoreCase(ACTION_PREVIOUS)) {
        skipToPrevious();
    }
}



  private PendingIntent  playbackAction(int actionNumber) {
    Intent playbackAction = new Intent(this, MediaPlayerService.class);
    switch (actionNumber) {
        case 0:
            // Play
            playbackAction.setAction(ACTION_PLAY);
            return PendingIntent.getService(this, actionNumber, playbackAction, 0);
        case 1:
            // Pause
            playbackAction.setAction(ACTION_PAUSE);
            return PendingIntent.getService(this, actionNumber, playbackAction, 0);
        case 2:
            // Next track
            playbackAction.setAction(ACTION_NEXT);
            return PendingIntent.getService(this, actionNumber, playbackAction, 0);
        case 3:
            // Previous track
            playbackAction.setAction(ACTION_PREVIOUS);
            return PendingIntent.getService(this, actionNumber, playbackAction, 0);
        default:
            break;
    }
    return null;
}