Notifiche push Android: icona non visualizzata nella notifica, invece viene visualizzato un quadrato bianco


179

La mia app genera una notifica, ma l'icona che ho impostato per quella notifica non viene visualizzata. Invece ottengo un quadrato bianco.

Ho provato a ridimensionare il png dell'icona (dimensioni 720x720, 66x66, 44x44, 22x22). Curiosamente, quando si usano dimensioni più piccole, il quadrato bianco è più piccolo.

Ho cercato su Google questo problema, così come il modo corretto di generare notifiche, e da quello che ho letto il mio codice dovrebbe essere corretto. Purtroppo le cose non vanno come dovrebbero essere.

Il mio telefono è un Nexus 5 con Android 5.1.1. Il problema è presente anche sugli emulatori, un Samsung Galaxy s4 con Android 5.0.1 e un Motorola Moto G con Android 5.0.1 (entrambi presi in prestito e non ho subito)

Segue il codice per le notifiche e due schermate. Se hai bisogno di ulteriori informazioni, non esitare a richiederlo.

Grazie a tutti.

@SuppressLint("NewApi") private void sendNotification(String msg, String title, String link, Bundle bundle) {
    NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    Intent resultIntent = new Intent(getApplicationContext(), MainActivity.class);
    resultIntent.putExtras(bundle);
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
            resultIntent, Intent.FLAG_ACTIVITY_NEW_TASK);
    Notification notification;
    Uri sound = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.notificationsound);
    notification = new Notification.Builder(this)
                .setSmallIcon(R.drawable.lg_logo)
                .setContentTitle(title)
                .setStyle(new Notification.BigTextStyle().bigText(msg))
                .setAutoCancel(true)
                .setContentText(msg)
                .setContentIntent(contentIntent)
                .setSound(sound)
                .build();
    notificationManager.notify(0, notification);
}

senza aprire la notifica notifiche aperte




hai risolto questo problema? sto ancora affrontando lo stesso problema, nella barra di stato in alto ancora mostrando lo spazio bianco per la notifica se aggiungo l'immagine trasparente
AngelJanniee

Sì, l'ho risolto creando un'icona trasparente o prendendo di mira l'SDK versione 20 o precedente. Se questo non lo risolve, forse il tuo problema simile ha una causa diversa. Suggerisco di impostare la versione dell'SDK di destinazione su 20 e di verificare se ciò cambia qualcosa. In caso contrario, non sono sicuro che questa domanda possa aiutarti :(
Blueriver,

Risposte:


188

Causa: per 5.0 Lollipop "Le icone di notifica devono essere completamente bianche".

Se risolviamo il problema dell'icona bianca impostando l'SDK di destinazione su 20, la nostra app non indirizzerà Android Lollipop, il che significa che non possiamo utilizzare le funzionalità specifiche di Lollipop.

Soluzione per target Sdk 21

Se si desidera supportare le icone dei materiali di Lollipop, creare icone trasparenti per Lollipop e versioni precedenti. Si prega di fare riferimento a quanto segue: https://design.google.com/icons/

Guarda http://developer.android.com/design/style/iconography.html e vedremo che lo stile bianco è il modo in cui le notifiche devono essere visualizzate in Android Lollipop.

In Lollipop, Google suggerisce anche di utilizzare un colore che verrà visualizzato dietro l'icona di notifica bianca. Link di riferimento: https://developer.android.com/about/versions/android-5.0-changes.html

Ovunque vogliamo aggiungere colori https://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html#setColor(int)

L'implementazione di Notification Builder per la versione del sistema operativo Lollipop precedente e successiva sarebbe:

Notification notification = new NotificationCompat.Builder(this);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    notification.setSmallIcon(R.drawable.icon_transperent);
    notification.setColor(getResources().getColor(R.color.notification_color));
} else { 
    notification.setSmallIcon(R.drawable.icon);
} 

Nota: setColor è disponibile solo in Lollipop e ha effetto solo sullo sfondo dell'icona.

Risolverà completamente il tuo problema !!


Wow grazie. Ho pensato che DOVREBBERO essere interamente bianchi, dal momento che alcune app che ho sul telefono hanno icone a colori. Ora vedo il motivo. Grazie!
Blueriver,

3
Dicendo targetSdkVersion 20 , mi hai salvato la giornata! molte grazie.
Arshad Ali,

11
È una forma errata per impostare la versione targetSDK su <21 solo per motivi di icone. Il suo meglio per risolvere il problema nel modo giusto, come descritto in questa risposta: stackoverflow.com/questions/27343202/...
user90766

1
ma in background quando l'app non è nello stack mostra le icone bianche, cosa fare per ottenere lo stesso risultato in ogni caso
Pratik Vyas

1
Ho provato di tutto ma non funziona. mostra ancora un punto con una menzione colorata nel file manifest
Harsh Shah,

67

Se stai utilizzando Google Cloud Messaging, questo problema non sarà risolto semplicemente cambiando la tua icona. Ad esempio, questo non funzionerà:

 Notification notification  = new Notification.Builder(this)
                .setContentTitle(title)
                .setContentText(text)
                .setSmallIcon(R.drawable.ic_notification)
                .setContentIntent(pIntent)
                .setDefaults(Notification.DEFAULT_SOUND|Notification.DEFAULT_LIGHTS|Notification.DEFAULT_VIBRATE)
                .setAutoCancel(true)
                .build();

Anche se ic_notification è trasparente e bianco. Deve anche essere definito nei metadati Manifest, in questo modo:

  <meta-data android:name="com.google.firebase.messaging.default_notification_icon"

            android:resource="@drawable/ic_notification" />

I metadati vanno sotto il applicationtag, per riferimento.


6
Grazie mille per il suggerimento con i metadati all'interno del manifest.
Eugen Timm,

come si posiziona "@ drawable / ic_notification"? è un'icona? molti? è PNG?
Luke Pighetti,

1
@LukePighetti può essere molti se stai caricando immagini di dimensioni diverse per risoluzioni dello schermo multiple. Altrimenti, sì, potrebbe trattarsi di un file PNG nella directory di disegno.
Ruchir Baronia,

1
@RuchirBaronia quindi per l'esempio sopra res/drawable/ic_notification.pngdelle dimensioni 196x196?
Luke Pighetti,

thx @RuchirBaronia, votato per il Meta-datasuggerimento tag.
Ravi Vaniya,

37

Consiglio vivamente di seguire le Linee guida per la progettazione di Google :

che dice "Le icone di notifica devono essere completamente bianche".


2
La tua risposta è persino migliore di quella che ho accettato. Vorrei poter accettare anche il tuo. Non posso, ma hai il mio +1 e la mia gratitudine. Saluti!
Blueriver,

2
Questa non è un'ottima risposta. E se, le parti interessate del progetto dovessero rivolgersi ad Android 7? Non posso semplicemente scegliere come target qualsiasi versione dell'SDK prima di quella.
Neon Warge

1
È stata annullata la votazione della risposta perché è errata. L'interrogante afferma che non sono in grado di eseguire la mia app su sdk21. La risposta dice "non usare sdk 21"
Utsav Gupta,

1
Questa non è davvero una soluzione.
Jose Gómez,

1
Non riesco a trovare nulla nelle attuali linee guida di progettazione che specifichino che l'icona deve essere bianca su uno sfondo trasparente. Indipendentemente dalla scarsa documentazione, sembra ancora essere il caso.
imagio

29

Dichiara questo codice in Android Manifest:

<meta-data android:name="com.google.firebase.messaging.default_notification_icon" 

android:resource="@drawable/ic_stat_name" />

Spero che questo ti sia utile.


Oh mio! Questo funziona perfettamente per le notifiche push FCM! Grazie
Crono,

1
Dove stai posizionando ic_stat_name? È un png? sono molti? per favore aiuto!
Luke Pighetti,

3
@Luke Pighetti In Android Studio Fai clic destro sull'app >> Nuovo >> Risorse immagine >> IconType (Notifica)
vicky mahale

1
(So ​​che è passato un po 'di tempo, ma potresti spiegarlo per favore? Cosa dovrebbe fare? Rende l'icona non trasparente a colori o cosa?
AFE

Questa è la risposta corretta per le notifiche di messaggistica cloud Firebase.
Greg Ellis,

11

(Android Studio 3.5) Se sei una versione recente di Android Studio, puoi generare le tue immagini di notifica. Fare clic con il tasto destro sulla cartella res > Nuovo> Asset immagine . Vedrai quindi Configura risorse immagine come mostrato nell'immagine seguente. Cambia il tipo di icona in icone di notifica . Le tue immagini devono essere bianche e trasparenti. Questo Configura risorse immagine quella regola. Importante: se si desidera utilizzare le icone per le notifiche cloud / push, è necessario aggiungere i metadati sotto il tag dell'applicazione per utilizzare le icone di notifica appena create.Configura risorse immagine

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

10

Possiamo fare come di seguito:

Crea un nuovo oggetto del generatore di notifiche e chiama setSmallIcon() utilizzando l'oggetto del generatore di notifiche come nel codice seguente.

Crea un metodo in cui verificheremo quale versione del sistema operativo stiamo installando la nostra app. Se è al di sotto di Lolipop, ovvero API 21, allora prenderà la normale icona dell'app con il colore di sfondo, altrimenti prenderà l'icona trasparente dell'app senza sfondo. Quindi i dispositivi che usano la versione os> = 21 imposteranno il colore di sfondo dell'icona usando il metodo setColor()della classe del builder Notification.

Codice di esempio:

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);

notificationBuilder.setSmallIcon(getNotificationIcon(notificationBuilder));

private int getNotificationIcon(NotificationCompat.Builder notificationBuilder) {

   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
             int color = 0x008000;
             notificationBuilder.setColor(color);
             return R.drawable.app_icon_lolipop_above;

    } 
    return R.drawable.app_icon_lolipop_below;
}

Ho testato setColorsu Kitkat (API 19) e IceCreamSandwich (API 15), in entrambi i casi ha ignorato il colore ma non si è bloccato . Quindi posso tranquillamente omettere di controllare la versione del sistema operativo?
Maria,

10

Prova questo

stavo affrontando lo stesso problema, ho provato molte risposte ma non ho trovato alcuna soluzione, finalmente ho trovato il modo di risolvere il mio problema.

- crea un'icona di notifica con sfondo trasparente. La larghezza e l'altezza dell'app devono essere simili alle dimensioni seguenti e incollale tutte nel tuo progetto-> app-> src-> main-> res

  • MDPI 24 * 24

  • HDPI 36 * 36

  • XHDPI 48 * 48

  • XXHDPI 72 * 72


dopo quanto sopra incollare questa riga sotto nel metodo onMessageReceived


Intent intent = new Intent(this, News.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
                    PendingIntent.FLAG_ONE_SHOT);
            Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);
            if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
            {
                notificationBuilder.setSmallIcon(R.drawable.notify)
                                      //            .setContentTitle(title)
                            //                        .setContentText(message)
                        .setAutoCancel(true)
                        .setSound(defaultSoundUri)
                        .setContentIntent(pendingIntent);
            } else
                {
                    notificationBuilder.setSmallIcon(R.drawable.notify)
                       //                                .setContentTitle(title)
                        //                        .setContentText(message)
                            .setAutoCancel(true)
                            .setSound(defaultSoundUri)
                            .setContentIntent(pendingIntent);
            }
            NotificationManager notificationManager =
                    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            notificationManager.notify(0, notificationBuilder.build());

Non dimenticare di aggiungere questo codice nel file manifest

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

10
 <meta-data android:name="com.google.firebase.messaging.default_notification_icon"

        android:resource="@drawable/ic_notification" />

aggiungere questa riga nel file manifest.xml nel blocco applicazione


7

Se vuoi fornire l'icona di notifica del supporto per lecca-lecca, crea un'icona di notifica di due tipi:

  1. icona di notifica normale: per la versione lecca-lecca sotto.
  2. icona di notifica con sfondo trasparente: per lecca-lecca e versione precedente.

Ora imposta l'icona appropriata sul generatore di notifiche in fase di esecuzione sulla versione del sistema operativo:

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    mBuilder.setSmallIcon(R.drawable.ic_push_notification_transperent);
} else {
    mBuilder.setSmallIcon(R.drawable.ic_push_notification);
}

7

Finalmente ho la soluzione per questo problema.

Questo problema si verifica solo quando l'app non è affatto in esecuzione. (né sullo sfondo né in primo piano) . Quando l' app viene eseguita in primo piano o in background, l'icona di notifica viene visualizzata correttamente (non il quadrato bianco)

Quindi, ciò che dobbiamo impostare è la stessa configurazione per l'icona di notifica nelle API di backend di Frontend.

Nel frontend abbiamo usato React Native e per la notifica push abbiamo usato il pacchetto rea-native-fcm npm .

FCM.on("notification", notif => {
   FCM.presentLocalNotification({
       body: notif.fcm.body,
       title: notif.fcm.title,
       big_text: notif.fcm.body,
       priority: "high",
       large_icon: "notification_icon", // notification icon
       icon: "notification_icon",
       show_in_foreground: true,
       color: '#8bc34b',
       vibrate: 300,
       lights: true,
       status: notif.status
   });
});

Abbiamo usato il pacchetto npm fcm-push usando Node.js come backend per la notifica push e abbiamo impostato la struttura del payload come segue.

{
  to: '/topics/user', // required
  data: {
    id:212,
    message: 'test message',
    title: 'test title'
  },
  notification: {
    title: 'test title',
    body: 'test message',
    icon : 'notification_icon', // same name as mentioned in the front end
    color : '#8bc34b',
    click_action : "BROADCAST"
  }
}

Ciò che sostanzialmente cerca l'immagine notification_icon memorizzata localmente nel nostro sistema Android.


1
Il tuo problema è MOLTO diverso dal mio, sebbene abbia lo stesso effetto. Grazie per aver pubblicato questa risposta, probabilmente aiuterà qualcuno a utilizzare lo stesso stack tecnologico che stai utilizzando.
Blueriver

1
@IanWarburton: Non è necessario.
Aniruddha Shevle

5

Le notifiche sono in scala di grigi come spiegato di seguito. Non sono in bianco e nero, nonostante ciò che altri hanno scritto. Probabilmente hai visto icone con più sfumature, come le barre di forza della rete.

Prima dell'API 21 (Lollipop 5.0), le icone a colori funzionavano. È possibile forzare l'applicazione a destinazione API 20, ma ciò limita le funzionalità disponibili per l'applicazione, quindi non è consigliabile. È possibile testare il livello API in esecuzione e impostare un'icona colore o un'icona di scala di grigi in modo appropriato, ma probabilmente non vale la pena. Nella maggior parte dei casi, è meglio scegliere un'icona in scala di grigi.

Le immagini hanno quattro canali, RGBA (rosso / verde / blu / alfa). Per le icone di notifica, Android ignora i canali R, G e B. L'unico canale che conta è Alpha, noto anche come opacità. Progetta la tua icona con un editor che ti consente di controllare il valore Alpha dei colori del disegno.

In che modo i valori Alpha generano un'immagine in scala di grigio:

  • Alpha = 0 (trasparente): questi pixel sono trasparenti e mostrano il colore di sfondo.
  • Alpha = 255 (opaco) - Questi pixel sono bianchi.
  • Alpha = 1 ... 254 - Questi pixel sono esattamente ciò che ti aspetteresti, fornendo le sfumature tra trasparente e bianco.

Modificandolo con setColor:

  • Chiama NotificationCompat.Builder.setColor(int argb). Dalla documentazione per Notification.color:

    Colore di accento (un numero intero ARGB come le costanti in Colore) che deve essere applicato dai modelli di stile standard quando si presenta questa notifica. L'attuale design del modello crea un'immagine dell'intestazione colorata sovrapponendo l'immagine dell'icona (stampata in bianco) in cima a un campo di questo colore. I componenti alfa vengono ignorati.

    I miei test con setColor mostrano che i componenti Alpha non vengono ignorati. Valori Alpha più alti trasformano un pixel in bianco. I valori Alpha inferiori trasformano un pixel nel colore di sfondo (nero sul mio dispositivo) nell'area di notifica o nel colore specificato nella notifica a discesa.


5

Ho risolto il problema aggiungendo il codice seguente per manifest,

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

    <meta-data
        android:name="com.google.firebase.messaging.default_notification_color"
        android:resource="@color/black" />

dove ic_stat_name creato su Android Studio Fare clic con il tasto destro del mouse su res >> Nuovo >> Risorse immagine >> IconType (Notifica)

E un altro passo che devo fare sul lato server php con payload di notifica

$message = [
    "message" => [
        "notification" => [
            "body"  => $title , 
            "title" => $message
        ],

        "token" => $token,

    "android" => [
           "notification" => [
            "sound"  => "default",
            "icon"  => "ic_stat_name"
            ]
        ],

       "data" => [
            "title" => $title,
            "message" => $message
         ]


    ]
];

Nota la sezione

    "android" => [
           "notification" => [
            "sound"  => "default",
            "icon"  => "ic_stat_name"
            ]
        ]

dove il nome dell'icona "icon" => "ic_stat_name"deve essere lo stesso impostato su manifest.



4

Ho trovato un link in cui possiamo generare la nostra icona bianca,

prova questo link per generare l'icona bianca dell'icona di avvio.

Apri questo collegamento e carica l'icona ic_launcher o di notifica


1

È possibile utilizzare un'icona diversa per versioni diverse. Basta impostare la logica sulla tua icona in questo modo:

int icon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? R.drawable.colored_: R.drawable.white_tint_icon_for_lolipop_or_upper;

1

Per SDK> = 23, aggiungi setLargeIcon

notification = new Notification.Builder(this)
            .setSmallIcon(R.drawable.ic_launcher)
            .setLargeIcon(context.getResources(), R.drawable.lg_logo))
            .setContentTitle(title)
            .setStyle(new Notification.BigTextStyle().bigText(msg))
            .setAutoCancel(true)
            .setContentText(msg)
            .setContentIntent(contentIntent)
            .setSound(sound)
            .build();

1

Per ridurre le versioni specifiche dell'SDK, potresti semplicemente fare questo: (sostituisci '#' in '0x')

Notification notification = new NotificationCompat.Builder(this);
notification.setSmallIcon(R.drawable.icon_transperent);
notification.setColor(0x169AB9); //for color: #169AB9

0xFF169AB9, ti manca il canale alfa completamente opaco.
Eugen Pechanec,

0

Quando vuoi mantenere un'icona colorata - Soluzione alternativa
Aggiungi pixel con un colore leggermente diverso all'icona.
Nel mio caso ho un'icona nera con sfumature e luce. Quando aggiunto pixel blu scuro funziona.


0

Ho un problema simile su Android 8.0. Prova a utilizzare la risorsa icona BIANCO. Ho un quadrato bianco quando sto cercando di usare un'immagine colorata per l'icona, quando la sostituisco con l'icona bianca, inizia a lavorare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.