Как исправить: 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)

Я публикую свое Уведомление от 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() не называется правильно.

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

26 ответов

Решение

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

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

С помощью VectorXml внутри вашего уведомления было известно, что причиной этой проблемы. Используйте PNG

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

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

.setSmallIcon(R.drawable.ic_stat_push_notif)

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

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

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

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

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

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 компонент, создающий исключение Bad уведомление. Причиной этого исключения является только XML-файл Remoteviews.

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

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

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

Можно уменьшить количество ошибок такого рода, отредактировав 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)
            }
        }
    }
}

Примечание. Этот скрипт не поддерживает проект подмодулей. Я пытаюсь это исправить.

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

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

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

R.drawable.your_icon

к

android.R.drawable.some_standard_icon

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

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

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

У меня было RemoteServiceException, когда использование уведомлений в моем классе происходит от 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 icon).

У вас есть тот же значок

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

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

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

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

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

Я надеюсь, что это решает проблему.

Вы можете поместить этот векторный XML-файл как в drawable, так и в drawable v24. Эта версия Android, меньшая или равная Android 6, заберет ее из папки с возможностью переноса, а более новая версия выше Android 6 заберет ее из версии с возможностью переноса v24.

Синхронизируйте проект и затем Очистите его, Файл> Синхронизировать затем: Buildt > Очистить проект

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

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

Для меня ошибка возникла из-за того, что устройство (Nougat) ссылалось на значок, присутствующий в папке v26.

Решение: просто добавьте соответствующий значок в другую папку, и проблема исчезнет.

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

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

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

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

Пожалуйста, замените <android.support.v7.widget.AppCompatTextView с <TextView из пользовательского макета уведомлений.

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

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

У меня была такая же проблема, когда я установил уведомление в комплекте. Я попробовал это, и это решило мою проблему:

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

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

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

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

У меня тоже была такая же проблема. Проблема с иконкой, которую вы используете, я использовал 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);

Вы можете попробовать другое изображение вместо этого изображения

Получил эту ошибку в своем приложении для Android Flutter и проверил, все ли ресурсы присутствуют и названы правильно, но все еще не работают, я использовал ресурсы из mipmap. Я изменил его на drawable и поместил значки уведомлений в папки drawble и исправил проблему, надеясь, что это может помочь кому-то позже.

Я получил эту ошибку из-за автосылки и параметров 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" />

Быть осторожен!

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

Это была проблема с расположением значка. В моем случае значок уведомления был в drawable-anydpi-v24, я просто скопировал значок в папку с возможностью рисования, и ошибка исчезла.

Это сработало для меня. Прокомментируйте ссылку на значок и, таким образом, сможете без проблем использовать NotificationCompat.Builder.

    $msg_notificacion = [
                        'title'         => "titulonotif",
                       // "icon" : "myicon",
                        'body'          =>"cuerponotif"
                    ];
Другие вопросы по тегам