it-swarm.com.ru

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

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

95
FishStix

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

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

86
FishStix

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

39
bubunyo

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

12
bendaf

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

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

8
Kona Suresh

В моем приложении такая ошибка возникает только во время обновления. Если идентификатор ресурса меняется в более новой версии, 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)
            }
        }
    }
}

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

5
thundertrick

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

.setSmallIcon(R.drawable.ic_stat_Push_notif)

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

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

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

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

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

3
Carlos Daniel

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

     <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);
3
Tarun Umath

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

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

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

1
the real napster

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

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

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

0
Jelly

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

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

0
Benjamin Piette

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

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

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

0
Jayapen Jose

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

0
JustAndrew

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

0
RameshJanagama

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

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

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

0
Ahamadullah Saikat

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

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

0
Haider Malik

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

R.drawable.your_icon

К

Android.R.drawable.some_standard_icon

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

0
Ashwin Balani

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

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

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

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

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

0
Gajju

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