ฉันมีแอพที่แสดงการแจ้งเตือนที่กำหนดเอง ปัญหาคือเมื่อทำงานใน 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)
    ...            
}
นอกจากนี้คุณยังสามารถบรรลุนี้โดยใช้เป็นเป้าหมายLollipopSDK
คำแนะนำเกี่ยวกับการ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<