Özel bildirimleri gösteren bir uygulamam var. Sorun, Android 5'de çalışırken Bildirim çubuğundaki küçük simgenin beyaz olarak gösterilmesidir. Bunu nasıl düzeltebilirim?
Özel bildirimleri gösteren bir uygulamam var. Sorun, Android 5'de çalışırken Bildirim çubuğundaki küçük simgenin beyaz olarak gösterilmesidir. Bunu nasıl düzeltebilirim?
Yanıtlar:
Kabul edilen cevap (tamamen) doğru değil. Elbette, bildirim simgelerinin renkli görünmesini sağlar, ancak bunu büyük bir dezavantajla yapar - hedef SDK'yı Android Lollipop'tan daha düşük bir değere ayarlayarak!
Beyaz simge sorununuzu, hedef SDK'nızı önerildiği gibi 20 olarak ayarlayarak çözerseniz, uygulamanız Android Lollipop'u hedeflemez, bu da Lollipop'a özgü özellikleri kullanamayacağınız anlamına gelir.
Http://developer.android.com/design/style/iconography.html adresine bir göz atın ve beyaz stilin, bildirimlerin Android Lollipop'ta nasıl görüntülenmesi gerektiğini göreceksiniz.
Lollipop'ta Google ayrıca (beyaz) bildirim simgesinin arkasında görüntülenecek bir renk kullanmanızı önerir - https://developer.android.com/about/versions/android-5.0-changes.html
Bu yüzden, uygulamaya daha iyi bir çözüm eklemek ve cihaz Android Lollipop çalıştırıyorsa kullanmak olduğunu düşünüyorum.
Örneğin:
Notification notification = new Notification.Builder(context)
.setAutoCancel(true)
.setContentTitle("My notification")
.setContentText("Look, white in Lollipop, else color!")
.setSmallIcon(getNotificationIcon())
.build();
return notification;
Ve getNotificationIcon yönteminde:
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
ve yazarak notification
o şey bulamıyorum o sayfada ...
Kullanıcı Daniel Saidi ile tamamen katılıyorum. Bunu yapabilmek Color
için NotificationIcon
bu cevabı yazıyorum.
Bunun için simge gibi Silhouette
yapmak Transparent
ve eklemek istediğiniz yere bir bölüm yapmak gerekir Colors
. yani
Kullanarak renk ekleyebilirsiniz
.setColor(your_color_resource_here)
NOT: setColor
sadece şurada mevcuttur, Lollipop
bu nedenle kontrol etmeniz gerekirOSVersion
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)
...
}
Bunu Lollipop
hedef olarak kullanarak da başarabilirsiniz SDK
.
Google Geliştirici Konsolu Bildirim Kılavuzu HatlarındaNotificationIcon
verilen tüm talimatlar .
Tercih Edilen Bildirim Simgesi Boyutu 24x24dp
mdpi @ 24.00dp = 24.00px
hdpi @ 24.00dp = 36.00px
xhdpi @ 24.00dp = 48.00px
Ayrıca , daha fazla bilgi için Bildirim Simgesi Boyutları için bu bağlantıya bakın .
setColor
Kitkat (API 19) ve IceCreamSandwich (API 15) üzerinde test ettim , her iki durumda da rengi görmezden geldi, ancak çökmedi . İşletim sistemi sürümünü güvenli bir şekilde atlayabilir miyim?
Bu, Android'in bildirim simgelerini görüntülemek için kullandığı koddur:
// 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);
}
Bu yüzden hedef sdk sürümünü bir şeye ayarlamanız gerekir <21
ve simgeler renkli kalır. Bu çirkin bir çözümdür ama yapması beklenen şeyi yapar. Her neyse, Google'ın Tasarım Yönergeleri'ni izlemenizi öneririm : "Bildirim simgeleri tamamen beyaz olmalıdır."
Bunu nasıl uygulayabileceğiniz aşağıda açıklanmıştır:
Uygulamalarınızı oluşturmak için Gradle / Android Studio kullanıyorsanız şunları kullanın build.gradle
:
defaultConfig {
targetSdkVersion 20
}
Aksi takdirde (Eclipse vb.) Şunları kullanın AndroidManifest.xml
:
<uses-sdk android:minSdkVersion="..." android:targetSdkVersion="20" />
Bildirim simgelerinin beyaza dönüşmesini önlemek için, "Siluet" simgelerini kullanın, örn. şeffaf beyaz arka plan resimleri. Sen kullanabilir IrfanView bunları inşa etmek:
IrfanView
, boyama araçları için F12 tuşuna basın, gerekirse resmi temizleyin (istenmeyen parçaları çıkarın, pürüzsüz ve cilalayın)Image / Decrease Color Depth
2'ye (siyah beyaz resim için)Image / Negative
(siyah resimde beyaz için)Image / Resize/Resample
144 x 144'e (Boyut Yöntemi'ni kullanarak "Yeniden Örnekle" değil "Yeniden Boyutlandır" seçeneğini kullanın; aksi takdirde resim tekrar piksel başına 24 renk bitine (24 BPP) yükseltilir.File / Save as PNG
, kontrol edin Show option dialog
, kontrol edin Save Transparent Color
, tıklayın Save
ve ardından saydam rengi ayarlamak için resimdeki siyah rengi tıklayınAndroid yalnızca drawable-xxhdpi resim çözünürlüğünü (144 x 144) kullanıyor gibi görünüyor, bu nedenle ortaya çıkan ic_notification.png
dosyanızı kopyalayın \AndroidStudio\Projects\...\app\src\main\res\drawable-xxhdpi
. .setSmallIcon(R.drawable.ic_notification)
Kodunuzda kullanın veya getNotificationIcon()
yukarıda önerilen Daniel Saidi olarak kullanın .
Roman Nurik'in Android Asset Studio'yu da kullanabilirsiniz .
Başka bir seçenek, Lollipop ve üstü için farklı grafikler sağlamak üzere sürüme özgü çekilebilir (mipmap) dizinlerden yararlanmaktır.
Uygulamamda "v21" dizinleri saydam metin içeren simgeler içerirken, diğer dizinler saydam olmayan sürüm içeriyor (Android'in Lollipop'tan daha eski sürümleri için).
Hangisi böyle görünmeli:
Bu şekilde, koddaki sürüm numaralarını kontrol etmenize gerek yoktur, örn.
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);
Benzer şekilde, "simge" özniteliğini kullanırsanız GCM yükünüzde "ic_notification" (ya da onu çağırmayı seçerseniz seçin) ifadesini kullanabilirsiniz.
https://developers.google.com/cloud-messaging/http-server-ref#notification-payload-support
setColor
(ekstra kod içermeden) bu şekilde nasıl ayarlayabilirsiniz ?
Android tasarım yönergelerine göre için bir siluet kullanmalısınız.Ama builder.setSmallIcon(R.drawable.some_notification_icon);
yine de bir bildirim simgesi olarak renkli bir simge göstermek istiyorsanız, burada lolipop ve yukarıdaki kodun altında kullanım için hiledir. LargeIcon, birincil bildirim simgesi olarak işlev görür ve ayrıca smallIcon için, largeIcon'un sağ alt kısmında gösterileceği için bir siluet sağlamanız gerekir.
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));
}
Ve lolipop öncesi sadece .setSmallIcon(R.mipmap.ic_launcher)
üreticinizle kullanın .
Şimdi android stüdyo gerekli tüm drawbale klasöründe simge oluşturmak olacak bir eklenti Görüntü Varlığı sağlamaktır
Görüntü Varlığı Studio, farklı yoğunluklarda çeşitli simgeler oluşturmanıza yardımcı olur ve projenize nereye yerleştirileceklerini tam olarak gösterir. Sonuçlarınızı bir önizleme bölmesinde görüntülerken simgelerinizi ayarlamak ve arka plan eklemek için araçlar içerir, böylece tam olarak istediğiniz gibi görünürler. Bu araçlar, simge tasarımı ve içe aktarma işlemini önemli ölçüde kolaylaştırabilir.
Görüntü Varlığına yeni tıklatarak erişebilirsiniz > Görüntü Varlığı seçeneğine tıklayın ve pencere aşağıdaki gibi gösterilecektir: -
Aynı sorunla karşı karşıya kaldım ve bunun nedeni benim uygulama bildirim simgesinin düz olmamasıydı. Android sürümü lolipop veya hatta lolipop için uygulama bildirim simgeniz düz olmalı, gölgeli simge kullanmayın.
Aşağıda tüm android sürümlerinde mükemmel çalışan kod bulunmaktadır.
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());
}
Yanlış simge
Sağ Simge
alfa kanalı , Android'in bildirim simgeleri için kullandığı tek resim verisidir:
alpha == 1
: pikseller beyaz gösteriralpha == 0
: pikseller seçtiğiniz renk olarak gösterilir Notification.Builder#setColor(int)
Bu, https://developer.android.com/about/versions/android-5.0-changes.html adresinde belirtilmiştir :
Sistem, eylem simgelerinde ve ana bildirim simgesinde alfa olmayan tüm kanalları yok sayar. Bu simgelerin yalnızca alfa olacağını varsaymalısınız.
Neredeyse tüm dahili çekilebilir malzemeler bunun için uygun alfa görüntüleri gibi görünüyor, bu nedenle şöyle bir şey kullanabilirsiniz:
Notification.Builder.setColor(Color.RED)
.setSmallIcon(android.R.drawable.star_on)
ancak hala resmi olarak onaylayan API dokümanını arıyorum .
Android 22'de test edildi.
setColor
Kitkat (API 19) ve IceCreamSandwich (API 15) üzerinde test ettim , her iki durumda da rengi görmezden geldi, ancak çökmedi . İşletim sistemi sürümünü güvenli bir şekilde atlayabilir miyim?
android:targetSdkVersion="21"
manifest.xml dosyasından kaldırın . Çalışacak! ve bundan hiç prob yok, apk'nizde bunu uyguladığım bir numara ve bildirimde renkli simge buldum
Bildirimler aşağıda açıklandığı gibi gri tonlamalıdır . Başkalarının yazdıklarına rağmen siyah-beyaz değiller. Muhtemelen ağ gücü çubukları gibi birden fazla gölgeye sahip simgeler görmüşsünüzdür.
API 21'den (Lollipop 5.0) önce renk simgeleri çalışır. Uygulamanızı API 20'yi hedeflemeye zorlayabilirsiniz, ancak bu, uygulamanız için kullanılabilir özellikleri sınırlandırdığından önerilmez. Çalışan API düzeyini test edebilir ve uygun şekilde bir renk simgesi veya gri tonlama simgesi ayarlayabilirsiniz, ancak bu muhtemelen önemli değildir. Çoğu durumda, gri tonlamalı bir simgeyle gitmek en iyisidir.
Görüntülerin RGBA (kırmızı / yeşil / mavi / alfa) olmak üzere dört kanalı vardır. Bildirim simgeleri için Android, R, G ve B kanallarını yok sayar. Önemli olan tek kanal, opaklık olarak da bilinen Alfa'dır. Simgenizi çizim renklerinizin Alfa değeri üzerinde kontrol sağlayan bir düzenleyici ile tasarlayın.
Alfa değerleri gri tonlamalı bir görüntü nasıl oluşturulur:
Şununla değiştirme setColor
:
Arayın NotificationCompat.Builder.setColor(int argb)
. İçin belgelerden Notification.color
:
Bu bildirim sunulurken standart Stil şablonları tarafından uygulanacak vurgu rengi (Renk sabitleri gibi bir ARGB tamsayısı). Geçerli şablon tasarımı, bu rengin bir alanının üstüne simge görüntüsünü (beyaz renkte) yerleştirerek renkli bir başlık görüntüsü oluşturur. Alfa bileşenleri yok sayılır.
Alfa bileşenleri olduğunu setColor gösterileriyle Benim test değil gözardı; bunun yerine, hala gri tonlama sağlarlar. Daha yüksek Alfa değerleri bir pikseli beyaza dönüştürür. Düşük Alfa değerleri, bir pikseli bildirim alanındaki arka plan rengine (cihazımda siyah) veya açılır bildirimde belirtilen renge döndürür. (Görünüşe göre diğerleri biraz farklı davranışlar bildirmiştir, bu yüzden unutmayın!)
Post android Lollipop sürümü android Bildirim çubuğunda bildirim simgelerini görüntülemek için yönergeleri değiştirdi. Resmi belgelerde "Renk içeren varlıkları güncelleyin veya kaldırın. Sistem, işlem simgelerinde ve ana bildirim simgesindeki tüm alfa dışı kanalları yok sayar. Bu simgelerin yalnızca alfa olacağını varsaymalısınız. Sistem, bildirim simgelerini beyaz çiziyor gri renk ve eylem simgeleri. ” Şimdi bunun meslekten olmayan terimlerle ifade ettiği şey, "Görüntünün göstermek istemediğiniz tüm bölümlerini saydam piksellere dönüştürün. Tüm renkler ve saydam olmayan pikseller beyaz "
Bunu ekran görüntüleri ile nasıl ayrıntılı olarak yapabileceğinizi buradan görebilirsiniz https://blog.clevertap.com/fixing-notification-icon-for-android-lollipop-and-above/
umarım yardımcı olur
Tek renkli şeffaf PNG görüntüsünü içe aktarmanız gerekir. Böylece küçük simgenin Simge rengini ayarlayabilirsiniz. Aksi takdirde MOTO gibi bazı cihazlarda beyaz gösterilir
GoogleFireBaseMessaging kullanıyorsanız, "bildirim" yararlı yükünde "simge kimliği" ayarlayabilirsiniz (beyaz çubuk simgesi sorununu çözmeme yardımcı olur):
{
"to":"<fb_id>",
"priority" : "high",
"notification" :
{
"title" : "title",
"body" : "body" ,
"sound" : "default",
"icon" : "ic_notification"
}
}
set ic_notification R.drawable kendi id.
Ayrıca bu konuda çok fazla sorunla karşılaştım, ancak internette arama yaptıktan sonra bu sorun için farklı çözümler buldum.Tüm çözümleri özetleyelim ve açıklayayım:
Not: Bu çözüm Phonegap cordova kullanıcıları içindir
<preference name="android-targetSdkVersion" value="20"/>
Android-targetSdkVersion değerinizi 21'den daha düşük bir değere ayarlamanız gerekir. Bu nedenle, bu değeri ayarladıktan sonra Android 6 (Marshmallow) 'a kadar bildirim simgesi görüntüsü görünecektir, Android 7'de (Nougat) çalışmaz. Bu çözüm benim için çalıştı.
<preference name="StatusBarStyle" value="lightcontent" />
Ancak bu çözüm yalnızca uygulamanız açıldığında çalışır. Yani, bu çözüm en iyi çözüm değil ama birçok kullanıcı için çalıştı.
Ve eminim yukarıdaki çözümlerden biri sorununuz için işe yarayacaktır.
API 21 hakkında konuşmak için çok geç olduğunu düşünüyorum, ancak kolay bir yol buldum.
'Özel Bildirim (özel düzen)' seçeneklerini kullanırken,
RemoteView'in en
setImageViewResource(int viewId, int srcId);
ve
setImageViewUri(int viewId, Uri uri);
bu resmi Lollipop'ta (API 21) beyaz yapar.
Ama kullanırken
setImageViewBitmap(int viewId, Bitmap bitmap);
Görüntü beyaz maskeli hale gelmez!
Belgelere göre, Android 3.0'dan (API Seviye 11) beri bildirim simgesi beyaz olmalıdır :
https://developer.android.com/guide/practices/ui_guidelines/icon_design_status_bar
"Durum çubuğu simgeleri, şeffaf bir zeminde yalnızca beyaz piksellerden oluşur ve düzgün kenarlar ve uygun olduğunda iç doku için kullanılan alfa harmanlaması bulunur."
Uygulama yığınında bu iki şeyi karıştırın
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"
<olmalıdır 21
.