web-dev-qa-db-fra.com

Android NotificationManager me donnant une erreur "pas de petite icône valide"

J'ai une étrange erreur avec le gestionnaire de notifications.

@Override
public void onMessageReceived(String from, Bundle data)
{
     Log.i(TAG, "IP : " + (String) data.get("ip"));
     NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
     Intent acceptNextIntent = new Intent(MainActivity.BROADCAST_KEY_ACCEPT);
//        acceptNextIntent.putExtra("ip", (String) data.get("blah")); //add stuff here
     PendingIntent acceptNextPendingIntent = PendingIntent.getBroadcast(this, 0, acceptNextIntent, 0);

     Intent declineNextIntent = new Intent(MainActivity.BROADCAST_KEY_DECLINE);
     PendingIntent declineNextPendingIntent = PendingIntent.getBroadcast(this, 0, declineNextIntent, 0);

     NotificationCompat.Action acceptAction = new NotificationCompat.Action
                .Builder(R.drawable.common_signin_btn_icon_disabled_focus_light, "Grant Request", acceptNextPendingIntent).build();

     NotificationCompat.Action declineAction = new NotificationCompat.Action
                .Builder(R.drawable.common_signin_btn_icon_focus_dark, "Decline Request", declineNextPendingIntent).build();

     NotificationCompat.Builder notification = new NotificationCompat.Builder(this)
                .setContentTitle("New Password Request From " + (String) data.get("ip"))
                .addAction(acceptAction)
                .addAction(declineAction);

     notificationManager.notify(1, notification.build()); //ERROR HERE

Message d'erreur:

9.474 9327-9371/com.inh.amnesia_application I/MyGcmListenerService: IP : 128.239.213.39
11-10 19:49:59.477 9327-9371/com.inh.amnesia_application E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
11-10 19:49:59.477 9327-9371/com.inh.amnesia_application E/AndroidRuntime: Process: com.inh.amnesia_application, PID: 9327
11-10 19:49:59.477 9327-9371/com.inh.amnesia_application E/AndroidRuntime: Java.lang.IllegalArgumentException: Invalid notification (no valid small icon): Notification(pri=0 contentView=com.inh.amnesia_application/0x1090085 vibrate=null sound=null defaults=0x0 flags=0x0 color=0x00000000 actions=2 vis=PRIVATE)
11-10 19:49:59.477 9327-9371/com.inh.amnesia_application E/AndroidRuntime:     at Android.app.NotificationManager.notify(NotificationManager.Java:222)
11-10 19:49:59.477 9327-9371/com.inh.amnesia_application E/AndroidRuntime:     at Android.app.NotificationManager.notify(NotificationManager.Java:194)
11-10 19:49:59.477 9327-9371/com.inh.amnesia_application E/AndroidRuntime:     at com.inh.amnesia_application.MyGcmListenerService.onMessageReceived(MyGcmListenerService.Java:65)
11-10 19:49:59.477 9327-9371/com.inh.amnesia_application E/AndroidRuntime:     at com.google.Android.gms.gcm.GcmListenerService.zzt(Unknown Source)
11-10 19:49:59.477 9327-9371/com.inh.amnesia_application E/AndroidRuntime:     at com.google.Android.gms.gcm.GcmListenerService.zzk(Unknown Source)
11-10 19:49:59.477 9327-9371/com.inh.amnesia_application E/AndroidRuntime:     at com.google.Android.gms.gcm.GcmListenerService.zza(Unknown Source)
11-10 19:49:59.477 9327-9371/com.inh.amnesia_application E/AndroidRuntime:     at com.google.Android.gms.gcm.GcmListenerService$1.run(Unknown Source)
11-10 19:49:59.477 9327-9371/com.inh.amnesia_application E/AndroidRuntime:     at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1113)
11-10 19:49:59.477 9327-9371/com.inh.amnesia_application E/AndroidRuntime:     at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:588)
11-10 19:49:59.477 9327-9371/com.inh.amnesia_application E/AndroidRuntime:     at Java.lang.Thread.run(Thread.Java:818)

Est-ce à dire que les icônes auxquelles j'essaie d'accéder n'existent pas? Je ne sais pas comment interpréter cette erreur et la recherche de ce message d'erreur ne donne rien.

24
mrQWERTY

En fait, vous ne définissez pas d'icône pour la notification Push. Ajoutez .setSmallIcon(R.drawable.your_icon) à votre notification.

 NotificationCompat.Builder notification = new NotificationCompat.Builder(this)
            .setContentTitle("New Password Request From " + (String) data.get("ip"))
            .setSmallIcon(R.drawable.your_icon)
            .addAction(acceptAction)
            .addAction(declineAction);
29
dabo248

Vous n'avez pas appelé setSmallIcon() sur le NotificationCompat.Builder . Cela fournit l'icône qui ira dans la barre d'état pendant que Notification est actif.

7
CommonsWare

Selon le Android NotificationManager Code source

if (mContext.getApplicationInfo().targetSdkVersion > Build.VERSION_CODES.Lollipop_MR1) {
    if (notification.getSmallIcon() == null) {
        throw new IllegalArgumentException("Invalid notification (no valid small icon): "
                + notification);
    }
}

Cette erreur ne s'est produite que lorsque vous définissez l'API cible> Lollipop_MR1 (22) et que la notification n'a pas de petite icône.

6
einverne

Cela a soudainement commencé à arriver à ma demande. Après quelques recherches, j'ai trouvé que ce changement dans mon fichier manifeste commençait réellement à le provoquer.

de:

  <uses-sdk Android:minSdkVersion="21" />

à:

  <uses-sdk Android:minSdkVersion="21" Android:targetSdkVersion="28" />

J'ai vu quelque part que quelqu'un a noté qu'il ne vérifie l'icône que si la version cible du SDK est définie. Effectivement, dans la source, il y a ceci:

if (mContext.getApplicationInfo().targetSdkVersion > Build.VERSION_CODES.Lollipop_MR1) {
    if (notification.getSmallIcon() == null) {
        throw new IllegalArgumentException("Invalid notification (no valid small icon): "
                + notification);
    }
}

Heureusement, la solution était simple, il suffit de définir l'icône dans le manifeste:

  <application Android:label="MyApp" Android:icon="@mipmap/icon" >
0
Jahmic