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

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

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 从 PendingInent 集发布我的通知。这里传递的所有值都来自 PendingInent/InentService 中的 bundle 附加值。

/**
* 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 是否全部正确。

91234 次浏览

当时的情况是,我在 PendingInent 包中包含了对图标的整数引用,这个整数后来在发送到 NotificationManager 时被引用。

在获取整数引用和挂起意图之间,应用程序被更新,所有可绘制的引用都发生了变化。用于引用正确绘制的整数现在要么引用不正确的绘制,要么根本不引用(根本不引用,导致崩溃)

不要在 Kitkat 上使用 SVG!

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

RemoteServiceException: 发布了错误的通知

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

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

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

上面的 View组件创建了坏的通知异常。这个异常原因只是远程视图的 xml 文件。

删除 View 组件后,My 代码正确执行,没有任何异常。所以我觉得通知抽屉不接受任何定制的意见。

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

在我的应用程序中,这种错误只有在升级过程中才会发生。如果新版本中的资源 id 发生了变化,那么 Android RemoteView可能无法找到资源并抛弃 RemoteServiceException。如果您发布了第三个版本并且没有更改资源 ID,那么这些 bug 可能会消失。

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

步骤如下:

  1. 反编译 apk 文件,在 res/values中找到 public.xmlids.xml
  2. 在应用程序中找到所有与 RemoteView 相关的资源并复制它们(字符串、模板、可绘制、布局、 id、颜色...)
  3. 在源代码的 res/values下创建 public.xmlids.xml,并粘贴您刚复制的行

注:

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

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

已知在通知中使用 VectorXml会导致此问题

当我在一个包中设置通知时,也遇到了同样的问题。 我试过了,它解决了我的问题:

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

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

同步项目,然后清理它, 文件 > 同步然后: 建立 > 清理项目

我希望这对你们有所帮助,这是我的工作

我也有同样的问题。问题在于您正在使用的图标,我使用的是 android.R.draable.stat _ sys _ download。转到 draables.xml 并粘贴这个。

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

然后在你的代码中

builder.setSmallIcon(R.drawable.ic_start_download);

您可以尝试其他图像而不是这个图像

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

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

当我使用 android.Support.約束. ConstraintLayout 时,我有 RemoteServiceException 异常 以及 android: lay_ height = 容器的“ wra _ content”

这是我的 成功了。注释图标的引用,从而能够使用 NotificationCompat。建设者没有问题。

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

当在我的类中使用 Notification 扩展 FirebaseMessagingService 时,出现了 RemoteServiceException:

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

另外 资源 ic _ small 设置在 Notificy.Builder 类的实例中,方法是 setSmallIcon (int icon)。

我的问题是,我使用的图标

.setSmallIcon(R.drawable.ic_stat_push_notif)

根据 官方文件:

正如在提供特定密度图标集和支持中所描述的 多屏幕,您应该为所有通用的 筛网密度,包括低密度、中密度、高密度和 超高密度屏幕。这确保您的图标将显示 适当地跨越应用程序所在的设备范围 安装。

因此,最好的方法来实现以上,我使用 < em > 通知生成器 提供的罗曼努里克对 https://romannurik.github.io/AndroidAssetStudio/index.html

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

最重要的是,如果你浏览图片后,图标生成器显示的是一个白色填充的圆圈或正方形,那么你的图片就会出现问题,可能是因为它没有任何透明度,所以确保你有这个。

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

你已经通过了相同的图标

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

在 Android Studio 版本3.0.0及以上版本中,当添加一个新的图像在可绘制文件夹中时,请选择可绘制而不是可绘制 -v24。enter image description here

如果您正在使用的图像已经是一个(v24) ,只需复制它并将其粘贴到相同的目录中(例如,可绘制文件)。这一次,它会问你哪个常规或 v24-只是确保它不是 v24,再试一次,这应该修复错误。

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

因为 android.support.v7.widget.AppCompatTextViewandroid.support.v7.widget.AppCompatImageView只能在运行时工作。

因此,使用 TextViewImageView

如果还有人面临这个问题: 在您的可绘制文件夹中添加一个 png 文件,名称为 ic _ stat _ ic _ tification (或者任何您喜欢的名称)

并在您的清单中添加以下几行

你可以在这里创建你的图标-> Https://romannurik.github.io/androidassetstudio/icon

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

原因 : 之所以会发生这种情况,是因为我们在 RemoteView 中使用了向量可绘制性,而向量可绘制性在编译时生成可绘制性。我也不知道为什么有些设备在我们升级应用程序时无法检测到生成的可绘制资源 id。但没错,这就是原因。

繁殖 步骤 1. 安装以前的版本。 2. 发送通知 3. 用下一个版本代码更新构建 更新应用程序后不要打开应用程序并再次发送通知

将可绘制的向量替换为普通的可绘制(. png 或. jpg)文件。

我希望这能解决问题。

如果图标不重要,你可以替换,

R.drawable.your_icon

android.R.drawable.some_standard_icon

成功了!

我得到这个错误是由于文本视图中的自动链接和 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" />

小心点!

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

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

您可以将该向量 xml 文件放在可绘制和可绘制的 v24中。那些小于或等于安卓6的安卓版本将从可绘制文件夹中选择它,而安卓6之上的新版本将从可绘制的 v24中选择它。

这是一个图标位置的问题。在我的情况下,通知图标是在可绘制的-anydpi-v24,我只是复制了图标在可绘制的文件夹和错误已经消失。

在我的 Flutter android 应用程序中出现了这个错误,并检查了所有的资源都存在并正确命名,但仍然无法工作,我正在使用 mipmap 中的资源。我把它改成可绘制的,并把通知图标放在可绘制的文件夹中,修复了这个问题,希望它可以帮助某人以后

它与 Image 类型(Vector、 png 等)无关,而是与您所引用的文件夹有关 到。

对我来说,引起的错误是由于一个设备(Nougat)引用了 v26文件夹中的一个图标。

解决方案: 只需将相关图标添加到其他文件夹,问题就会消失。