草庐IT

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

coder 2023-12-29 原文

我的应用程序的一部分包含一个自定义锁屏,它需要像普通的 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/

有关android - Notification contentView 和 bigContentView 在 Android 7 中为 null的更多相关文章

  1. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  2. "\0"null 的 Ruby 测试? - 2

    我在破坏脚本的字符串中出现了一些奇怪的字符。据我所知,通过putbadstring到控制台,它们是"\0\0\0\0"。我想对此进行测试,以便我可以忽略它们...但是如何呢?以为这就是blank?和empty?的用途?!?:>badstring="\0"=>"\u0000">badstring.blank?NoMethodError:undefinedmethod`blank?'for"\u0000":Stringfrom(irb):97from/Users/meltemi/.rvm/rubies/ruby-2.0.0-p195/bin/irb:16:in`'>badstring.em

  3. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  4. ruby-on-rails - 如何在 Rails 中为现有模型生成表单? - 2

    为现有模型生成单个文件(_form.html.erb)的命令是什么?在Rails3中工作。谢谢。 最佳答案 这听起来可能很傻,但请听我说完……当我想开始清洁时,我自己也做过几次这样的事情。以下是一个脚本,它将读取您的模式并生成必要的生成命令来重现它:require'rubygems'require'active_support/core_ext'schema=File.read('db/schema.rb')schema.scan(/create_table"(\w+)",.*?\n(.*?)\nend/m).eachdo|name

  5. ruby - 在 Ruby 中为变量赋值时如何避免控制台输出 - 2

    赋值时是否可以避免这种影响:irb(main):584:0>a=true=>trueirb(main):584:0>我有一个代码有很多赋值,当我试图测试它时,由于所有这些返回值,我看不到结果:truefalsetruefalsetruetrue.. 最佳答案 您可以启动irb或附加--noecho选项的控制台。$irb--noecho2.0.0p353:001>true2.0.0p353:002>否则,如果控制台由另一个进程启动,只需设置conf.echo=false$irb2.0.0p353:001>true=>true2.0.0

  6. ruby-on-rails - 我如何在 FactoryGirl 中为循环关联创建工厂? - 2

    我在尝试为我在项目中定义的某些对象和关联创建工厂时遇到了问题。我有一种循环关联,其中一个对象与另外两个随后连接在一起的对象关联。+--------------++-------------+|||||TestCase+--------->|TestDataGrid|||||+------+-------++------+------+||||||vv+--------------++--------------+|||||||||TestVariable||TestDataSet|||||+------+-------++------+-------+|||||||||+-------

  7. ruby-on-rails - 如何在 ruby​​ on rails 中为 gmail 联系人创建访问 token - 2

    我正在使用Omniauth请求用户gmail凭据,因此我可以稍后请求用户friend/联系人。现在,我正在使用身份验证请求为我生成的访问token,在OmniauthCallbacksController中获取好友列表。像这样classUsers::OmniauthCallbacksController如何使用存储在数据库中的凭据创建新的访问token,以便从不同的Controller调用googleAPI? 最佳答案 从here获取您的client_id和client_secret|.这是一个粗略的脚本,可以很好地工作。根据您的需

  8. ruby-on-rails - 如何在模块中为类方法起别名? - 2

    我正在使用Rubyv1.9.2和RubyonRailsv3.2.2gem。我有以下模块moduleMyModuleextendActiveSupport::Concernincludeddodefself.my_method(arg1,arg2)...endendend我想为类方法my_method起别名。因此,我声明了以下(不工作)代码:moduleMyModuleextendActiveSupport::Concernincludeddodefself.my_method(arg1,arg2)...end#Note:thefollowingcodedoesn'twork(itrai

  9. ruby-on-rails - 如何在 ruby​​ on rails 中为表单字段使用 span 标签? - 2

    在我的表单中,我使用了如下的span标签:在我选择值后,它在HTML中看起来像下面这样:Antony问题是当我们创建表单时,id没有获取到数据库的值。我不知道确切的问题是。我想使用此内容标签而不是text_field来获取值。谢谢。 最佳答案 当您提交HTML表单时,唯一被POST的值是输入字段中的值,例如文本字段、选择、复选框、按钮等。页面上的内容——无论是否在跨度内--不会发回服务器。这不是Rails的问题,这只是HTML的工作方式。我不太确定你在这里想做什么,但是当你想显示一个值(而不是在输入框中)并将值与表单一起发回时,一种

  10. ruby - 在 Ruby 中为 XOR 训练神经网络 - 2

    我正在尝试训练一个前馈网络来使用Ruby库AI4R执行异或运算。然而,当我在训练后评估XOR时。我没有得到正确的输出。有没有人以前使用过这个库并得到它来学习异或运算。我使用了两个输入神经元,一个隐藏层中的三个神经元,一个输出层,正如我看到的预计算XOR前馈神经网络就像这样。require"rubygems"require"ai4r"#Createthenetworkwith:#2inputs#1hiddenlayerwith3neurons#1outputsnet=Ai4r::NeuralNetwork::Backpropagation.new([2,3,1])example=[[0,

随机推荐