我正在使用服务类构建一个小型音频播放器 . 我显示一个通知,显示音频详细信息和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;
}