gpt4 book ai didi

android - Notification contentView 和 bigContentView 在 Android 7 中为 null

转载 作者:太空宇宙 更新时间:2023-11-03 13:44:09 26 4
gpt4 key购买 nike

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

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

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

然后使用 StatusBarNotification 检索 contentView 和 bigContentView 并将它们应用到我的自定义回收 View ListView 中:

/**
* 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(实际上是)。这些非常有用,因为您可以复制通知 View ,其中还可以包含一些复杂的操作控件(例如媒体播放器通知,例如播放/暂停/停止控件):

media player notification

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

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

最佳答案

我有一个更好的解决方案:

@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public static RemoteViews getBigContentView(Context context, Notification notification)
{
if(notification.bigContentView != null)
return notification.bigContentView;
else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
return Notification.Builder.recoverBuilder(context, notification).createBigContentView();
else
return null;
}

public static RemoteViews getContentView(Context context, Notification notification)
{
if(notification.contentView != null)
return notification.contentView;
else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
return Notification.Builder.recoverBuilder(context, notification).createContentView();
else
return null;
}

每当您引用 Notification.contentView 时,只需调用 getContentView(...) 而不是 getBigContentView(...) Notification.bigContentView。您的代码将支持 android nougat+ 和所有 android 版本。

修改后,AddNotification会变成这样:

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

if (notification == null) return;

RemoteViews remoteViews = getBigContentView(myContext(), notification);
if(remoteViews == null)
remoteViews = getContentView(myContext(), notification);

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

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

关于android - Notification contentView 和 bigContentView 在 Android 7 中为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45881665/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com