web-dev-qa-db-fra.com

Comment réparer: Android.app.RemoteServiceException: Notification incorrecte postée du package *: Impossible de créer l'icône: StatusBarIcon

L'exception suivante apparaît dans les journaux d'incidents:

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 service IntentService d'un ensemble PendingIntent via AlarmManager en utilisant la méthode suivante. Toutes les valeurs transmises ici proviennent des extras de paquet 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 lorsque setSmallIcon() n'est pas appelé correctement.

J'ai vérifié et vérifié deux fois que les identifiants de ressources transmis sont tous corrects.

95
FishStix

Ce qui se passait, c’était que j’incluais la référence de l’entier à l’icône dans le bundle PendingIntent, et que cet entier était référencé ultérieurement tout en étant posté dans le NotificationManager.

Entre l'obtention de la référence au nombre entier et la suppression de l'intention en attente, l'application a été mise à jour et toutes les références pouvant être extraites ont été modifiées. Le nombre entier utilisé pour référencer le dessin correct correct fait maintenant référence au tirage incorrect ou nul (aucun du tout - provoquant ce blocage)

86
FishStix

L'utilisation de VectorXml dans votre notification a probablement provoqué ce problème. Utilisez des png

39
bubunyo

J'ai eu le même problème chaque fois que je voulais montrer une notification sur KitKat. Ce qui me pose problème, c’est que j’ai défini chaque icône au format xml (à partir de svg), ainsi que la petite icône et l’icône d’action. Après que je les ai remplacés par png-s, le problème résolu à mes côtés. 

12
bendaf

Android.app.RemoteServiceException: notification incorrecte envoyée

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

Dans mon fichier xml, j'ai ajouté une View entre les LinearLayout pour diviseur.

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

Le composant View ci-dessus créant l’exception de notification incorrecte. Cette raison d’exception n’est que le fichier xml de Remoteviews.

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

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

8
Kona Suresh

Dans mon application, ce type de bogue ne survient que lors de la mise à niveau. Si l'ID de la ressource change dans la version la plus récente, Android RemoteView pourrait ne pas trouver la ressource et jeter la RemoteServiceException. Si vous publiez une troisième version et ne modifiez pas l'ID de la ressource, les bogues peuvent disparaître seulement temporairement .

Il est possible de réduire ce type de bogues en éditant res/values/public.xml et res/values/ids.xml. Le compilateur générera un identifiant de ressource individuel s'il ne figure pas dans public.xml ou ids.xml. Lorsque vous modifiez le nom de la ressource ou ajoutez de nouvelles ressources, l'ID peut changer et certains périphériques peuvent ne pas le trouver. 

Donc, la démarche est la suivante:

  1. Décompilez le fichier apk et dans res/values trouvez le public.xml et le ids.xml
  2. Recherchez toutes les ressources liées à RemoteView dans votre application et copiez-les (chaînes, caractères, dessin, mise en page, identifiant, couleur, etc.).
  3. Créez public.xml et ids.xml sous res/values dans votre code source et collez les lignes que vous venez de copier

Remarque:

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

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

5
thundertrick

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

.setSmallIcon(R.drawable.ic_stat_Push_notif)

n'a pas été généré en conséquence. Selon le document officiel

Comme décrit dans Fournir des jeux d’icônes spécifiques à la densité et prendre en charge Plusieurs écrans, vous devez créer des icônes distinctes pour tous les généralisés densités d'écran, y compris faible, moyenne, élevée et écrans à très haute densité. Cela garantit que vos icônes s'afficheront correctement sur toute la gamme de périphériques sur lesquels votre application peut être installée.

Donc, la meilleure façon de remplir ce qui précède, j’ai utilisé Notification Generator 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 que celle-ci doit avoir un arrière-plan transparent) et laisser le générateur faire le travail pour vous en générant les différentes tailles pour les icônes de notification.

Le plus important, c’est que si le générateur d’icônes, après avoir parcouru l’image que vous allez utiliser, affiche un cercle ou un carré blanc, il ya des problèmes avec votre image, peut-être parce qu’elle n’a pas de transparence, assurez-vous que vous avez ce ok.

3
Carlos Daniel

Vous avez passé 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);
3
Tarun Umath

J'avais RemoteServiceException lorsque l'utilisation 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" />

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

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

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

1
the real napster

J'ai eu le même problème quand j'ai placé 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 () a été appelé avant setSmallIcon ().

0
Jelly

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

RemoteViews semble ne prendre en charge que les images et les textes (à confirmer par la lecture du document).

0
Benjamin Piette

Si un problème persiste: Ajoutez un fichier png dans le dossier que vous pouvez dessiner, nommé ic_stat_ic_notification (ou n’importe quel nom, par exemple)

et dans votre manifeste, ajoutez ci-dessous quelques lignes

et vous pouvez créer vos icônes ici -> https://romannurik.github.io/AndroidAssetStudio/icon

0
Jayapen Jose

J'avais RemoteServiceException lorsque j'utilisais Android.support.constraint.ConstraintLayout. Changez-le en LinearLayout ou Relative Et également sous Android: layout_height = "wrap_content" pour le conteneur

0
JustAndrew

(ce n'est pas la solution pour la question actuelle mais aide quelqu'un avec le même problème) J'ai moi aussi le même problème, mais dans mon cas, j'ai utilisé un fichier .png corrompu qui provoque le même problème Donc, je l'ai supprimé et ré-inclus le fichier .png correct.

0
RameshJanagama

Veuillez remplacer <Android.support.v7.widget.AppCompatTextView par<TextViewà partir de la présentation de notification personnalisée. 

Parce que Android.support.v7.widget.AppCompatTextView ou Android.support.v7.widget.AppCompatImageView ne fonctionne qu'au moment de l'exécution.

Donc, utilisezTextViewouImageView

0

Dans Android Studio version 3.0.0 et ultérieure, lorsque vous ajoutez une nouvelle image dans le dossier des dessins, choisissez drawable au lieu de drawable-v24.  enter image description here

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 que ce n'est pas la v24 et essayez à nouveau, cela devrait corriger l'erreur.

0
Haider Malik

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

R.drawable.your_icon

À

Android.R.drawable.some_standard_icon

Cela marche!

0
Ashwin Balani

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

RAISON: Ceci est dû au fait que nous utilisons un vecteur pouvant être dessiné pour RemoteViews et que ce dernier génère un dessin pouvant être dessiné au moment de la compilation. De plus, je ne suis pas sûr de savoir pourquoi certains appareils ne sont pas en mesure de détecter l'identifiant des ressources pouvant être extraites généré pendant la mise à niveau de l'application. Mais oui c'était la raison.

REPRODUIT Étapes 1. Installez la version précédente . 2. Envoyer une notification 3. Mettez à jour la construction avec le code de la prochaine version 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.

0
Gajju

Moi aussi j'ai eu le même problème. Le problème est avec l'icône que vous utilisez, j'utilisais Android.R.drawable.stat_sys_download. Allez dans drawables.xml et collez-le.

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

et ensuite dans votre code

builder.setSmallIcon(R.drawable.ic_start_download);

Vous pouvez essayer une autre image au lieu de cette image

0