如何修复:android.app.RemoteServiceException:从包*发布的错误通知:无法创建图标:StatusBarIcon

时间:2014-08-14 21:09:57

标签: android android-notifications android-resources android-drawable

我在崩溃日志中看到以下异常:

android.app.RemoteServiceException: Bad notification posted from package com.my.package: Couldn't create icon: StatusBarIcon(pkg=com.my.package user=0 id=0x7f02015d level=0 visible=true num=0 )
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1456)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:146)
    at android.app.ActivityThread.main(ActivityThread.java:5487)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
    at dalvik.system.NativeStart.main(Native Method)

我使用以下方法通过AlarmManager从PendingIntent集中从IntentService发布我的通知。此处传递的所有值都来自PendingIntent / IntentService中的附加组件。

/**
 * Notification 
 *
 * @param c
 * @param intent
 * @param notificationId
 * @param title
 * @param message
 * @param largeIcon
 * @param smallIcon
 */
public static void showNotification(Context c, Intent intent,
        int notificationId, String title, String message, int largeIcon,
        int smallIcon) {
    PendingIntent detailsIntent = PendingIntent.getActivity(c,
            notificationId, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    // BUILD
    NotificationCompat.Builder mNotifyBuilder = new NotificationCompat.Builder(
            c);
    // TITLE
    mNotifyBuilder.setContentTitle(title).setContentText(message);

    // ICONS
    mNotifyBuilder.setSmallIcon(smallIcon);
    if (Util.isAndroidOSAtLeast(Build.VERSION_CODES.HONEYCOMB)) {
        Bitmap large_icon_bmp = ((BitmapDrawable) c.getResources()
                .getDrawable(largeIcon)).getBitmap();
        mNotifyBuilder.setLargeIcon(large_icon_bmp);
    }

    mNotifyBuilder.setContentIntent(detailsIntent);
    mNotifyBuilder.setVibrate(new long[] { 500, 1500 });
    mNotifyBuilder.setTicker(message);
    mNotifyBuilder.setContentText(message);

    // NOTIFY
    NotificationManager nm = (NotificationManager) c
            .getSystemService(Context.NOTIFICATION_SERVICE);
    nm.notify(notificationId, mNotifyBuilder.build());
}

从我已经看到的其他答案 - 我没看到setSmallIcon()没有被正确调用时发生的例外情况。

我已经检查并仔细检查过传递的资源ID是否正确。

23 个答案:

答案 0 :(得分:89)

发生的事情是,我在PendingIntent包中包含了对该图标的整数引用,并且该整数在被发布到NotificationManager时被引用。

在获取整数引用和待处理意图之间,应用程序已更新,所有可绘制引用都已更改。用于引用正确drawable的整数现在引用了不正确的drawable或者根本没有引用(根本没有 - 导致崩溃)

答案 1 :(得分:45)

在通知中使用VectorXml会导致此问题。使用png'

答案 2 :(得分:15)

  

不要在Kitkat上使用SVG!

每次我想在Kitkat上发布通知时都会遇到同样的问题。导致这个问题的原因是我已经定义了xml中的每个图标(来自svg),小图标和动作图标。在用png-s替换它们后,问题在我身边解决了。

答案 3 :(得分:9)

android.app.RemoteServiceException:发布错误通知

我有同样的问题,但我得到了解决。我的问题是远程视图的“.xml文件”。

在我的xml文件中,我在View分隔符之间添加了一个LinearLayout

<View
    android:layout_width="match_parent"
    android:layout_height="1dp"
    android:id="@+id/view"
    android:background="#000000" />

以上View组件创建了错误通知异常。此例外原因仅是Remoteviews的xml文件。

删除该View组件后,我的代码执行正常,没有任何异常。所以我觉得Notification抽屉不接受任何自定义视图。

因此,您不会在RemoteView对象的.xml文件中绘制任何类似上述视图的内容。

答案 4 :(得分:6)

在我的应用中,此类错误仅在升级期间发生。如果资源ID在较新版本中发生更改,则Android RemoteView可能无法找到资源并丢弃RemoteServiceException。如果您发布第3版并且未更改资源ID,则错误可能会暂时消失

通过编辑res/values/public.xmlres/values/ids.xml可以减少此类错误。如果资源ID不在public.xmlids.xml,编译器将生成单独的资源ID。当您更改资源名称或添加一些新资源时,ID可能会更改,某些设备可能无法找到它。

所以步骤如下:

  1. 反编译apk文件并在res/values中找到public.xmlids.xml
  2. 在您的应用中查找与RemoteView相关的所有资源并复制它们(字符串,尺寸,可绘制,布局,ID,颜色......)
  3. 在源代码中的public.xml下创建ids.xmlres/values并粘贴刚刚复制的行
  4. 注意:

    Gradle 1.3.0及更高版本忽略了本地public.xml。为了使其有效,您需要在build.gradle

    中添加一些脚本
    afterEvaluate {
        for (variant in android.applicationVariants) {
            def scope = variant.getVariantData().getScope()
            String mergeTaskName = scope.getMergeResourcesTask().name
            def mergeTask = tasks.getByName(mergeTaskName)
            mergeTask.doLast {
                copy {
                    int i=0
                    from(android.sourceSets.main.res.srcDirs) {
                        include 'values/public.xml'
                        rename 'public.xml', (i == 0? "public.xml": "public_${i}.xml")
                        i++
                    }
                    into(mergeTask.outputDir)
                }
            }
        }
    }
    

    注意: 此脚本不支持子模块项目。我正在努力解决它。

答案 5 :(得分:5)

我的问题是我在

上使用的图标
.setSmallIcon(R.drawable.ic_stat_push_notif)

未相应生成。根据{{​​3}}:

  

如提供特定于密度的图标集和支持中所述   多个屏幕,您应该为所有通用图标创建单独的图标   屏幕密度,包括低,中,高,和   超高密度屏幕。这可确保您的图标显示   适用于您的应用程序所在的设备范围   安装。

这是填写上述内容的最佳方式,我使用了Roman Nurik在official doc上提供的 通知生成器

通过这种方式,您可以使用图像(考虑到必须具有透明背景)并让生成器为您生成不同大小的通知图标。

最重要的是,如果浏览要使用的图像后的图标生成器会显示白色圆圈或正方形,则表示图像有问题,可能是因为它没有任何透明胶片,所以确保你没有这个。

答案 6 :(得分:3)

您具有相同的图标

     <meta-data
        android:name="com.google.firebase.messaging.default_notification_icon"
        android:resource="@drawable/ic_stat_name" />

您会收到通知

 NotificationCompat.Builder notificationBuilder =
                new NotificationCompat.Builder(this, channelId)
                        .setSmallIcon(R.drawable.ic_stat_name)
                        .setContentTitle("Title")
                        .setContentText(messageBody)
                        .setAutoCancel(true)
                        .setSound(defaultSoundUri)
                        .setContentIntent(pendingIntent);

答案 7 :(得分:1)

您可以将该矢量 xml 文件放在 drawable 和 drawable v24 中。低于或等于Android 6的android版本将从drawable文件夹中提取,而android 6以上的较新版本将从drawable v24中提取。

答案 8 :(得分:1)

如果您在更新应用程序时看到一条通知,则可能会遇到此问题。您可能需要做的是创建一个BroadcastReceiver,它等待PACKAGE_CHANGED消息,这时您关闭所有服务,这也将取消其相关通知。

 <receiver android:name=".MyBroadcastReceiver">
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_CHANGED" />
    </intent-filter>
</receiver>

答案 9 :(得分:1)

我也发生了同样的问题,我也解决了同样的问题

原因:之所以发生这种情况,是因为我们在RemoteViews中使用了矢量可绘制对象,而矢量可绘制对象则在编译时生成了可绘制对象。另外,我不确定为什么在启动应用程序时某些设备无法检测到生成的可绘制资源ID。但这是原因。

禁止复制 脚步  1.安装以前的版本。  2.发送通知  3.使用下一个版本代码更新构建  4.更新应用程序后,请勿打开应用程序并再次发送通知

解决方案 将矢量drawable替换为普通的drawable(.png或.jpg)文件。

我希望这可以解决问题。

答案 10 :(得分:1)

当我的类中的Notification从FirebaseMessagingService扩展时,我有RemoteServiceException。我将以下代码添加到AndroidManifest.xml:

<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_small" />

资源ic_small通过方法setSmallIcon(int icon)在类Notification.Builder的实例中设置。

答案 11 :(得分:1)

同步项目而不是清理它, 文件&gt;然后同步:Build&gt;清洁项目

我希望这对你们有所帮助,这对我有用

答案 12 :(得分:0)

使用android.support.constraint.ConstraintLayout时出现RemoteServiceException。将其更改为LinearLayout或Relative 还有android:layout_height =&#34; wrap_content&#34;对于容器

答案 13 :(得分:0)

(这不是当前问题的解决方案,但帮助有类似核心问题的人)我也有同样的问题,但在我的情况下,我使用了损坏的.png文件导致同样的问题。所以我删除了它并重新包含了正确的.png文件。

答案 14 :(得分:0)

我解决这个问题的方法:我的布局中有“坏”视图(例如:复选框) - 所以我删除了它们。

RemoteViews似乎只支持图像和文本(通过阅读文档来确认)。

答案 15 :(得分:0)

在Android Studio 3.0.0及更高版本中,在drawables文件夹中添加新图像时,请选择drawable而不是drawable-v24。enter image description here

如果您正在使用的图像已经(v24),则只需将其复制并粘贴到其相同目录(例如drawables)中即可。这次它将询问您哪个常规版本或v24-只需确保其不是v24,然后再试一次即可解决该错误。

答案 16 :(得分:0)

请在自定义通知布局中将<android.support.v7.widget.AppCompatTextView替换为 <TextView

因为android.support.v7.widget.AppCompatTextViewandroid.support.v7.widget.AppCompatImageView仅在运行时有效。

因此请使用 TextView ImageView

答案 17 :(得分:0)

如果仍然有人遇到此问题: 在可绘制文件夹中添加一个名为ic_stat_ic_notification(或您喜欢的任何名称)的png文件

,然后在清单中添加以下几行

,您可以在此处创建图标-> https://romannurik.github.io/AndroidAssetStudio/icon

答案 18 :(得分:0)

我也有同样的问题。问题在于你正在使用的图标,我使用的是android.R.drawable.stat_sys_download。转到drawables.xml并粘贴它。

<resources>
 <item name="ic_start_download" type="drawable">@android:drawable/stat_sys_download</item>
</resource>

然后在你的代码中

builder.setSmallIcon(R.drawable.ic_start_download);

您可以尝试使用其他图像而不是此图像

答案 19 :(得分:0)

只要图标不重要,就可以替换

R.drawable.your_icon

收件人

android.R.drawable.some_standard_icon

这行得通!

答案 20 :(得分:0)

由于自动链接和通知视图中textview中的linksClickable选项,我收到此错误:

<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:autoLink="all"
        android:linksClickable="true"
        android:text="@string/app_name"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="@color/white" />

小心!

答案 21 :(得分:0)

我在捆绑包中设置通知时遇到了同样的问题。 我尝试了这个,它解决了我的问题:

builder.setLargeIcon(large_icon);
builder.setSmallIcon(R.drawable.small_icon);

确保在setSmallIcon()之前调用setLargeIcon()。

答案 22 :(得分:-3)

对我有用。注释图标的引用,因此可以毫无问题地使用NotificationCompat.Builder。

    $msg_notificacion = [
                        'title'         => "titulonotif",
                       // "icon" : "myicon",
                        'body'          =>"cuerponotif"
                    ];