ฉันมีแอพที่แสดงการแจ้งเตือนที่กำหนดเอง ปัญหาคือเมื่อทำงานใน Android 5 ไอคอนขนาดเล็กในแถบการแจ้งเตือนจะปรากฏเป็นสีขาว ฉันจะแก้ไขสิ่งนี้ได้อย่างไร
ฉันมีแอพที่แสดงการแจ้งเตือนที่กำหนดเอง ปัญหาคือเมื่อทำงานใน Android 5 ไอคอนขนาดเล็กในแถบการแจ้งเตือนจะปรากฏเป็นสีขาว ฉันจะแก้ไขสิ่งนี้ได้อย่างไร
คำตอบ:
คำตอบที่ยอมรับไม่ถูกต้อง (ทั้งหมด) แน่นอนว่ามันทำให้ไอคอนการแจ้งเตือนแสดงเป็นสี แต่ทำได้ด้วยข้อเสียเปรียบครั้งใหญ่ - โดยการตั้งค่า SDK เป้าหมายให้ต่ำกว่า Android Lollipop!
หากคุณแก้ปัญหาไอคอนสีขาวของคุณโดยตั้งค่า SDK เป้าหมายเป็น 20 ตามที่แนะนำแอปของคุณจะไม่กำหนดเป้าหมาย Android Lollipop ซึ่งหมายความว่าคุณไม่สามารถใช้คุณสมบัติเฉพาะของ Lollipop ได้
ลองดูที่http://developer.android.com/design/style/iconography.htmlและคุณจะเห็นว่าสไตล์สีขาวเป็นวิธีการแจ้งเตือนที่จะแสดงใน Android Lollipop
ใน Lollipop Google ขอแนะนำให้คุณใช้สีที่จะปรากฏหลังไอคอนการแจ้งเตือน (สีขาว) - https://developer.android.com/about/versions/android-5.0-changes.html
ดังนั้นฉันคิดว่าทางออกที่ดีกว่าคือการเพิ่มไอคอนรูปเงาดำลงในแอพและใช้หากอุปกรณ์ใช้ Android Lollipop
ตัวอย่างเช่น
Notification notification = new Notification.Builder(context)
.setAutoCancel(true)
.setContentTitle("My notification")
.setContentText("Look, white in Lollipop, else color!")
.setSmallIcon(getNotificationIcon())
.build();
return notification;
และในเมธอด 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
บนหน้านั้นจะไม่พบสิ่งใด ...
เห็นด้วยอย่างสมบูรณ์กับผู้ใช้ Daniel Saidi เพื่อที่จะColor
ให้NotificationIcon
ฉันเขียนคำตอบนี้
สำหรับสิ่งที่คุณได้เพื่อให้ไอคอนเหมือนSilhouette
และทำให้ส่วนบางทุกที่ที่คุณต้องการที่จะเพิ่มของคุณTransparent
Colors
กล่าวคือ
คุณสามารถเพิ่มสีของคุณโดยใช้
.setColor(your_color_resource_here)
หมายเหตุ: setColor
มีให้เฉพาะในLollipop
ดังนั้นคุณต้องตรวจสอบ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)
...
}
นอกจากนี้คุณยังสามารถบรรลุนี้โดยใช้เป็นเป้าหมายLollipop
SDK
คำแนะนำเกี่ยวกับการNotificationIcon
ให้ที่Google คอนโซลนักพัฒนาซอฟต์แวร์แจ้งคู่มือสาย
ขนาดไอคอนการแจ้งเตือนที่ต้องการ 24x24dp
mdpi @ 24.00dp = 24.00px
hdpi @ 24.00dp = 36.00px
xhdpi @ 24.00dp = 48.00px
และอ้างอิงลิงค์นี้สำหรับขนาดไอคอนการแจ้งเตือนสำหรับข้อมูลเพิ่มเติม
setColor
บนใช้ KitKat (API 19) และ IceCreamSandwich (API 15) ในกรณีที่ทั้งสองก็ไม่สนใจสี แต่ไม่ได้ผิดพลาด ดังนั้นฉันสามารถละเว้นการตรวจสอบเวอร์ชั่นของระบบปฏิบัติการได้อย่างปลอดภัยหรือไม่?
นี่คือรหัสที่ Android ใช้เพื่อแสดงไอคอนการแจ้งเตือน:
// 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);
}
ดังนั้นคุณต้องตั้งค่าเวอร์ชั่น sdk เป้าหมายเป็นบางสิ่ง<21
และไอคอนจะคงสีไว้ นี่เป็นวิธีแก้ปัญหาที่น่าเกลียด แต่ทำในสิ่งที่คาดว่าจะทำ อย่างไรก็ตามฉันขอแนะนำให้ปฏิบัติตามหลักเกณฑ์การออกแบบของ Google : "ไอคอนการแจ้งเตือนจะต้องเป็นสีขาวทั้งหมด"
นี่คือวิธีที่คุณสามารถใช้งานได้:
หากคุณใช้ Gradle / Android Studio เพื่อสร้างแอปให้ใช้build.gradle
:
defaultConfig {
targetSdkVersion 20
}
มิฉะนั้น (Eclipse ฯลฯ ) ใช้AndroidManifest.xml
:
<uses-sdk android:minSdkVersion="..." android:targetSdkVersion="20" />
ในการหลีกเลี่ยงไอคอนการแจ้งเตือนให้เปลี่ยนเป็นสีขาวให้ใช้ไอคอน "Silhouette" สำหรับพวกเขาเช่น ภาพพื้นหลังสีขาวบนโปร่งใส คุณสามารถใช้Irfanviewเพื่อสร้าง:
IrfanView
กด F12 สำหรับเครื่องมือการทาสีล้างรูปภาพหากจำเป็น (ลบส่วนที่ไม่ต้องการเรียบและขัดเงา)Image / Decrease Color Depth
ถึง 2 (สำหรับภาพขาวดำ)Image / Negative
(สำหรับสีขาวบนภาพสีดำ)Image / Resize/Resample
ถึง 144 x 144 (ใช้ขนาดวิธี "ปรับขนาด" ไม่ใช่ "Resample" มิฉะนั้นรูปภาพจะเพิ่มเป็น 24 บิตต่อพิกเซล (24 BPP) อีกครั้งFile / Save as PNG
ตรวจสอบตรวจShow option dialog
สอบSave Transparent Color
คลิกSave
จากนั้นคลิกที่สีดำในภาพเพื่อตั้งค่าสีโปร่งใสAndroid ดูเหมือนว่าจะใช้ความละเอียดภาพ drawable-xxhdpi (144 x 144) เท่านั้นดังนั้นคัดลอกที่เกิดของคุณไฟล์ic_notification.png
\AndroidStudio\Projects\...\app\src\main\res\drawable-xxhdpi
ใช้.setSmallIcon(R.drawable.ic_notification)
ในรหัสของคุณหรือใช้getNotificationIcon()
ตามที่ Daniel Saidi แนะนำไว้ข้างต้น
คุณสามารถใช้Studio สินทรัพย์ของ Android ของ Roman Nurikได้
อีกทางเลือกหนึ่งคือใช้ประโยชน์จากไดเรกทอรี (mipmap) drawable เฉพาะรุ่นเพื่อจัดหากราฟิกที่แตกต่างกันสำหรับ Lollipop และสูงกว่า
ในแอพของฉันไดเรกทอรี "v21" มีไอคอนที่มีข้อความโปร่งใสในขณะที่ไดเรกทอรีอื่น ๆ มีรุ่นที่ไม่โปร่งใส (สำหรับ Android รุ่นเก่ากว่า Lollipop)
ซึ่งควรมีลักษณะเช่นนี้:
ด้วยวิธีนี้คุณไม่จำเป็นต้องตรวจสอบหมายเลขรุ่นในรหัสเช่น
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);
ในทำนองเดียวกันคุณสามารถอ้างอิง "ic_notification" (หรืออะไรก็ได้ที่คุณเลือกที่จะเรียกมัน) ใน GCM payload ของคุณหากคุณใช้แอตทริบิวต์ "icon"
https://developers.google.com/cloud-messaging/http-server-ref#notification-payload-support
setColor
(โดยไม่ต้องมีรหัสพิเศษ) ในวิธีการที่?
ตามแนวทางการออกแบบ Android คุณต้องใช้รูปเงาดำสำหรับbuilder.setSmallIcon(R.drawable.some_notification_icon);
แต่ถ้าคุณยังต้องการแสดงไอคอนที่มีสีสันเป็นไอคอนการแจ้งเตือนนี่คือเคล็ดลับสำหรับอมยิ้มและเหนือใช้รหัสด้านล่าง largeIcon จะทำหน้าที่เป็นไอคอนการแจ้งเตือนหลักและคุณยังต้องใส่ภาพเงาสำหรับ smallIcon เนื่องจากจะแสดงที่ด้านล่างขวาของ 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));
}
และ pre-lollipop ใช้เฉพาะ.setSmallIcon(R.mipmap.ic_launcher)
กับเครื่องมือสร้างของคุณเท่านั้น
ตอนนี้ android studio ให้บริการปลั๊กอิน Image Imageซึ่งจะสร้างไอคอนในโฟลเดอร์ drawbale ที่จำเป็นทั้งหมด
สินทรัพย์รูปภาพ Studio ช่วยให้คุณสร้างไอคอนประเภทต่าง ๆ ที่ความหนาแน่นต่างกันและแสดงให้คุณเห็นว่าพวกเขาจะอยู่ที่ไหนในโครงการของคุณ มันมีเครื่องมือสำหรับปรับไอคอนของคุณและเพิ่มฉากหลังทั้งหมดในขณะที่แสดงผลในบานหน้าต่างแสดงตัวอย่างเพื่อให้ปรากฏตามที่คุณต้องการ เครื่องมือเหล่านี้สามารถปรับปรุงการออกแบบไอคอนและกระบวนการนำเข้าได้อย่างมาก
คุณสามารถเข้าถึง Image Image ได้โดยคลิกใหม่> คลิกที่ตัวเลือก Image Image และจะมีหน้าต่างแสดงดังนี้: -
ฉันกำลังเผชิญกับปัญหาเดียวกันและเป็นเพราะไอคอนการแจ้งเตือนแอปของฉันไม่แบน สำหรับ Android รุ่นอมยิ้มหรือต่ำกว่าอมยิ้มไอคอนการแจ้งเตือนแอปของคุณควรแบนอย่าใช้ไอคอนด้วยเงา ฯลฯ
ด้านล่างเป็นรหัสที่ทำงานได้อย่างสมบูรณ์แบบบน 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());
}
ไอคอนผิด
ไอคอนด้านขวา
alpha-channelเป็นข้อมูลเดียวของภาพที่ Android ใช้สำหรับไอคอนการแจ้งเตือน:
alpha == 1
: พิกเซลแสดงเป็นสีขาวalpha == 0
: พิกเซลแสดงเป็นสีที่คุณเลือก Notification.Builder#setColor(int)
เรื่องนี้ถูกกล่าวถึงที่https://developer.android.com/about/versions/android-5.0-changes.html :
ระบบจะละเว้นช่องที่ไม่ใช่ตัวอักษรทั้งหมดในไอคอนการกระทำและในไอคอนการแจ้งเตือนหลัก คุณควรถือว่าไอคอนเหล่านี้เป็นแบบตัวอักษรเท่านั้น
drawable ในตัวเกือบทั้งหมดดูเหมือนจะเป็นภาพอัลฟ่าที่เหมาะสมสำหรับเรื่องนี้ดังนั้นคุณอาจใช้สิ่งต่อไปนี้:
Notification.Builder.setColor(Color.RED)
.setSmallIcon(android.R.drawable.star_on)
แต่ฉันยังคงมองหาเอกสาร APIที่ยืนยันอย่างเป็นทางการ
ทดสอบกับ Android 22
setColor
บนใช้ KitKat (API 19) และ IceCreamSandwich (API 15) ในกรณีที่ทั้งสองก็ไม่สนใจสี แต่ไม่ได้ผิดพลาด ดังนั้นฉันสามารถละเว้นการตรวจสอบเวอร์ชั่นของระบบปฏิบัติการได้อย่างปลอดภัยหรือไม่?
ลบandroid:targetSdkVersion="21"
จาก manifest.xml มันจะทำงาน! และจากนี้มันไม่มีปัญหาเลยใน apk ของคุณมันเป็นเคล็ดลับที่ฉันใช้สิ่งนี้และฉันพบไอคอนสีสันสดใสในการแจ้งเตือน
การแจ้งเตือนเป็นสีเทาตามที่อธิบายไว้ด้านล่าง พวกเขาไม่ใช่ขาวดำแม้จะมีคนอื่นเขียนไว้ก็ตาม คุณอาจเคยเห็นไอคอนที่มีหลายเฉดสีเช่นแถบความแข็งแรงของเครือข่าย
ก่อนหน้า API 21 (Lollipop 5.0) ไอคอนสีจะใช้งานได้ คุณสามารถบังคับให้แอปพลิเคชันของคุณกำหนดเป้าหมาย API 20 แต่นั่น จำกัด คุณสมบัติที่มีให้กับแอปพลิเคชันของคุณดังนั้นจึงไม่แนะนำ คุณสามารถทดสอบระดับ API ที่ทำงานอยู่และตั้งค่าไอคอนสีหรือไอคอน greyscale ได้อย่างเหมาะสม แต่สิ่งนี้อาจไม่คุ้มค่า ในกรณีส่วนใหญ่ควรใช้ไอคอน greyscale
ภาพมีสี่ช่องทาง RGBA (แดง / เขียว / น้ำเงิน / อัลฟา) สำหรับไอคอนการแจ้งเตือน Android จะละเว้นช่อง R, G และ B ช่องทางเดียวที่นับได้คืออัลฟ่าหรือที่รู้จักกันในชื่อความทึบ ออกแบบไอคอนด้วยเครื่องมือแก้ไขที่ให้คุณควบคุมค่าอัลฟ่าของสีวาดของคุณ
ค่าอัลฟ่าสร้างภาพ greyscale ได้อย่างไร:
เปลี่ยนมันด้วยsetColor
:
โทรNotificationCompat.Builder.setColor(int argb)
. จากเอกสารสำหรับNotification.color
:
สีที่ถูกเน้น (จำนวนเต็ม ARGB เช่นค่าคงที่ในสี) ที่จะนำไปใช้โดยแม่แบบลักษณะมาตรฐานเมื่อนำเสนอการแจ้งเตือนนี้ การออกแบบเทมเพลตปัจจุบันสร้างภาพส่วนหัวที่มีสีสันด้วยการซ้อนทับภาพไอคอน (stenciled in white) บนฟิลด์ของสีนี้ ส่วนประกอบอัลฟ่าจะถูกละเว้น
การทดสอบของฉันกับ setColor แสดงให้เห็นว่าส่วนประกอบอัลฟ่าไม่ได้ถูกละเว้น แต่พวกเขายังคงให้เฉดสีเทาแทน ค่า Alpha ที่สูงขึ้นจะเปลี่ยนเป็นพิกเซลสีขาว ค่า Alpha ที่ต่ำกว่าเปลี่ยนพิกเซลเป็นสีพื้นหลัง (สีดำบนอุปกรณ์ของฉัน) ในพื้นที่แจ้งเตือนหรือเปลี่ยนเป็นสีที่ระบุในการแจ้งเตือนแบบเลื่อนลง (ดูเหมือนว่าคนอื่น ๆ รายงานพฤติกรรมที่แตกต่างกันเล็กน้อยดังนั้นโปรดระวัง!)
Post android android Lollipop release ได้เปลี่ยนแนวทางการแสดงไอคอนการแจ้งเตือนในแถบการแจ้งเตือน เอกสารอย่างเป็นทางการกล่าวว่า "อัปเดตหรือลบเนื้อหาที่เกี่ยวข้องกับสีระบบจะละเว้นช่องรายการที่ไม่ใช่ตัวอักษรทั้งหมดในไอคอนการดำเนินการและในไอคอนการแจ้งเตือนหลักคุณควรถือว่าไอคอนเหล่านี้เป็นตัวอักษรเท่านั้นระบบจะดึงไอคอนแจ้งเตือนเป็นสีขาว และไอคอนการกระทำเป็นสีเทาเข้ม” ในตอนนี้ความหมายของคำในการจัดวางคือ "แปลงทุกส่วนของภาพที่คุณไม่ต้องการให้แสดงเป็นพิกเซลโปร่งใส สีทั้งหมดและพิกเซลที่ไม่โปร่งใสจะแสดงเป็นสีขาว "
คุณสามารถดูวิธีการทำอย่างละเอียดพร้อมภาพหน้าจอได้ที่นี่ https://blog.clevertap.com/fixing-notification-icon-for-android-lollipop-and-above/
หวังว่าจะช่วย
คุณต้องนำเข้าภาพ PNG แบบโปร่งใสสีเดียว ดังนั้นคุณสามารถตั้งค่าสีไอคอนของไอคอนขนาดเล็กได้ มิฉะนั้นจะปรากฏเป็นสีขาวในอุปกรณ์บางอย่างเช่น MOTO
หากคุณใช้ GoogleFireBaseMessaging คุณสามารถตั้งค่า "ไอคอน id" ในส่วนของ "การแจ้งเตือน" (มันช่วยให้ฉันแก้ปัญหาไอคอนแถบสีขาว):
{
"to":"<fb_id>",
"priority" : "high",
"notification" :
{
"title" : "title",
"body" : "body" ,
"sound" : "default",
"icon" : "ic_notification"
}
}
ตั้งค่าic_notificationเป็น id ของคุณเองจาก R.drawable
ฉันยังประสบปัญหามากเกินไปในเรื่องนี้ แต่หลังจากค้นหาทั่วอินเทอร์เน็ตฉันพบวิธีแก้ปัญหาที่แตกต่างกันสำหรับปัญหานี้ให้ฉันสรุปวิธีแก้ปัญหาทั้งหมดและอธิบาย:
หมายเหตุ: วิธีนี้มีไว้สำหรับผู้ใช้ Phonegap Cordova
<preference name="android-targetSdkVersion" value="20"/>
คุณต้องตั้งค่า android-targetSdkVersion ของคุณเป็นน้อยกว่า 21 ดังนั้นหลังจากตั้งค่าไอคอนรูปภาพการแจ้งเตือนจะปรากฏขึ้นจนถึง Android 6 (Marshmallow) มันจะไม่ทำงานใน Android 7 (Nougat) วิธีนี้ใช้ได้ผลสำหรับฉัน
<preference name="StatusBarStyle" value="lightcontent" />
แต่โซลูชันนี้จะทำงานเฉพาะเมื่อเปิดแอปของคุณ ดังนั้นฉันเดาว่าโซลูชันนี้ไม่ใช่วิธีที่ดีที่สุด แต่ใช้ได้สำหรับผู้ใช้หลายคน
และฉันมั่นใจว่าหนึ่งในวิธีการแก้ปัญหาข้างต้นจะได้ผลกับปัญหาของคุณ
FYI: หากไอคอนไม่ปรากฏให้ตรวจสอบว่าการกำหนดค่าการแจ้งเตือนในพื้นที่หรือระยะไกลของคุณมีชื่อไอคอนที่ถูกต้องเช่น
'largeIcon' => 'ic_launcher',
'smallIcon' => 'ic_launcher' // defaults to ic_launcher,
ฉันคิดว่ามันสายเกินไปที่จะพูดคุยเกี่ยวกับ API 21 แต่ฉันพบวิธีที่ง่าย
เมื่อใช้ 'การแจ้งเตือนที่กำหนดเอง (รูปแบบที่กำหนดเอง)
RemoteView ของ
setImageViewResource(int viewId, int srcId);
และ
setImageViewUri(int viewId, Uri uri);
ทำให้รูปภาพเหล่านั้นเป็นสีขาวบน Lollipop (API 21)
แต่เมื่อใช้งาน
setImageViewBitmap(int viewId, Bitmap bitmap);
ภาพไม่เป็นสีขาว
ตามเอกสารอธิบายไอคอนการแจ้งเตือนจะต้องเป็นสีขาวตั้งแต่Android 3.0 (API ระดับ 11) :
https://developer.android.com/guide/practices/ui_guidelines/icon_design_status_bar
"ไอคอนแถบสถานะประกอบด้วยพิกเซลสีขาวบนฉากหลังโปร่งใสโดยมีการผสมอัลฟาที่ใช้สำหรับขอบที่ราบรื่นและพื้นผิวภายในตามความเหมาะสม"
ผสมสองสิ่งนี้ในแอปเกร็ก
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"
มันควรจะเป็น 21
<