Android 7中的通知contentView和bigContentView为空

时间:2017-08-25 12:40:12

标签: android notifications lockscreen remoteview

我的部分应用程序包含一个自定义锁屏,需要像正常的android锁屏一样显示通知。

在Android 6之前一切正常,我使用NotificationListenerService来检索通知contentView和bigContentView(RemoteViews)。我在我的自定义RecyclerView适配器上使用它们来创建一个通知列表,其中包含服务列出的相同通知:

//this is called by NotificationListenerService
@Override
public void onNotificationPosted(StatusBarNotification sbn) {
    AddNotification(sbn);
}

然后使用StatusBarNotification检索contentView和bigContentView并将它们应用到我的自定义循环视图列表视图中:

/**
* Add notification into recycleview
* @param sbn notification to add
*/
private void AddNotification(StatusBarNotification sbn)
{
    Notification notification = sbn.getNotification();

    if(notification==null) return;

    if(notification.bigContentView!=null) {
        //apply bigContentView to my recycleview list notification view
        myListView.notificationview = notification.bigContentView.apply(myContext(), myNotificationLayout);
    }
    else if(notification.contentView!=null) {
        //apply contentView to my recycleview list notification view
        myListView.notificationview = notification.contentView.apply(myContext(), myNotificationLayout);
    }

    //notify recycleview of a new item inserted
    notifyItemInserted(0);
}

Android 7已经不再可能了,因为从Android N开始(如Android文档中所述),contentView和bigContentView可能为null(实际上它们是)。 这些非常有用,因为你可以复制通知视图,这些视图也可能包含一些复杂的动作控件(例如媒体播放器通知,例如播放/暂停/停止控制):

media player notification

在Android 7及更高版本中是否可以使用与原始通知相同的内容创建视图?

如何复制RemoteView行为?是否可以检索所有通知信息(图形,文本,图标,意图等)?

1 个答案:

答案 0 :(得分:1)

经过调查,除非发件人使用自定义布局调用setCustomContentView()和/或setCustomBigContentView(),否则无法检索通知的全部内容(即检索通知Remoteviews)。

也就是说,这里唯一的解决方案是使用与原始通知相同的信息重新创建一个Remoteview(或两个,如果你想同时拥有紧凑版和扩展版)。为此,从Bundle通知extras中提取的信息将用于填充您应创建的XML通知布局,类似于以下内容:

Android N notification design

此外,您必须检查附加组件Bundle是否包含Notification.EXTRA_TEMPLATE键,如果是,请检查其样式。 XML布局应该复制不同类型的窗框(MediaStyle,InboxStyle,BigPictureStyle)并相应地填充所有字段。