近期在項目中需要做一個音樂通知欄,需要自定義通知欄佈局,
我在xml中編寫如下佈局:
創建通知代碼如下(兼容高低版本):
private Notification buildNotification(String title, String name, String icon, Bitmap bitmap) {
int playButtonResId = isPlaying() ? R.mipmap.ic_media_pause : R.mipmap.ic_media_play;
long mNotificationPostTime = System.currentTimeMillis();
Intent nowPlayingIntent = new Intent(this, MainActivity.class);
nowPlayingIntent.putExtra("tab", IJumpConsts.JUMP_TAB_RING);
nowPlayingIntent.putExtra("from", "PlayService");
PendingIntent clickIntent = PendingIntent.getActivity(this, 0, nowPlayingIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Intent playNext = new Intent(this, PlayService.class);
playNext.putExtra("cmd", CMD_NEXT);
PendingIntent playNextIntent = PendingIntent.getService(this, CMD_NEXT, playNext, PendingIntent.FLAG_UPDATE_CURRENT);
Intent playPause = new Intent(this, PlayService.class);
playPause.putExtra("cmd", CMD_PAUSE);
PendingIntent playPauseIntent = PendingIntent.getService(this, CMD_PAUSE, playPause, PendingIntent.FLAG_UPDATE_CURRENT);
Intent playPre = new Intent(this, PlayService.class);
playPre.putExtra("cmd", CMD_PRE);
PendingIntent playPreIntent = PendingIntent.getService(this, CMD_PRE, playPre, PendingIntent.FLAG_UPDATE_CURRENT);
RemoteViews contentView = new RemoteViews(getPackageName(),R.layout.view_music_play_remote_view);
contentView.setTextViewText(R.id.title,title);
contentView.setTextViewText(R.id.name,name);
contentView.setImageViewResource(R.id.play,playButtonResId);
contentView.setImageViewBitmap(R.id.icon,bitmap);
contentView.setOnClickPendingIntent(R.id.play,playPauseIntent);
contentView.setOnClickPendingIntent(R.id.pre,playPreIntent);
contentView.setOnClickPendingIntent(R.id.next,playNextIntent);
Notification.Builder builder = null;
builder = new Notification.Builder(this)
.setDefaults(NotificationCompat.FLAG_ONLY_ALERT_ONCE)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentIntent(clickIntent)
.setContentTitle(title)
.setContentText(name)
.setSound(null)
.setWhen(mNotificationPostTime);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
builder.setCustomContentView(contentView);
}else {
builder.setContent(contentView);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
String channelId = "music_play";
String channelName = "music_play";
int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
// 設置通知出現時不震動
channel.enableVibration(false);
channel.enableLights(false);
channel.setVibrationPattern(new long[]{0});
channel.setSound(null, null);
notificationManager.createNotificationChannel(channel);
builder.setChannelId(channelId);
}
builder.setShowWhen(false);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
builder.setVisibility(Notification.VISIBILITY_PUBLIC);
Notification.MediaStyle style = new Notification.MediaStyle()
.setMediaSession(mSession.getSessionToken());
builder.setStyle(style);
}
return builder.build();
}
需要注意的地方是setContent和setCustomContentView ,因爲後者只能在android7以上使用,因此做了兼容。
在android7以上的機子運行效果如下:
界面是正常的,沒有任何問題,但是測試發現在android5~6,會出現按鈕不見,或者佈局異常如下圖:
不僅按鈕不見,而且會出現一條橫線。有的機型是沒有橫線但是按鈕不見了無法控制播放暫停(按鈕是用ImageView實現,remoteViews是支持的)。
開始是懷疑佈局的問題,但是最終發現不是。
因爲一開始想用系統的默認佈局所以設置了Style,也就是以下的代碼。既然自定義的話,也就沒有必要設置以下代碼了,去掉之後就正常了。
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
builder.setVisibility(Notification.VISIBILITY_PUBLIC);
Notification.MediaStyle style = new Notification.MediaStyle()
.setMediaSession(mSession.getSessionToken());
builder.setStyle(style);
}
修改後高版本正常,安卓5~6運行效果如下:
暫時如此解決,具體原因等我有空看看源代碼在補充。