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?
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?
Risposte:
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;
}
ctrl+f
notification
Completamente d'accordo con l'utente Daniel Saidi. Per avere Color
per NotificationIcon
sto scrivendo questa risposta.
Per questo devi creare un'icona simile Silhouette
e creare una sezione Transparent
dove vuoi aggiungere la tua Colors
. vale a dire,
Puoi aggiungere il tuo colore usando
.setColor(your_color_resource_here)
NOTA: setColor
è disponibile solo in questo Lollipop
modo, 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 Lollipop
come obiettivo SDK
.
Tutte le istruzioni in merito NotificationIcon
fornite 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.
setColor
su 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?
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 <21
e 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" />
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:
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 trasparenteAndroid sembra utilizzare solo la risoluzione dell'immagine drawable-xxhdpi (144 x 144), quindi copia il ic_notification.png
file 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 .
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).
Che dovrebbe assomigliare a questo:
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
setColor
(senza coinvolgere codice aggiuntivo) in quel modo?
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.
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: -
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
Icona giusta
il canale alfa è l'unico dato dell'immagine che Android utilizza per le icone di notifica:
alpha == 1
: i pixel mostrano il biancoalpha == 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.
setColor
su 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?
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
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:
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!)
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
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
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.
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
<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.
<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.
E sono sicuro che una delle soluzioni di cui sopra funzionerà per il tuo problema.
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!
Secondo la documentazione, l'icona di notifica deve essere bianca da Android 3.0 (API Level 11) :
https://developer.android.com/guide/practices/ui_guidelines/icon_design_status_bar
"Le icone della barra di stato sono composte semplicemente da pixel bianchi su uno sfondo trasparente, con fusione alfa utilizzata per bordi smussati e trama interna ove appropriato."
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"
}
android:targetSdkVersion="20"
dovrebbe essere < 21
.