Як виправити: android.app.RemoteServiceException: Неправильне повідомлення, розміщене з пакету *: Не вдалося створити піктограму: StatusBarIcon


127

У журналах збоїв я бачу такий виняток:

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
затемнення

Хлопці, яким чином я можу вирішити цю проблему. Я використовую pngs, але дуже рідко виходить з ладу додаток
user7856586

Відповіді:


98

Що відбувалося, я включав ціле посилання на піктограму в пакеті PendingIntent, і це ціле число пізніше було посилається під час публікації в NotificationManager.

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


8
Химерність. Іншими словами, це не можна виправити? Я бачу ті самі збої в моєму додатку.
Маттіас

Це не здається виправним. Мені в майбутньому доведеться придумати інший спосіб, як піти про розміщення сповіщень із зображеннями в майбутньому ....
FishStix

Що робити, якщо ми спробуємо встановити textSize віддаленого перегляду як ret.setInt (id, "setTextSize", 20); Він також розбивається. Я знаю, що ми також повинні забезпечити підрозділи, але як це зробити з таким підписом методу. Будь-який вказівник ??
bitsabhi

1
Чи можна видалити сповіщення та оновити все, що пов’язано з програмою? (Якщо припустити, що додаток уникне проблеми)
NoHarmDan

3
У випадку, якщо ви хочете посилатися на R.dravable.my_image, безпечніше зберегти його в пакеті як рядок ( bundle.putString("img", "my_image")а потім перетворити при необхідності в фактичне ціле число @DravableRes таким чином:ctx.resources.getIdentifier(bundle.getString("img"), "drawable", ctx.packageName)
vanomart

52

VectorXmlВідомо, що використання всередині вашого сповіщення спричинило цю проблему. Використовуйте PNG


4
Використовувались лише PNG.
FishStix

У моєму випадку я мав вектор у drawableпапці та png у drawable-hdpi, xhdpiтощо. Але png для цього не було drawable-mdpi, і він вийшов з ладу на пристрої MDPI при публікації повідомлення.
Вадим Котов

34

Не використовуйте SVG на Kitkat!

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


4
Я можу підтвердити. Векторний малюнок в сповіщеннях викликає віддалене обслуговування на KitKat.
Хижний Андрій

2
У випадку з KitKat проблему було вирішено, коли я замінив XML на PNG в: нове NotificationCompat.Builder (контекст, CHANNEL_ID) .setSmallIcon (R.dravable.my_icon)
Ендрю Глухофф

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.

Після видалення компонента «Перегляд» мій код виконано належним чином без будь-яких винятків. Тож я відчув, що трафік повідомлень не приймає будь-яких налаштованих поглядів.

Таким чином, ви не малюєте будь-яку річ, як описано вище у файлі .xml RemoteView.


9

Моя проблема полягала в тому, що піктограма, якою я користувався

.setSmallIcon(R.drawable.ic_stat_push_notif)

не було створено відповідно. Згідно з офіційним документом :

Як описано в Наданні наборів значків, орієнтованих на щільність, та підтриманні декількох екранів, вам слід створити окремі піктограми для всіх узагальнених щільності екрана, включаючи екрани низької, середньої, високої та надвисокої щільності. Це гарантує, що ваші піктограми будуть відображатися належним чином у різних пристроях, на яких можна встановити вашу програму.

Тож найкращим способом заповнити вищесказане я використав Генератор сповіщень, наданий Романом Нуриком на https://romannurik.github.io/AndroidAssetStudio/index.html

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

Найголовніше те, що якщо генератор значків після перегляду зображення, яке ви будете використовувати, показує вам заповнене білим колом або квадратом, виникають проблеми з вашим зображенням, можливо, тому, що на ньому немає прозорості, тому переконайтеся, що у вас це нормально.


2
У моєму випадку я мав вектор у drawableпапці та png у drawable-hdpi, xhdpiтощо. Але png для цього не було 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, у своєму додатку та скопіюйте їх (рядки, розмір, графічний малюнок, макет, 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)
            }
        }
    }
}

Примітка: Цей скрипт не підтримує проект підмодулів. Я намагаюся це виправити.


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, коли повідомлення про використання в моєму класі поширюється від 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).


ці метадані потрібно додати всередині тегів <service </service>?
Андрій

2

В Android Studio версії 3.0.0 і вище, додаючи нове зображення в папку «Малюнки», вибирайте параметр «Мальований», а не «Dravable-v24».введіть тут опис зображення

Якщо зображення, яке ви використовуєте, alread a (v24), просто скопіюйте його та вставте його в той самий каталог (наприклад, малюнки). Цього разу він запитає, який регулярний або v24 - просто переконайтеся, що це не v24, і спробуйте його знову, це повинно виправити помилку.


Зауважте - якщо ви переглядаєте "Android", переключіть його на перегляд "Проект". В перегляді Android ви не можете побачити каталог
vwages

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.dravable.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 або Relactive, а також 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

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

Я сподіваюсь, що вам все допоможе. Це працює для мене


0

Я отримав цю помилку через автоматичну посилання та посилання Параметри натискання в перегляді тексту в режимі перегляду повідомлень:

<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.