Android自定義通知佈局錯位問題

近期在項目中需要做一個音樂通知欄,需要自定義通知欄佈局,

我在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運行效果如下:

 

暫時如此解決,具體原因等我有空看看源代碼在補充。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章