L'icona della barra di notifica diventa bianca in Android 5 Lollipop

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

  • Firebase Messaging - Crea un display a testa in alto quando app in background
  • rendendo un servizio un servizio di primo piano
  • Come avviare l'attività quando l'utente fa clic su una notifica?
  • Come creare un'icona della barra di stato Notifica \ sulla destra?
  • NotificationListenerService ottiene l'icona di notifica?
  • android in sospeso problema di notifica intent
  • 17 Solutions collect form web for “L'icona della barra di notifica diventa bianca in Android 5 Lollipop”

    La risposta accettata non è (interamente) corretta. Certo, rende le icone di notifica mostrate a colors, ma lo fa con un inconveniente GRANDE – impostando l'SDK di destinazione a più basso di Android Lollipop!

    Se risolvi il problema dell'icona bianca impostando l'SDK di destinazione a 20, come suggerito, l'applicazione non targeterà Android Lollipop, il che significa che non è ansible utilizzare le funzionalità specifiche di Lollipop.

    Date un'occhiata a http://developer.android.com/design/style/iconography.html e vedrai che lo stile bianco è come le notifiche devono essere visualizzate in Android Lollipop.

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

    Quindi, penso che una soluzione migliore è aggiungere un'icona di silhouette all'app e utilizzarlo se il dispositivo è in esecuzione 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; } 

    Completamente d'accordo con l'utente Daniel Saidi. Per avere Color per NotificationIcon sto scrivendo questa risposta.

    Per questo devi fare l'icona come Silhouette e fare una sezione Transparent ovunque tu vuoi aggiungere i tuoi Colors . vale a dire,

    immettere qui la descrizione dell'immagine

    Puoi aggiungere il tuo colore utilizzando

    .setColor(your_color_resource_here)

    NOTA: setColor è disponibile solo in Lollipop , quindi devi controllare OSVersion

     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 get questo risultato utilizzando Lollipop come SDK destinazione.

    Tutte le istruzioni relative a NotificationIcon date nelle linee guida per la notifica di console di Google Developer Console .

    Dimensione dell'icona di notifica preferita 24x24dp

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

    Inoltre, fare riferimento a questo collegamento per le size delle icone di notifica per ulteriori informazioni.

    Questo è il codice Android utilizzato 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 di sdk di destinazione a qualcosa <21 e le icone rimarranno colorate. Questa è una brutale soluzione, ma fa quello che dovrebbe fare. In each caso, suggerisco davvero di seguire le linee guida di progettazione di Google: "Le icone di notifica devono essere interamente bianche".

    Ecco come è ansible attuarla:

    Se stai utilizzando Gradle / Android Studio per build le tue applicazioni, utilizza build.gradle :

     defaultConfig { targetSdkVersion 20 } 

    Altrimenti (Eclipse ecc.) Usa AndroidManifest.xml :

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

    Per evitare che le icone delle Notifiche diventino bianche, utilizzare icone "Silhouette" per loro, vale a dire. immagini di background bianco-trasparente. È ansible utilizzare Irfanview per costruirli:

    • scegliere un'image aperta in IrfanView , premere F12 per gli strumenti di verniciatura, se necessario pulire l'image (rimuovere le parti indesiderate, lisciare e lucidare)
    • Image / Decrease Color Depth a 2 (per un'image in bianco e nero)
    • Image / Negative (per un bianco su image nera)
    • Image / Resize/Resample a 144 x 144 (utilizza Dimensione Metodo "Ridimensiona" e non "Resample", altrimenti l'image viene aumentata a 24 bit di colore per pixel (24 BPP)
    • File / Save as PNG , controlla la Show option dialog , seleziona Save Transparent Color , fai Save su Save , quindi fai clic sul colore nero nell'image per impostare il colore trasparente

    Android sembra utilizzare solo la risoluzione di image drawable-xxhdpi (144 x 144), quindi copia il file ic_notification.png risultante in \AndroidStudio\Projects\...\app\src\main\res\drawable-xxhdpi . Utilizza il .setSmallIcon(R.drawable.ic_notification) nel tuo codice o utilizza getNotificationIcon() come Daniel Saidi suggerito sopra.

    Puoi anche utilizzare Android Asset Studio di Roman Nurik .

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

    Nella mia applicazione, le directory "v21" contengono icone con text trasparente mentre le altre directory contengono una versione non trasparente (per versioni di Android più vecchio di Lollipop).

    File system

    Quale dovrebbe sembrare qualcosa di simile:

    Android Studio

    In questo modo, non è necessario controllare i numbers di versione nel codice, ad esempio

     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 riferirti a "ic_notification" (oa qualunque cosa scegli di chiamarlo) nel tuo payload GCM se utilizzi l'attributo "icona".

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

    Mi trovavo di fronte allo stesso problema ed era a causa della mia icona di notifica di app non era piatta. Per la versione Android della lollipop o addirittura sotto il lollipop, l'icona di notifica dell'applicazione dovrebbe essere piatta, non utilizzare l'icona con le ombre ecc.

    Di seguito è il codice che ha funzionato perfettamente su tutte le versioni 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 errata
    immettere qui la descrizione dell'immagine

    Icona destra

    immettere qui la descrizione dell'immagine

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

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

    Questo è indicato all'indirizzo 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. Si supponga che queste icone siano solo alfa.

    Quasi tutti i drawables incorporati sembrano essere adatti alle alfa immagini per questo, in modo da poter utilizzare qualcosa come:

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

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

    Testato su Android 22.

    Secondo le linee guida di progettazione di Android, è necessario utilizzare una silhouette per builder.setSmallIcon(R.drawable.some_notification_icon); Ma se ancora vuoi mostrare un'icona colorata come un'icona di notifica, qui è il trucco per il lollipop e sopra utilizzare il codice sotto. Il bigIcon agirà come un'icona di notifica primaria e devi anche fornire una silhouette per smallIcon, come verrà mostrato nella parte inferiore destra del 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-lollipop utilizzare solo .setSmallIcon(R.mipmap.ic_launcher) con il tuo constructor.

    Ora Android studio è fornire un plugin Image Asset , che sarà generare l'icona in tutte le cartelle richieste drawbale

    Image Asset Studio ti aiuta a creare diversi tipi di icone a diverse densità e ti mostra esattamente where saranno collocati nel tuo progetto. Esso include strumenti per regolare le icone e aggiungere sfondi, tutto mentre visualizza il risultato in un riquadro di anteprima, in modo che appaiono esattamente come si intende. Questi strumenti possono semplificare drammaticamente il process di progettazione e di importzione di icone.

    È ansible accedere a Image Asset facendo clic su nuovo> fare clic sull'opzione Asset image e verrà visualizzata una window come questa: –

    immettere qui la descrizione dell'immagine

    immettere qui la descrizione dell'immagine

    rimuovere l' android:targetSdkVersion="21" da manifest.xml. Funzionerà! e da questo non c'è alcun problema a tutti i tuoi apk è solo un trucco che applico questo e ho trovato icona colorata nella notifica

    Post android Lollipop release android ha cambiato le linee guida per la visualizzazione delle icone di notifica nella barra di notifica. La documentazione ufficiale dice "Aggiorna o rimuove le risorse che coinvolgono il colore." Il sistema ignora tutti i canali non alfa nelle icone di azione e nell'icona di notifica principale: dovreste supporre che queste icone saranno solo alfa Il sistema richiama le icone di notifica in bianco e le icone di azione in grigio scuro. "Ora che cosa significa in termini di uomo laico è" Convertire tutte le parti dell'image che non si desidera mostrare a pixel trasparenti. Tutti i colors ei pixel non trasparenti vengono visualizzati in bianco "

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

    Spero possa aiutare

    Le notifiche sono in scala di grigi come spiegato di seguito. Non sono in bianco e nero, nonostante ciò che altri hanno scritto. Probabilmente avete visto icone con molteplici sfumature, come le barre di resistenza di networking.

    Prima di API 21 (Lollipop 5.0), le icone dei colors funzionano. Potresti forzare la tua applicazione a target API 20, ma limita le funzionalità disponibili per l'applicazione, quindi non è consigliabile. È ansible testare il livello API in esecuzione e impostare un'icona di colore o un'icona di grigio appropriata, ma probabilmente non è valsa la pena. Nella maggior parte dei casi, è meglio andare con un'icona a scala dei 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 dà il controllo sul valore Alpha dei tuoi colors di disegno.

    Come i valori Alpha generano un'image in scala di grigi:

    • Alpha = 0 (trasparente) – Questi pixel sono trasparenti, mostrando il colore di background.
    • Alpha = 255 (opaco) – Questi pixel sono bianchi.
    • Alpha = 1 … 254 – Questi pixel sono esattamente quello che ti aspetteresti, fornendo le sfumature tra trasparente e bianco.

    Modificarlo con setColor :

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

      Colore di accento (un integer ARGB come le costanti in colore) da applicare dai templates standard di stile quando si presenta questa notifica. Il disegno attuale del model costruisce un'image intestazione colorata sovrapponendo l'image dell'icona (stenciled in white) in cima a un field di questo colore. I componenti Alpha vengono ignorati.

      Il mio test con setColor mostra che i componenti Alpha non vengono ignorati; invece, forniscono ancora una scala di grigi. I valori Alpha più alti trasformano un pixel bianco. I valori inferiori dell'alfa trasformano un pixel sul colore di background (nero sul dispositivo) nell'area di notifica o sul colore specificato nella notifica di discesa. (Sembra che altri hanno segnalato un comportmento leggermente diverso, perciò siate consapevoli!)

    Se stai utilizzando GoogleFireBaseMessaging, puoi impostare "id icona" nel payload di "notifica" (mi aiuta a risolvere il problema dell'icona a barre bianca):

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

    }

    impostare ic_notification al proprio ID da R.drawable.

    Ho anche affrontato troppi problemi in questo, ma dopo la ricerca in tutto il web ho trovato diverse soluzioni per questo problema.Let me riassumere tutte le soluzioni e spiegare:

    Nota: questa soluzione è per gli utenti Cordova di Phonegap

    1. Esempio

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

    È necessario impostare il valore di android-targetSdkVersion a less di 21. Quindi, dopo aver impostato questo valore, l'icona di notifica verrà visualizzata fino a Android 6 (Marshmallow), non functionrà in Android 7 (torrone). Questa soluzione ha funzionato per me.

    1. Modificare lo statusbarStyle nel file di configuration. Esempio

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

    Ma questa soluzione functionrà solo quando l'applicazione viene aperta. Quindi, credo che questa soluzione non è la soluzione migliore ma ha funzionato per molti utenti.

    1. Rendi trasparente la tua icona. Questa soluzione ha funzionato per molte persone. In realtà la cosa è che, nello sviluppo dell'applicazione nativa, dobbiamo fornire loro tre immagini: (a) icona dell'applicazione (b) icona di notifica (c) image dell'icona della barra di stato, ma in caso di sviluppo di applicazioni mobili ibride non esiste alcuna opzione fare così. Così rendere la tua icona trasparente e questa soluzione risolverà il tuo problema.

    E sono sicuro che una delle suddette soluzioni functionrà per il tuo problema.

    FYI: se l'icona non viene visualizzata, assicurati che la configuration di notifica locale o remota contenga il nome dell'icona corretto, ad esempio

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

    mescolare queste due cose in gradi app

      defaultConfig { applicationId "com.example.abdulwahidvi.notificationproblem" minSdkVersion 16 targetSdkVersion 26 <----------- default // my code targetSdkVersion 20 <--------- mine versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } 

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

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.