Как исправить: android.app.RemoteServiceException: неверное уведомление отправлено из пакета *: не удалось создать значок: StatusBarIcon


128

Я вижу следующее исключение в журналах сбоев:

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)

Я отправляю свое Уведомление из IntentService из PendingIntent, установленного через AlarmManager, используя следующий метод. Все значения, переданные здесь, взяты из дополнительных пакетов в 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()не вызывается должным образом.

Я проверил и дважды проверил правильность переданных идентификаторов ресурсов.


3
У меня такая же ошибка (отчеты о сбоях из живого приложения). Я не могу воспроизвести это на своем устройстве. Я сейчас думаю, что это потому, что люди изменили .apk
darken

Ребят, как можно решить эту проблему. Я использую png, но очень редко приложение вылетает
user7856586

Ответы:


98

Что происходило, я включал целочисленную ссылку на значок в пакете PendingIntent, и это целое число позже использовалось при отправке в NotificationManager.

В промежутке между получением целочисленной ссылки и отключением ожидающего намерения приложение было обновлено, и все доступные для рисования ссылки изменились. Целое число, которое использовалось для ссылки на правильную возможность рисования, теперь ссылалось либо на неправильную возможность рисования, либо вообще на нее (вообще нет - вызывая этот сбой)


8
Bizarre. Другими словами, это не поправимо? Я вижу такие же сбои в своем приложении.
Матиас

Это не кажется поправимым. В будущем мне придется разработать другой способ публикации уведомлений с изображениями в будущем ....
FishStix

Что, если мы попытаемся установить textSize удаленного представления как ret.setInt (id, "setTextSize", 20); Тоже вылетает. Я знаю, что мы также должны предоставить единицы, но как мне это сделать с такой сигнатурой метода. Любой указатель ??
Bitsabhi

1
Можно ли очистить уведомление и все, что связано с ним, когда приложение будет убито для обновления? (Предполагая, что это поможет приложению избежать проблемы)
NoHarmDan 01

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-hdpi, xhdpiи т.д. Но не было для фотошопа drawable-mdpi, и он упал на MDPI устройства на размещение уведомления.
Вадим Котов

34

Не используйте SVG на Kitkat!

У меня возникала одна и та же проблема каждый раз, когда я хотел показать уведомление на Kitkat. У меня возникла проблема из-за того, что я определил каждый значок в xml (из svg), а также маленький значок и значок действия. После того, как я заменил их на png, проблема решилась на моей стороне.


4
Я могу подтвердить. Векторные рисунки в уведомлениях вызывают исключение RemoteServiceException на KitKat.
Хижный Андрей

2
В случае с KitKat проблема была решена, когда я заменил XML на PNG в: 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-файле я был добавлен один Viewмежду LinearLayoutразделителем for.

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

Вышеупомянутый Viewкомпонент создает исключение недопустимого уведомления. Эта причина исключения - это только xml-файл Remoteviews.

После удаления этого компонента View мой код работал без каких-либо исключений. Поэтому я почувствовал, что ящик уведомлений не принимает никаких настраиваемых представлений.

Таким образом, вы не рисуете ничего похожего на приведенное выше представление в XML-файле RemoteViewобъекта.


9

Моя проблема заключалась в том, что значок, который я использовал на

.setSmallIcon(R.drawable.ic_stat_push_notif)

не было создано соответственно. Согласно официальному документу :

Как описано в разделе «Предоставление наборов значков для определенной плотности и поддержка нескольких экранов», вам следует создать отдельные значки для всех обобщенных плотностей экрана, включая экраны с низкой, средней, высокой и сверхвысокой плотностью. Это гарантирует, что ваши значки будут правильно отображаться на всех устройствах, на которых может быть установлено ваше приложение.

Итак, лучший способ выполнить вышеуказанное, я использовал генератор уведомлений, предоставленный Романом Нуриком на https://romannurik.github.io/AndroidAssetStudio/index.html

Таким образом, вы можете использовать изображение (с учетом того, что оно должно иметь прозрачный фон), и позволить генератору выполнять эту работу за вас, генерируя различные размеры для значков уведомлений.

Самым важным является то, что если генератор значков после просмотра изображения, которое вы собираетесь использовать, показывает вам белый заполненный круг или квадрат, с вашим изображением есть проблемы, возможно, потому, что оно не имеет прозрачности, поэтому убедитесь, что у тебя это нормально.


2
В моем случае, я имел вектор в drawableпапку и детские - х в drawable-hdpi, xhdpiи т.д. Но не было для фотошопа drawable-mdpi, и он упал на MDPI устройства на размещение уведомления.
Вадим Котов

7

В моем приложении такая ошибка возникает только во время обновления. Если идентификатор ресурса изменится в более новой версии, Android RemoteViewможет не найти ресурс и выбросить файл RemoteServiceException. Если вы публикуете 3-ю версию и не меняете идентификатор ресурса, ошибки могут исчезнуть только временно .

Можно уменьшить этот вид ошибок, отредактировав res/values/public.xmlи res/values/ids.xml. Компилятор сгенерирует индивидуальный идентификатор ресурса, если идентификатор ресурса не входит в public.xmlили ids.xml. Когда вы меняете имя ресурса или добавляете новые ресурсы, идентификатор может измениться, и некоторые устройства могут не найти его.

Итак, шаг следующий:

  1. Декомпилируйте файл apk и res/valuesнайдите public.xmlиids.xml
  2. Найдите в своем приложении все ресурсы, связанные с RemoteView, и скопируйте их (строки, размер, возможность рисования, макет, идентификатор, цвет ...)
  3. Создание public.xmlи ids.xmlпод res/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%.
Алексей

3

На всякий случай иконка не важна, можно заменить,

R.drawable.your_icon

к

android.R.drawable.some_standard_icon

Это работает!


2

У меня было исключение RemoteServiceException, когда использование Notification в моем классе расширяется от FirebaseMessagingService. Я добавил в AndroidManifest.xml следующий код:

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

Также ресурс ic_small устанавливается в экземпляре класса Notification.Builder методом setSmallIcon (значок int).


эти метаданные должны быть добавлены внутри тегов <service </service>?
Андрей

2

В Android Studio версии 3.0.0 и выше при добавлении нового изображения в папку drawables выберите drawable вместо drawable-v24.введите описание изображения здесь

Если изображение, которое вы используете, уже существует (v24), просто скопируйте его и вставьте в тот же каталог (например, чертежи). На этот раз он спросит вас, какой обычный или v24 - просто убедитесь, что это не v24, и попробуйте снова, это должно исправить ошибку.


Обратите внимание: если вы находитесь в представлении «Android», переключите его на представление «Проект». В представлении Android вы можете не увидеть каталог
drawables v24

2

Та же проблема случилась и со мной, и я решил то же самое

ПРИЧИНА : это происходит из-за того, что мы используем векторную отрисовку для RemoteViews, а векторная отрисовка генерирует отрисовку во время компиляции. Также я не уверен, почему некоторые устройства не могут обнаружить сгенерированный идентификатор ресурсов для рисования, пока мы увеличиваем приложение. Но да, это была причина.

ВОСПРОИЗВЕДЕНИЕ Шаги 1. Установите предыдущую сборку. 2. Отправьте уведомление 3. Обновите сборку кодом следующей версии 4. После обновления приложения не открывайте приложение и не отправляйте уведомление повторно.

РЕШЕНИЕ Замените векторный файл с возможностью рисования обычным файлом (.png или .jpg) с возможностью рисования.

Надеюсь, это решит проблему.


1

Если во время обновления вашего приложения отображается уведомление, вы можете столкнуться с этим. Что вам может понадобиться сделать, так это создать BroadcastReceiver, который ожидает сообщения PACKAGE_CHANGED, после чего вы завершите работу всех своих служб, которые также отклонят связанные с ними уведомления.

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

Убедитесь, что setLargeIcon () вызывается до setSmallIcon ().


4
Почему это должно помочь?
limitium

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

Мой способ решить эту проблему: у меня были "плохие" представления в моем макете (например, флажок), поэтому я удалил их.

RemoteViews, похоже, поддерживают только изображения и тексты (для подтверждения при чтении документа).


0

У меня было исключение RemoteServiceException при использовании android.support.constraint.ConstraintLayout. Измените его на LinearLayout или Relative, а также на android: layout_height = "wrap_content" для контейнера.


0

(это не решение текущего вопроса, но помогает кому-то с аналогичной основной проблемой) У меня тоже была такая же проблема, но в моем случае я использовал поврежденный файл .png, который вызывает ту же проблему. Я удалил его и снова включил правильный файл .png.


0

Замените <android.support.v7.widget.AppCompatTextViewна <TextViewиз настраиваемого макета уведомлений.

Потому что android.support.v7.widget.AppCompatTextViewили android.support.v7.widget.AppCompatImageViewработает только во время выполнения.

Так что используйте TextViewилиImageView


0

Если кто-то все еще сталкивается с этой проблемой: добавьте файл png в свою папку с возможностью переноса с именем ic_stat_ic_notification (или любым другим именем, которое вам нравится)

и в вашем манифесте добавьте пару строк ниже

и вы можете создавать свои значки здесь -> https://romannurik.github.io/AndroidAssetStudio/icon


0

Синхронизируйте проект, а затем очистите его, затем выберите File> Synchronize: Build> Clean Project.

Я надеюсь, что это поможет вам всем, это работает для меня


0

Я получил эту ошибку из-за автосылки и параметров 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"
                    ];
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.