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

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

17 84

17 ответов:

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

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

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

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

android.приложение.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.

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

так что вы не рисуете ничего подобного выше Вид в .xml-файл

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

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

таким образом, шаг выглядит следующим образом:

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

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

у вас есть пройти же значок

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

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

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

У меня было RemoteServiceException при использовании уведомления в моем классе распространяется от FirebaseMessagingService. Я добавил следующий код в AndroidManifest.XML-код:

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

и ресурс ic_small, установленный в экземпляре уведомления класса.Конструктор по методу setSmallIcon (int icon).

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

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

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

у меня тоже была такая же проблема. Проблема в том, что значок, который вы используете, я использовал android.R. drawable.stat_sys_download. Перейти к чертежам.xml и вставьте это.

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

а потом в коде

builder.setSmallIcon(R.drawable.ic_start_download);

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

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

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

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

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

.setSmallIcon(R.drawable.ic_stat_push_notif)

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

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

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

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

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

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

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

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

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

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

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

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

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