L'icona della barra delle notifiche diventa bianca in Android 5 Lollipop


207

Ho un'app che mostra notifiche personalizzate. Il problema è che quando si esegue in Android 5 l'icona piccola nella barra delle notifiche viene visualizzata in bianco. Come posso risolvere questo problema?


Rahul Sharma e basiam ha una risposta migliore qui - stackoverflow.com/questions/30795431/...
RIVU Chakraborty

Mi succede quando eseguo Android 6, non 5.
Jaime Montoya,

Certo, succede con Android 5+, ovviamente anche con Android 6 e 7. Al momento della domanda Android 5 era l'ultima versione e la funzionalità che causa questo problema è stata introdotta in Android 5.
Alejandro Casanova

Penso che sia più preciso dire API Level 21 (Android 5.0), API Level 22 (Android 5.1), API Level 23 (Android 6.0), ecc. Il termine "Android 5" è ambiguo perché si potrebbe parlare di Android 5.0 o Android 5.1 e quando ho testato le notifiche e il modo in cui le icone appaiono in API Level 22 vs. Livello API 23, mi sono reso conto che si comportano diversamente.
Jaime Montoya,

Risposte:


269

La risposta accettata non è (interamente) corretta. Certo, fa apparire le icone di notifica a colori, ma lo fa con un GRANDE svantaggio: impostando l'SDK di destinazione su Android Lollipop!

Se risolvi il problema con l'icona bianca impostando il tuo SDK di destinazione su 20, come suggerito, la tua app non sceglierà come target Android Lollipop, il che significa che non puoi utilizzare le funzionalità specifiche di Lollipop.

Dai un'occhiata a http://developer.android.com/design/style/iconography.html e vedrai 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) - https://developer.android.com/about/versions/android-5.0-changes.html

Quindi, penso che una soluzione migliore sia aggiungere un'icona silhouette all'app e usarla se il dispositivo esegue Android Lollipop.

Per esempio:

Notification notification = new Notification.Builder(context)
            .setAutoCancel(true)
            .setContentTitle("My notification")
            .setContentText("Look, white in Lollipop, else color!")
            .setSmallIcon(getNotificationIcon())
            .build();

    return notification;

E, nel metodo getNotificationIcon:

private int getNotificationIcon() {
    boolean useWhiteIcon = (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP);
    return useWhiteIcon ? R.drawable.icon_silhouette : R.drawable.ic_launcher;
}

34
Come si genera la silhouette? Sono uno sviluppatore senza competenze di Photoshop e rendere trasparente lo sfondo usando strumenti online si traduce ancora in icone bianche.
Chaitanya,

6
@Chaitanya Usa GIMP :)
ByteHamster

4
questa soluzione non risponde alla domanda sul perché il processo di generazione di Android modifica un PNG perfettamente corretto e lo comprime e rimuove il canale alfa.
philk,


4
invece di controllare dal modificatore di versione della piattaforma di applay di codice alla cartella drawable - drawable / drawable-v21 e posizionare l'icona corretta
Igor Wojda

72

Completamente d'accordo con l'utente Daniel Saidi. Per avere Colorper NotificationIconsto scrivendo questa risposta.

Per questo devi creare un'icona simile Silhouettee creare una sezione Transparentdove vuoi aggiungere la tua Colors. vale a dire,

inserisci qui la descrizione dell'immagine

Puoi aggiungere il tuo colore usando

.setColor(your_color_resource_here)

NOTA: setColorè disponibile solo in questo Lollipopmodo, devi controllareOSVersion

if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
    Notification notification = new Notification.Builder(context)
    ...
} else {
    // Lollipop specific setColor method goes here.
    Notification notification = new Notification.Builder(context)
    ...
    notification.setColor(your_color)
    ...            
}

Puoi anche raggiungere questo obiettivo usando Lollipopcome obiettivo SDK.

Tutte le istruzioni in merito NotificationIconfornite nelle Linee guida per le notifiche della Console per gli sviluppatori di Google .

Dimensione icona di notifica preferita 24x24dp

mdpi    @ 24.00dp   = 24.00px
hdpi    @ 24.00dp   = 36.00px
xhdpi   @ 24.00dp   = 48.00px

E fai riferimento a questo link per le dimensioni dell'icona di notifica per ulteriori informazioni.


4
questa è un'ottima idea per impostare il colore di sfondo come notification.setColor (your_color_resource_here)
TejaDroid

1
Quindi ho provato questo e l'icona di notifica ha lo sfondo colorato quando abbasso l'area di notifica. Ma, nel vassoio stesso, è ancora un'icona bianca
Stealth Rabbi

1
questa soluzione ha ragione..ha un'icona di notifica che ha il retro trasparente..e per silhouette, l'icona non deve essere solo nera..l'icona può avere colori; è solo che Android L convertirà il colore dello spettacolo in bianco..e le versioni precedenti di Android mostreranno l'icona così com'è
Lakshay

sto aggiungendo setColor per lecca-lecca sotto mostrando l'icona ic_launcher bene ma in 6.0 mostrando l'icona quadrata bianca per favore aiutatemi
Harsha

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,

47

Questo è il codice utilizzato da Android per visualizzare le icone di notifica:

// android_frameworks_base/packages/SystemUI/src/com/android/systemui/
//   statusbar/BaseStatusBar.java

if (entry.targetSdk >= Build.VERSION_CODES.LOLLIPOP) {
    entry.icon.setColorFilter(mContext.getResources().getColor(android.R.color.white));
} else {
    entry.icon.setColorFilter(null);
}

Quindi è necessario impostare la versione SDK target su qualcosa <21e le icone rimarranno colorate. Questa è una brutta soluzione ma fa quello che dovrebbe fare. Ad ogni modo, suggerisco davvero di seguire le Linee guida per la progettazione di Google : "Le icone di notifica devono essere completamente bianche".

Ecco come è possibile implementarlo:

Se stai utilizzando Gradle / Android Studio per creare le tue app, usa build.gradle:

defaultConfig {
    targetSdkVersion 20
}

Altrimenti (Eclipse ecc.) Usare AndroidManifest.xml:

<uses-sdk android:minSdkVersion="..." android:targetSdkVersion="20" />

C'è qualche soluzione? O cosa posso fare per mostrare quella o qualsiasi altra icona correttamente?
Alejandro Casanova,

Ho modificato la mia risposta dopo aver letto una soluzione alternativa dopo aver letto il codice sorgente di Android.
ByteHamster

4
Grazie mille per il tuo aiuto, ma ti prego di fornirmi un po 'di "contesto". Dove devo farlo? Che cos'è la "voce"?
Alejandro Casanova,

Il codice è stato preso da AOSP solo per mostrare come ho trovato la soluzione alternativa :) Ho aggiunto una piccola spiegazione su come implementarlo.
ByteHamster

Questo funziona davvero. Qualche ipotesi sul perché Google ha fatto questo? È un bug o una funzionalità?
m02ph3u5,

24

Per evitare che le icone di notifica diventino bianche, utilizzare le icone "Silhouette" per loro, ad es. immagini di sfondo bianco su trasparente. Puoi usare Irfanview per costruirli:

  • scegliere un'immagine, aprire IrfanView, premere F12 per gli strumenti di pittura, pulire l'immagine se necessario (rimuovere le parti indesiderate, levigare e lucidare)
  • Image / Decrease Color Depth a 2 (per un'immagine in bianco e nero)
  • Image / Negative (per una foto in bianco su nero)
  • Image / Resize/Resample a 144 x 144 (utilizzare il metodo Dimensioni "Ridimensiona" non "Ricampiona", altrimenti l'immagine viene aumentata di nuovo a 24 bit di colore per pixel (24 BPP)
  • File / Save as PNG, controlla Show option dialog, controlla Save Transparent Color, fai clic Save, quindi fai clic sul colore nero nell'immagine per impostare il colore trasparente

Android sembra utilizzare solo la risoluzione dell'immagine drawable-xxhdpi (144 x 144), quindi copia il ic_notification.pngfile risultante su \AndroidStudio\Projects\...\app\src\main\res\drawable-xxhdpi. Utilizzare .setSmallIcon(R.drawable.ic_notification)nel codice o utilizzare getNotificationIcon()come suggerito Daniel Saidi sopra.

Puoi anche utilizzare Android Asset Studio di Roman Nurik .


Ho provato a convertire la mia icona usando Photoshop ma non ci sono riuscito, ma essendo un fan di irfanview l'ho provato rapidamente quando l'ho visto e ha funzionato meravigliosamente. Grazie!
Bruce,

15

Un'altra opzione è quella di sfruttare le directory disegnabili (mipmap) specifiche della versione per fornire grafica diversa per Lollipop e versioni successive.

Nella mia app, le directory "v21" contengono icone con testo trasparente mentre le altre directory contengono una versione non trasparente (per le versioni di Android precedenti a Lollipop).

File system

Che dovrebbe assomigliare a questo:

Android Studio

In questo modo, non è necessario controllare i numeri di versione nel codice, ad es

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);

Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
        .setSmallIcon(R.mipmap.ic_notification)
        .setContentTitle(title)
        .setContentText(message)
        .setAutoCancel(true)
        .setSound(defaultSoundUri)
            .setContentIntent(pendingIntent);

Allo stesso modo, puoi fare riferimento a "ic_notification" (o come scegli di chiamarlo) nel tuo payload GCM se usi l'attributo "icona".

https://developers.google.com/cloud-messaging/http-server-ref#notification-payload-support


3
Funziona e sembra la soluzione più Android.
Sergey Galin,

stai dicendo che se Android sceglierà l'icona dalla cartella mipmap-21 se la versione è lollipop, e se meno di lollipop sceglierà da disegnabile?
Lakshay,

@Ian, l'approccio delle directory è buono per le risorse per versione Android, ma come puoi impostare setColor(senza coinvolgere codice aggiuntivo) in quel modo?
Daniel,

I colori di @Daniel possono anche trovarsi in directory specifiche della versione, ad es. "Valori" e "valori-v21".
Ian

12

Secondo le linee guida di progettazione Android è necessario utilizzare una silhouette per builder.setSmallIcon(R.drawable.some_notification_icon); Ma se vuoi ancora mostrare un'icona colorata come icona di notifica, ecco il trucco per lecca-lecca e sopra usa sotto il codice. LargeIcon fungerà da icona di notifica principale ed è inoltre necessario fornire una silhouette per smallIcon in quanto verrà mostrato nella parte inferiore destra di largeIcon.

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
{
     builder.setColor(context.getResources().getColor(R.color.red));
     builder.setSmallIcon(R.drawable.some_notification_icon);
     builder.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher));
}

E pre-lecca-lecca usare solo .setSmallIcon(R.mipmap.ic_launcher)con il tuo costruttore.


11

Ora Android Studio fornisce un plug-in Image Asset , che genererà l'icona in tutte le cartelle drawbale richieste

Asset immagine Studio ti aiuta a creare vari tipi di icone a diversa densità e ti mostra esattamente dove verranno posizionati nel tuo progetto. Include strumenti per la regolazione delle icone e l'aggiunta di sfondi, il tutto durante la visualizzazione del risultato in un riquadro di anteprima, in modo che appaiano esattamente come previsto. Questi strumenti possono semplificare notevolmente la progettazione delle icone e il processo di importazione.

È possibile accedere a Image Asset facendo clic su nuovo> fare clic sull'opzione Image Asset e verrà visualizzata la finestra in questo modo: -

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine


8

Stavo affrontando lo stesso problema ed era a causa della mia icona di notifica dell'app non piatta. Per la versione di Android lecca-lecca o anche sotto lecca-lecca l'icona di notifica dell'app dovrebbe essere piatta, non usare l'icona con le ombre ecc.

Di seguito è riportato il codice che ha funzionato perfettamente su tutte le versioni di Android.

private void sendNotification(String msg) {

    NotificationManager mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

    Intent intent = new Intent(this, CheckOutActivity.class);

    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, 0);

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
            this).setSmallIcon(R.drawable.ic_notification)
            .setContentTitle(getString(R.string.app_name))
            .setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
            .setContentText(msg).setLights(Color.GREEN, 300, 300)
            .setVibrate(new long[] { 100, 250 })
            .setDefaults(Notification.DEFAULT_SOUND).setAutoCancel(true);

    mBuilder.setContentIntent(contentIntent);
    mNotificationManager.notify(new Random().nextInt(), mBuilder.build());
}

Icona sbagliata
inserisci qui la descrizione dell'immagine

Icona giusta

inserisci qui la descrizione dell'immagine


1
Dove risolvi esattamente il problema qui?
IgorGanapolsky,

Come creare l'icona giusta. È possibile generare online? qualsiasi strumento ??
Jiks,

@Jiks Sì, ecco il link
Muhammad Sohaib Ayub,

7

il canale alfa è l'unico dato dell'immagine che Android utilizza per le icone di notifica:

  • alpha == 1: i pixel mostrano il bianco
  • alpha == 0: i pixel vengono visualizzati come colore scelto Notification.Builder#setColor(int)

Questo è menzionato su https://developer.android.com/about/versions/android-5.0-changes.html :

Il sistema ignora tutti i canali non alfa nelle icone di azione e nell'icona di notifica principale. Dovresti supporre che queste icone saranno solo alfa.

Quasi tutti i drawable integrati sembrano essere immagini alfa adatte per questo, quindi potresti usare qualcosa come:

Notification.Builder.setColor(Color.RED)
                    .setSmallIcon(android.R.drawable.star_on)

ma sto ancora cercando il documento API che lo confermi ufficialmente.

Testato su Android 22.


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,

@JohnLee Non credo che possa andare in crash, potrebbe sembrare brutto solo se non lo prendi in considerazione :-)
Ciro Santilli 8 冠状 病 六四 事件 法轮功

3

rimuovere android:targetSdkVersion="21"da manifest.xml. Funzionerà! e da questo non ci sono problemi nel tuo apk, solo un trucco lo applico e ho trovato un'icona colorata nella notifica


9
Totalmente cattiva idea di giocare "trucchi" con il sistema! Non è una soluzione!
sud007,

3

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 potenza 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 è utile. 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; invece, forniscono ancora la scala di grigi. 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. (Sembra che altri abbiano segnalato comportamenti leggermente diversi, quindi fai attenzione!)


2

Dopo il rilascio di Android Lollipop Android ha modificato le linee guida per la visualizzazione delle icone di notifica nella barra delle notifiche. La documentazione ufficiale dice "Aggiorna o rimuovi risorse che coinvolgono il colore. Il sistema ignora tutti i canali non alfa nelle icone di azione e nell'icona di notifica principale. Dovresti presumere che queste icone siano solo alfa. Il sistema disegna le icone di notifica in bianco e icone di azione in grigio scuro. " Ciò che significa in parole semplici è "Converti tutte le parti dell'immagine che non vuoi mostrare in pixel trasparenti. Tutti i colori e i pixel non trasparenti sono visualizzati in bianco "

Puoi vedere come fare in dettaglio con schermate qui https://blog.clevertap.com/fixing-notification-icon-for-android-lollipop-and-above/

spero che aiuti


2

Devi importare l'immagine PNG trasparente monocolore. Quindi puoi impostare il colore dell'icona della piccola icona. Altrimenti verrà mostrato bianco in alcuni dispositivi come MOTO


1

Se stai utilizzando GoogleFireBaseMessaging, puoi impostare "id icona" nel payload "notifica" (mi aiuta a risolvere il problema con l'icona della barra bianca):

{
    "to":"<fb_id>",
    "priority" : "high",
    "notification" : 
    {
        "title" : "title",
        "body" : "body" ,
        "sound" : "default",
        "icon" : "ic_notification"
    }
}

imposta ic_notification sul tuo ID da R.drawable.


Dove hai posizionato quell'icona? Tutto quello che ottengo è l'icona della mia app e tutti i file R.drawable che trovo sono file di classe binari.
shinzou,

@kuhaku si riferisce a un file ic_launcher.png nella cartella 'drawable'.
Johnson,

0

Ho anche affrontato troppi problemi in questo, ma dopo aver cercato su Internet ho trovato diverse soluzioni per questo problema. Consentitemi di riassumere tutte le soluzioni e spiegare:

Nota: questa soluzione è per gli utenti di Phonegap cordova

  1. Esempio

<preference name="android-targetSdkVersion" value="20"/>

Devi impostare il valore di android-targetSdkVersion su meno di 21. Quindi, dopo aver impostato questo valore, l'icona dell'icona di notifica apparirà fino ad Android 6 (Marshmallow), non funzionerà in Android 7 (Nougat). Questa soluzione ha funzionato per me.

  1. Cambia statusbarStyle nel tuo file di configurazione. Esempio

<preference name="StatusBarStyle" value="lightcontent" />

Ma questa soluzione funzionerà solo quando l'app verrà aperta. Quindi, suppongo che questa soluzione non sia la migliore ma ha funzionato per molti utenti.

  1. Rendi trasparente la tua icona. Questa soluzione ha funzionato per molte persone. In realtà, nello sviluppo dell'aplicazione nativa dobbiamo fornire loro tre immagini: (a) Icona dell'app (b) Icona di notifica (c) Immagine dell'icona della barra di stato, ma in caso di sviluppo di applicazioni mobili ibride non è possibile fare così. Quindi rendi trasparente la tua icona e questa soluzione risolverà il tuo problema.

E sono sicuro che una delle soluzioni di cui sopra funzionerà per il tuo problema.


0

Cordiali saluti: Se l'icona non viene visualizzata, assicurarsi che la configurazione di notifica locale o remota contenga il nome dell'icona corretto, ad es

'largeIcon' => 'ic_launcher',
'smallIcon' => 'ic_launcher' // defaults to ic_launcher, 

0

Penso che sia troppo tardi per parlare dell'API 21, ma ho trovato un modo semplice.

Quando si utilizzano le "Notifiche personalizzate (layout personalizzato)",

RemoteView di

setImageViewResource(int viewId, int srcId);

e

setImageViewUri(int viewId, Uri uri); 

rende bianche quelle immagini su Lollipop (API 21).

Ma quando si utilizza

setImageViewBitmap(int viewId, Bitmap bitmap);

L'immagine non diventa mascherata di bianco!



-3

mescola queste due cose in gradi app

 defaultConfig {
    applicationId "com.example.abdulwahidvi.notificationproblem"
    minSdkVersion 16
    //This is the version that was added by project by default
    targetSdkVersion 26 <------ default
    // Changed it to version 20
    targetSdkVersion 20 <------ mine

    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}

-38

android:targetSdkVersion="20"dovrebbe essere < 21.


1
Si prega di non seguire questa soluzione, certo che potrebbe funzionare ma a costo di eseguire le app in modalità compatibilità per le versioni più recenti di Android.
king_below_my_lord,
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.