Comment réparer: android.app.RemoteServiceException: Mauvaise notification publiée à partir du package *: Impossible de créer l'icône: StatusBarIcon


127

Je vois l'exception suivante dans les journaux de crash:

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)

Je publie ma notification d'un IntentService à partir d'un PendingIntent défini via AlarmManager en utilisant la méthode suivante. Toutes les valeurs transmises ici proviennent des extras du bundle dans 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());
}

D'après ce que j'ai vu d'autres réponses - l'exception que je vois se produit quand elle setSmallIcon()n'est pas appelée correctement.

J'ai vérifié et vérifié que les ID de ressource transmis sont tous corrects.


3
Je rencontre la même erreur (rapports d'erreur d'une application en direct). Je ne peux pas le reproduire sur mon appareil. Je pense actuellement que c'est parce que les gens ont modifié le .apk
assombrir le

Les gars, comment puis-je résoudre ce problème. J'utilise des fichiers png, mais très rarement l'application plante
user7856586

Réponses:


98

Ce qui se passait, c'est que j'incluais la référence entière à l'icône dans le bundle PendingIntent, et cet entier a ensuite été référencé lors de sa publication dans le NotificationManager.

Entre l'obtention de la référence entière et le déclenchement de l'intention en attente, l'application a été mise à jour et toutes les références pouvant être dessinées ont été modifiées. L'entier qui faisait référence au dessinable correct faisait désormais référence au dessinable incorrect ou nul du tout (aucun du tout - provoquant ce plantage)


8
Bizarre. En d'autres termes, ce n'est pas réparable, n'est-ce pas? Je vois les mêmes plantages dans mon application.
Matthias

Cela ne semble pas réparable. Je devrai, à l'avenir, concevoir une manière différente de publier des notifications avec des images à l'avenir ....
FishStix

Que faire si nous essayons de définir le textSize de la vue distante comme ret.setInt (id, "setTextSize", 20); Il plante également. Je sais que nous devons également fournir les unités, mais comment faire cela avec une telle signature de méthode. Un pointeur ??
bitsabhi

1
Serait-il possible d'effacer la notification et tout ce qui est lié lorsque l'application est tuée pour être mise à jour? (En supposant que cela permettrait à l'application d'éviter le problème)
NoHarmDan

3
Si vous souhaitez référencer R.drawable.my_image, il est plus sûr de l'enregistrer pour le regrouper sous forme de chaîne ( bundle.putString("img", "my_image")puis de le convertir si nécessaire en entier @DrawableRes réel comme suit:ctx.resources.getIdentifier(bundle.getString("img"), "drawable", ctx.packageName)
vanomart

52

L'utilisation à l' VectorXmlintérieur de votre notification est connue pour causer ce problème. Utiliser les png


4
Seuls des PNG étaient utilisés.
FishStix

Dans mon cas, j'avais vecteur dans le drawabledossier et png dans drawable-hdpi, xhdpietc. Mais il n'y avait pas .png pour drawable-mdpi, et se sont écrasés sur IPSM dispositif affichant une notification.
Vadim Kotov

34

N'utilisez pas SVG sur Kitkat!

J'ai eu le même problème à chaque fois que je voulais afficher une notification sur Kitkat. Ce qui a causé le problème pour moi, c'est que j'ai défini chaque icône en xml (à partir de svg), la petite icône et l'icône d'action également. Après les avoir remplacés par png-s, le problème s'est résolu à mes côtés.


4
Je peux confirmer. Les dessins vectoriels dans les notifications provoquent RemoteServiceException sur KitKat.
Khizhny Andrey

2
Dans le cas de KitKat, le problème a été résolu lorsque j'ai remplacé le XML par PNG dans: new NotificationCompat.Builder (context, CHANNEL_ID) .setSmallIcon (R.drawable.my_icon)
Andrew Glukhoff

1
Cela a fonctionné pour moi. J'exécutais l'API 19 et utilisais un fichier SVG pour l'icône de notification et me
donnais

10

android.app.RemoteServiceException: mauvaise notification publiée

J'ai eu le même problème, mais j'ai été résolu. Mon problème est "fichier .xml" de la vue à distance.

Dans mon fichier xml, j'ai été ajouté un Viewentre le LinearLayoutdiviseur for.

<View
    android:layout_width="match_parent"
    android:layout_height="1dp"
    android:id="@+id/view"
    android:background="#000000" />

Le Viewcomposant ci-dessus créant l'exception de notification incorrecte. Cette raison d'exception est uniquement un fichier xml de Remoteviews.

Après avoir supprimé ce composant View, Mon code s'est exécuté correctement, sans aucune exception. J'ai donc senti que le tiroir de notification n'acceptait aucune vue personnalisée.

Donc, vous ne dessinez rien comme la vue ci-dessus dans le fichier .xml de l' RemoteViewobjet.


9

Mon problème était que l'icône que j'utilisais

.setSmallIcon(R.drawable.ic_stat_push_notif)

n'a pas été généré en conséquence. Selon la doc officielle :

Comme décrit dans Fourniture de jeux d'icônes spécifiques à la densité et Prise en charge de plusieurs écrans, vous devez créer des icônes distinctes pour toutes les densités d'écran généralisées, y compris les écrans à faible, moyenne, haute et très haute densité. Cela garantit que vos icônes s'affichent correctement sur toute la gamme d'appareils sur lesquels votre application peut être installée.

Donc, la meilleure façon de remplir ce qui précède, j'ai utilisé le générateur de notifications fourni par Roman Nurik sur https://romannurik.github.io/AndroidAssetStudio/index.html

De cette façon, vous pouvez utiliser une image (en tenant compte du fait qu'elle doit avoir un arrière-plan transparent) et laisser le générateur faire le travail à votre place en générant les différentes tailles pour les icônes de notification.

La chose la plus importante est que si le générateur d'icônes après avoir parcouru l'image que vous allez utiliser vous montre un cercle ou un carré rempli de blanc, il y a des problèmes avec votre image, peut-être parce qu'elle n'a pas de transparents, alors assurez-vous que vous avez ça ok.


2
Dans mon cas, j'avais vecteur dans le drawabledossier et png dans drawable-hdpi, xhdpietc. Mais il n'y avait pas .png pour drawable-mdpi, et se sont écrasés sur IPSM dispositif affichant une notification.
Vadim Kotov

7

Dans mon application, ce type de bogue se produit uniquement lors de la mise à niveau. Si l'ID de ressource change dans la version la plus récente, Android RemoteViewpeut ne pas trouver la ressource et supprimer le fichier RemoteServiceException. Si vous publiez une 3ème version et ne modifiez pas l'ID de la ressource, les bogues peuvent ne disparaître que temporairement .

Il est possible de réduire ce genre de bugs en éditant res/values/public.xmlet res/values/ids.xml. Le compilateur générera un identifiant de ressource individuel si l'identifiant de ressource n'est pas dans public.xmlou ids.xml. Lorsque vous modifiez le nom de la ressource ou ajoutez de nouvelles ressources, l'identifiant peut changer et certains appareils peuvent ne pas le trouver.

Donc, l'étape est la suivante:

  1. Décompilez le fichier apk et res/valuesrecherchez le public.xmletids.xml
  2. Retrouvez toutes les ressources liées à RemoteView dans votre application et copiez-les (chaînes, dimen, dessinable, mise en page, id, couleur ...)
  3. Créez public.xmlet ids.xmlsous res/valuesdans votre code source et collez les lignes que vous venez de copier

Remarque:

Gradle 1.3.0 et supérieur ignorent le local public.xml. Pour que cela fonctionne, vous devez ajouter un script dans votrebuild.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)
            }
        }
    }
}

Remarque: ce script ne prend pas en charge le projet de sous-modules. J'essaye de le réparer.


3

Vous avez passé la même icône

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

et vous notification

 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
J'ai passé l'image vectorielle comme ressource et je pense que cela a provoqué des plantages sur les appareils oneplus / android 6. Pas sûr à 100%.
Alexey

3

Juste au cas où l'icône n'est pas importante, vous pouvez la remplacer,

R.drawable.your_icon

À

android.R.drawable.some_standard_icon

Cela marche!


2

J'avais RemoteServiceException lorsque l'utilisation de la notification dans ma classe s'étend de FirebaseMessagingService. J'ai ajouté le code suivant à AndroidManifest.xml:

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

Également la ressource ic_small définie dans l'instance d'une classe Notification.Builder par la méthode setSmallIcon (icône int).


ces métadonnées doivent être ajoutées dans les balises <service </service>?
Andrey

2

Dans Android Studio version 3.0.0 et supérieure, lors de l'ajout d'une nouvelle image dans le dossier drawables, choisissez drawable au lieu de drawable-v24.entrez la description de l'image ici

Si l'image que vous utilisez est déjà lue (v24), copiez-la et collez-la dans le même répertoire (par exemple, drawables). Cette fois, il vous demandera quelle version régulière ou v24 - assurez-vous simplement que ce n'est pas la v24 et réessayez, cela devrait corriger l'erreur.


Remarque - si vous êtes en vue "Android", passez en vue "Projet". Dans la vue Android, vous pouvez ne pas voir le répertoire drawables v24
Hatzil

2

Le même problème est arrivé avec moi aussi et j'ai résolu le même

RAISON : Cela se produit parce que nous utilisons des vecteurs dessinables pour RemoteViews et que les vecteurs dessinables génèrent des dessinables au moment de la compilation. De plus, je ne sais pas pourquoi certains appareils ne sont pas en mesure de détecter l'ID de ressources dessinables généré pendant que nous augmentons l'application. Mais oui, c'était la raison.

REPRODUIRE Étapes 1. Installez la version précédente. 2. Envoyez une notification 3. Mettez à jour la version avec le code de version suivant 4. Après la mise à jour de l'application, n'ouvrez pas l'application et n'envoyez pas de notification à nouveau

SOLUTION Remplacez le vecteur dessinable par un fichier dessinable normal (.png ou .jpg).

J'espère que cela résout le problème.


1

Si vous avez une notification visible pendant que votre application est mise à jour, vous risquez de rencontrer cela. Ce que vous devrez peut-être faire est de créer un BroadcastReceiver qui attend un message PACKAGE_CHANGED, à quel point vous arrêtez tous vos services, ce qui rejettera également les notifications associées.

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

0

J'ai eu le même problème lorsque j'ai défini une notification dans un paquet. J'ai essayé ceci et cela a résolu mon problème:

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

Assurez-vous que setLargeIcon () est appelé avant setSmallIcon ().


4
Pourquoi cela devrait-il aider?
limitium

0

J'ai aussi eu le même problème. Le problème vient de l'icône que vous utilisez, j'utilisais android.R.drawable.stat_sys_download. Accédez à drawables.xml et collez-le.

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

puis dans ton code

builder.setSmallIcon(R.drawable.ic_start_download);

Vous pouvez essayer une autre image au lieu de cette image


0

Ma façon de résoudre ceci: j'avais de «mauvaises» vues dans ma mise en page (ex: une case à cocher) - donc je les ai supprimées.

RemoteViews semble ne prendre en charge que les images et les textes (à confirmer en lisant le document).


0

J'ai eu RemoteServiceException lorsque j'utilise android.support.constraint.ConstraintLayout. Changez-le en LinearLayout ou Relative et aussi android: layout_height = "wrap_content" pour le conteneur


0

(ce n'est pas une solution pour la question actuelle mais aide quelqu'un avec un problème de base similaire) J'ai aussi eu le même problème, mais dans mon cas, j'ai utilisé un fichier .png corrompu qui cause le même problème. Je l'ai donc supprimé et réintégré le fichier .png correct.


0

Veuillez remplacer <android.support.v7.widget.AppCompatTextViewpar <TextViewde la mise en page de notification personnalisée.

Parce que android.support.v7.widget.AppCompatTextViewou android.support.v7.widget.AppCompatImageViewne fonctionne qu'au moment de l'exécution.

Alors utilisez TextViewouImageView



0

Synchronisez le projet et ensuite Nettoyez-le, Fichier> Synchroniser puis: Construire> Nettoyer le projet

J'espère que cela vous aidera tous, c'est du travail pour moi


0

J'ai eu cette erreur en raison des options de liaison automatique et de liens cliquables dans la vue de texte dans la vue de notification:

<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" />

Faites attention!


-3

Cela a fonctionné pour moi. Commentez la référence de l'icône et ainsi pouvoir utiliser le NotificationCompat.Builder sans problème.

    $msg_notificacion = [
                        'title'         => "titulonotif",
                       // "icon" : "myicon",
                        'body'          =>"cuerponotif"
                    ];
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.