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


127

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

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是否正确。


3
我遇到了同样的错误(实时应用崩溃报告)。我无法在设备上复制它。我目前在想这是因为人们修改了.apk
变暗

伙计们,我可以用什么方式解决这个问题。我使用png,但很少有应用程序崩溃
user7856586

Answers:


98

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

在获取整数引用和挂起的意图之间,更新了应用程序并更改了所有可绘制的引用。用来引用正确的可绘制对象的整数现在引用了错误的可绘制对象或根本没有引用(完全没有-导致崩溃)


8
奇怪 换句话说,这是不可修复的吗?我在我的应用中看到了同样的崩溃。
Matthias 2014年

它似乎不可修复。我会的,在未来,必须制定不同的方式去发布通知与图像在未来....
FishStix

如果我们尝试将远程视图的textSize设置为ret.setInt(id,“ setTextSize”,20),该怎么办?它也会崩溃。我知道我们也必须提供单位,但是如何使用这种方法签名来实现。任何指针?
–bitsabhi

1
当该应用被终止以进行更新时,是否可以清除通知和所有相关内容?(假设这将使该应用程序避免该问题)
NoHarmDan

3
如果要引用R.drawable.my_image,将其保存为字符串(bundle.putString("img", "my_image")然后在需要时将其转换为实际的@DrawableRes整数,则更安全)如下:ctx.resources.getIdentifier(bundle.getString("img"), "drawable", ctx.packageName)
vanomart

52

VectorXml已知在通知内使用会导致此问题。使用png的


4
仅使用了PNG。
FishStix

就我而言,我不得不矢量drawable文件夹中,巴新drawable-hdpixhdpi等,但没有对PNG drawable-mdpi,它坠毁MDPI设备上张贴的通知。
Vadim Kotov

34

不要在Kitkat上使用SVG!

每当我想在Kitkat上显示通知时,我都会遇到相同的问题。对我造成问题的是,我已经在xml(来自svg)中定义了每个图标,还定义了小图标和操作图标。在我用png -s替换它们之后,问题就解决了。


4
我可以确认。通知中的矢量可绘制对象在KitKat上导致RemoteServiceException。
Khizhny Andrey

2
对于KitKat,当我在以下情况中用PNG替换XML时,问题得到解决:new NotificationCompat.Builder(context,CHANNEL_ID).setSmallIcon(R.drawable.my_icon)
Andrew Glukhoff

1
这对我有用。我正在运行API 19,并使用SVG文件作为通知图标,并给了我这个错误,直到我将其切换为一个小png图标
WHOATEMYNOODLES,

10

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

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

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

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

上面的View组件创建Bad通知异常。此异常原因仅是Remoteviews的xml文件。

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

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


9

我的问题是我使用的图标

.setSmallIcon(R.drawable.ic_stat_push_notif)

没有相应地生成。根据官方文件

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

因此,满足上述要求的最佳方法是使用Roman Nurik在https://romannurik.github.io/AndroidAssetStudio/index.html上提供的Notification Generator

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

最重要的是,如果浏览图像后使用的图标生成器显示白色填充的圆形或正方形,则图像有问题,可能是因为它没有任何透明性,因此请确保你有这个确定。


2
就我而言,我不得不矢量drawable文件夹中,巴新drawable-hdpixhdpi等,但没有对PNG drawable-mdpi,它坠毁MDPI设备上张贴的通知。
Vadim Kotov

7

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

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

因此,步骤如下:

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

注意:

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)
            }
        }
    }
}

注意:此脚本不支持子模块项目。我正在尝试修复它。


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);

2
我已将矢量图像作为资源传递,我认为它导致了oneplus / android 6设备上的崩溃。不确定100%。
Alexey


2

当我的类中使用Notification从FirebaseMessagingService扩展时,我遇到了RemoteServiceException。我在AndroidManifest.xml中添加了以下代码:

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

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


是否必须在<service </ service>标签内添加此元数据?
安德烈

2

在Android Studio 3.0.0及更高版本中,在drawables文件夹中添加新图像时,请选择drawable而不是drawable-v24。在此处输入图片说明

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


注意-如果您在“ Android”视图中,请将其切换到“项目”视图。在Android视图中,您可能看不到drawables
v24

2

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

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

重新制作 步骤1.安装以前的版本。2.发送通知3.使用下一个版本代码更新内部版本4.更新应用程序后,请勿打开应用程序并再次发送通知

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

我希望这可以解决问题。


1

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

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

0

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

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

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


4
为什么要提供帮助?
极限

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);

您可以尝试其他图像代替此图像


0

解决此问题的方法:我的布局中有“不良”视图(例如复选框)-因此我将其删除。

RemoteView似乎仅支持图像和文本(需要通过阅读文档来确认)。


0

使用android.support.constraint.ConstraintLayout时出现了RemoteServiceException。将其更改为LinearLayout或Relative,并将其更改为android:layout_height =“ wrap_content”用于容器


0

(这不是当前问题的解决方案,但可以帮助具有相似核心问题的人)我也遇到了相同的问题,但是就我而言,我使用了损坏的.png文件,导致了同样的问题。所以我删除了它,重新添加了正确的.png文件。


0

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

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

因此使用TextViewImageView



0

同步项目,然后清理,然后依次选择文件>同步:构建>清理项目

希望对您有帮助,对我有用


0

我由于通知视图中textview中的autolink和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" />

小心!


-3

这个工作对我来说。注释图标的引用,因此可以毫无问题地使用NotificationCompat.Builder。

    $msg_notificacion = [
                        'title'         => "titulonotif",
                       // "icon" : "myicon",
                        'body'          =>"cuerponotif"
                    ];
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.