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.
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)
L'utilisation de VectorXml
dans votre notification a probablement provoqué ce problème. Utilisez des png
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.
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
.
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:
res/values
trouvez le public.xml
et le ids.xml
public.xml
et ids.xml
sous res/values
dans votre code source et collez les lignes que vous venez de copierRemarque:
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.
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.
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);
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
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 ().
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).
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
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
(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.
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, utilisezTextView
ouImageView
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.
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.
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!
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.
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