Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Использование VectorXml внутри вашего уведомления, как известно, вызывает эту проблему. Использовать png

Ответ 3

Don't use SVG on Kitkat!

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

Ответ 4

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

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

Таким образом, вы не рисуете какую-либо вещь, как показано выше в файле .xml объекта RemoteView.

Ответ 5

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

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

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

  • Декомпилируйте файл apk и в res/values найдите public.xml и ids.xml
  • Найдите все ресурсы, связанные с RemoteView в приложении, и скопируйте их (строки, размеры, рисунки, макет, идентификатор, цвет...)
  • Создайте public.xml и ids.xml под res/values в исходном коде и вставьте строки, которые вы просто скопировали

Примечание:

Gradle 1.3.0 и выше игнорировать локальный public.xml. Чтобы заставить его работать, вам нужно добавить script в 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)
            }
        }
    }
}

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

Ответ 6

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

.setSmallIcon(R.drawable.ic_stat_push_notif)

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

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

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

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

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

Ответ 7

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

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

Ответ 8

У меня было 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).

Ответ 9

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

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

Ответ 10

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

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

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

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

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

Ответ 11

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

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

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

Ответ 12

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

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

Ответ 13

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

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

Ответ 14

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

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

Ответ 15

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

Ответ 16

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

Ответ 17

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

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

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

Ответ 18

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

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

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

Ответ 19

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

R.drawable.your_icon

к

android.R.drawable.some_standard_icon

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

Ответ 20

Я получил эту ошибку из-за опций 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" />

Будь осторожен!

Ответ 21

Может быть, это может помочь вам. Возможно, ваша ошибка в том, что используемый вами значок не имеет того формата, который требуется для уведомлений Android. Размер иконки в панели очень мал по сравнению с другими иконками обычного использования в нашем приложении. Вот ссылка, чтобы вы могли создавать свои маленькие значки для уведомлений. Я надеюсь, что вы найдете это полезным. Привет.

Этот инструмент позволяет создавать значки для размера, соответствующего значку уведомления вашего приложения.

Ссылка: https://www.smartherd.com/create-android-app-icons-using-image-asset-studio/

Ответ 22

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

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