ไอคอนแถบการแจ้งเตือนเปลี่ยนเป็นสีขาวใน Android 5 Lollipop


207

ฉันมีแอพที่แสดงการแจ้งเตือนที่กำหนดเอง ปัญหาคือเมื่อทำงานใน Android 5 ไอคอนขนาดเล็กในแถบการแจ้งเตือนจะปรากฏเป็นสีขาว ฉันจะแก้ไขสิ่งนี้ได้อย่างไร


Rahul Sharma และ basiam มีคำตอบที่ดีกว่าที่นี่ - stackoverflow.com/questions/30795431/ …
Rivu Chakraborty

มันเกิดขึ้นกับฉันเมื่อใช้งานใน Android 6 ไม่ใช่ 5
Jaime Montoya

แน่นอนว่ามันเกิดขึ้นกับ Android 5+ แน่นอนใน Android 6 และ 7 ตามเวลาที่คำถาม Android 5 เป็นรุ่นล่าสุดและคุณลักษณะที่ทำให้เกิดปัญหานี้ได้รับการเปิดตัวใน Android 5
Alejandro Casanova

ฉันคิดว่ามันแม่นยำกว่าที่จะบอกว่า API ระดับ 21 (Android 5.0), API ระดับ 22 (Android 5.1), API ระดับ 23 (Android 6.0) ฯลฯ คำว่า "Android 5" นั้นคลุมเครือเพราะคุณอาจพูดถึง Android 5.0 หรือ Android 5.1 และเมื่อฉันได้รับการทดสอบการแจ้งเตือนและวิธีที่ไอคอนปรากฏใน API ระดับ 22 เทียบกับ API ระดับ 23 ฉันรู้ว่าพวกเขาทำงานแตกต่างกัน
Jaime Montoya

คำตอบ:


269

คำตอบที่ยอมรับไม่ถูกต้อง (ทั้งหมด) แน่นอนว่ามันทำให้ไอคอนการแจ้งเตือนแสดงเป็นสี แต่ทำได้ด้วยข้อเสียเปรียบครั้งใหญ่ - โดยการตั้งค่า 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;
}

34
คุณสร้างเงาได้อย่างไร ฉันเป็นนักพัฒนาที่ไม่มีทักษะด้าน Photoshop และทำให้พื้นหลังโปร่งใสโดยใช้เครื่องมือออนไลน์ที่ยังคงส่งผลให้ไอคอนสีขาว
Chaitanya

6
@Chaitanya Use GIMP :)
ByteHamster

4
วิธีนี้ไม่ตอบคำถามที่ว่าทำไมกระบวนการสร้าง android ปรับเปลี่ยน PNG ที่ถูกต้องอย่างสมบูรณ์และบีบอัดและลบช่องอัลฟา
philk

6
developer.android.com/design/style/iconography.htmlนำไปสู่material.google.com/style/icons.htmlและเมื่อฉันกดctrl+fและพิมพ์notificationบนหน้านั้นจะไม่พบสิ่งใด ...
25

4
แทนการตรวจสอบจากตัวดัดแปลงโค้ดแพลตฟอร์มเวอร์ชัน applay ไปยังโฟลเดอร์ drawable - drawable / drawable-v21 และวางไอคอนที่เหมาะสม
Igor Wojda

72

เห็นด้วยอย่างสมบูรณ์กับผู้ใช้ 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

และอ้างอิงลิงค์นี้สำหรับขนาดไอคอนการแจ้งเตือนสำหรับข้อมูลเพิ่มเติม


4
นี่เป็นความคิดที่ดีมากสำหรับการตั้งค่าสีพื้นหลังเป็นการแจ้งเตือน setColor (your_color_resource_here)
TejaDroid

1
ดังนั้นฉันจึงลองทำสิ่งนี้และไอคอนการแจ้งเตือนจะมีพื้นหลังเป็นสีเมื่อฉันดึงเงาการแจ้งเตือนลงมา แต่ในถาดตัวเองมันยังคงเป็นไอคอนสีขาว
Stealth Rabbi

1
วิธีการแก้ปัญหานี้ถูกต้อง .. มีไอคอนการแจ้งเตือนที่โปร่งใสด้านหลัง .. และตามเงาไอคอนไม่จำเป็นต้องเป็นสีดำเท่านั้น .. ไอคอนสามารถมีสีได้ เพียงว่า Android L จะแปลงสีที่แสดงเป็นสีขาวและรุ่นก่อนหน้าของ Android จะแสดงไอคอนตามที่เป็นอยู่
Lakshay

กำลังเพิ่ม setColor ด้านล่างอมยิ้มแสดงไอคอน ic_launcher ดี แต่ใน 6.0 แสดงไอคอนสี่เหลี่ยมสีขาวโปรดช่วยฉัน
Harsha

ผมได้ทดสอบsetColorบนใช้ KitKat (API 19) และ IceCreamSandwich (API 15) ในกรณีที่ทั้งสองก็ไม่สนใจสี แต่ไม่ได้ผิดพลาด ดังนั้นฉันสามารถละเว้นการตรวจสอบเวอร์ชั่นของระบบปฏิบัติการได้อย่างปลอดภัยหรือไม่?
มาเรีย

47

นี่คือรหัสที่ 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" />

มีวิธีแก้ปัญหาหรือไม่? หรือฉันจะทำอย่างไรเพื่อแสดงไอคอนนั้นหรือไอคอนอื่นอย่างถูกต้อง
Alejandro Casanova

ฉันได้แก้ไขคำตอบของฉันเนื่องจากฉันพบวิธีแก้ปัญหาหลังจากอ่านซอร์สโค้ด Android
ByteHamster

4
ขอบคุณมากสำหรับความช่วยเหลือของคุณ แต่คุณช่วยให้ฉันด้วย "บริบท" ฉันต้องทำอะไร "รายการ" คืออะไร?
Alejandro Casanova

รหัสถูกนำมาจาก AOSP เพื่อแสดงว่าฉันพบวิธีแก้ปัญหาอย่างไรฉันได้เพิ่มคำอธิบายเล็ก ๆ เกี่ยวกับวิธีใช้งาน
ByteHamster

มันใช้งานได้จริง มีการเดาว่าทำไม Google ถึงทำเช่นนี้? นี่เป็นข้อบกพร่องหรือคุณสมบัติหรือไม่?
m02ph3u5

24

ในการหลีกเลี่ยงไอคอนการแจ้งเตือนให้เปลี่ยนเป็นสีขาวให้ใช้ไอคอน "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ได้


ฉันพยายามแปลงไอคอนของฉันโดยใช้ photoshop แต่ล้มเหลว แต่การเป็นแฟน irfanview ฉันลองมันอย่างรวดเร็วเมื่อฉันเห็นมันและมันทำงานได้อย่างมหัศจรรย์ ขอบคุณ!
บรูซ

15

อีกทางเลือกหนึ่งคือใช้ประโยชน์จากไดเรกทอรี (mipmap) drawable เฉพาะรุ่นเพื่อจัดหากราฟิกที่แตกต่างกันสำหรับ Lollipop และสูงกว่า

ในแอพของฉันไดเรกทอรี "v21" มีไอคอนที่มีข้อความโปร่งใสในขณะที่ไดเรกทอรีอื่น ๆ มีรุ่นที่ไม่โปร่งใส (สำหรับ Android รุ่นเก่ากว่า Lollipop)

ระบบไฟล์

ซึ่งควรมีลักษณะเช่นนี้:

Android Studio

ด้วยวิธีนี้คุณไม่จำเป็นต้องตรวจสอบหมายเลขรุ่นในรหัสเช่น

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


3
วิธีนี้ใช้งานได้และดูเหมือนกับโซลูชันทาง Android ที่สุด
Sergey Galin

คุณกำลังบอกว่าถ้า Android จะเลือกไอคอนจากโฟลเดอร์ mipmap-21 ถ้าเวอร์ชั่นอมยิ้มและถ้าน้อยกว่าอมยิ้มมันจะเลือกจาก drawable?
Lakshay

@Ian วิธีการไดเรกทอรีเป็นสิ่งที่ดีสำหรับทรัพยากรต่อ Android รุ่น แต่วิธีการที่คุณสามารถตั้งค่าsetColor(โดยไม่ต้องมีรหัสพิเศษ) ในวิธีการที่?
Daniel

@Daniel colors สามารถอยู่ในไดเรคทอรีเฉพาะเวอร์ชั่นได้เช่น "values" และ "values-v21"
เอียน

12

ตามแนวทางการออกแบบ 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)กับเครื่องมือสร้างของคุณเท่านั้น


11

ตอนนี้ android studio ให้บริการปลั๊กอิน Image Imageซึ่งจะสร้างไอคอนในโฟลเดอร์ drawbale ที่จำเป็นทั้งหมด

สินทรัพย์รูปภาพ Studio ช่วยให้คุณสร้างไอคอนประเภทต่าง ๆ ที่ความหนาแน่นต่างกันและแสดงให้คุณเห็นว่าพวกเขาจะอยู่ที่ไหนในโครงการของคุณ มันมีเครื่องมือสำหรับปรับไอคอนของคุณและเพิ่มฉากหลังทั้งหมดในขณะที่แสดงผลในบานหน้าต่างแสดงตัวอย่างเพื่อให้ปรากฏตามที่คุณต้องการ เครื่องมือเหล่านี้สามารถปรับปรุงการออกแบบไอคอนและกระบวนการนำเข้าได้อย่างมาก

คุณสามารถเข้าถึง Image Image ได้โดยคลิกใหม่> คลิกที่ตัวเลือก Image Image และจะมีหน้าต่างแสดงดังนี้: -

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่


8

ฉันกำลังเผชิญกับปัญหาเดียวกันและเป็นเพราะไอคอนการแจ้งเตือนแอปของฉันไม่แบน สำหรับ 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());
}

ไอคอนผิด
ป้อนคำอธิบายรูปภาพที่นี่

ไอคอนด้านขวา

ป้อนคำอธิบายรูปภาพที่นี่


1
คุณแก้ไขปัญหาตรงนี้ที่ไหน
IgorGanapolsky

วิธีสร้างไอคอนให้ถูกต้อง เป็นไปได้ที่จะสร้างออนไลน์? เครื่องมือใด ๆ ??
Jiks

@Jiks ใช่นี่คือลิงค์
Muhammad Sohaib Ayub

7

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) ในกรณีที่ทั้งสองก็ไม่สนใจสี แต่ไม่ได้ผิดพลาด ดังนั้นฉันสามารถละเว้นการตรวจสอบเวอร์ชั่นของระบบปฏิบัติการได้อย่างปลอดภัยหรือไม่?
มาเรีย

@JohnLee ฉันไม่คิดว่ามันจะผิดพลาดเพียง แต่อาจดูไม่ดีถ้าคุณไม่คำนึงถึง :-)
Ciro Santilli 郝海东冠状病病六四事件法轮功

3

ลบandroid:targetSdkVersion="21"จาก manifest.xml มันจะทำงาน! และจากนี้มันไม่มีปัญหาเลยใน apk ของคุณมันเป็นเคล็ดลับที่ฉันใช้สิ่งนี้และฉันพบไอคอนสีสันสดใสในการแจ้งเตือน


9
ความคิดที่ไม่ดีโดยสิ้นเชิงในการเล่น "เทคนิค" กับระบบ! ไม่ใช่ทางออก!
sud007

3

การแจ้งเตือนเป็นสีเทาตามที่อธิบายไว้ด้านล่าง พวกเขาไม่ใช่ขาวดำแม้จะมีคนอื่นเขียนไว้ก็ตาม คุณอาจเคยเห็นไอคอนที่มีหลายเฉดสีเช่นแถบความแข็งแรงของเครือข่าย

ก่อนหน้า API 21 (Lollipop 5.0) ไอคอนสีจะใช้งานได้ คุณสามารถบังคับให้แอปพลิเคชันของคุณกำหนดเป้าหมาย API 20 แต่นั่น จำกัด คุณสมบัติที่มีให้กับแอปพลิเคชันของคุณดังนั้นจึงไม่แนะนำ คุณสามารถทดสอบระดับ API ที่ทำงานอยู่และตั้งค่าไอคอนสีหรือไอคอน greyscale ได้อย่างเหมาะสม แต่สิ่งนี้อาจไม่คุ้มค่า ในกรณีส่วนใหญ่ควรใช้ไอคอน greyscale

ภาพมีสี่ช่องทาง RGBA (แดง / เขียว / น้ำเงิน / อัลฟา) สำหรับไอคอนการแจ้งเตือน Android จะละเว้นช่อง R, G และ B ช่องทางเดียวที่นับได้คืออัลฟ่าหรือที่รู้จักกันในชื่อความทึบ ออกแบบไอคอนด้วยเครื่องมือแก้ไขที่ให้คุณควบคุมค่าอัลฟ่าของสีวาดของคุณ

ค่าอัลฟ่าสร้างภาพ greyscale ได้อย่างไร:

  • Alpha = 0 (โปร่งใส) - พิกเซลเหล่านี้โปร่งใสแสดงสีพื้นหลัง
  • Alpha = 255 (ทึบแสง) - พิกเซลเหล่านี้เป็นสีขาว
  • Alpha = 1 ... 254 - พิกเซลเหล่านี้เป็นสิ่งที่คุณคาดหวังโดยให้เฉดสีระหว่างสีโปร่งใสและสีขาว

เปลี่ยนมันด้วยsetColor:

  • โทรNotificationCompat.Builder.setColor(int argb). จากเอกสารสำหรับNotification.color:

    สีที่ถูกเน้น (จำนวนเต็ม ARGB เช่นค่าคงที่ในสี) ที่จะนำไปใช้โดยแม่แบบลักษณะมาตรฐานเมื่อนำเสนอการแจ้งเตือนนี้ การออกแบบเทมเพลตปัจจุบันสร้างภาพส่วนหัวที่มีสีสันด้วยการซ้อนทับภาพไอคอน (stenciled in white) บนฟิลด์ของสีนี้ ส่วนประกอบอัลฟ่าจะถูกละเว้น

    การทดสอบของฉันกับ setColor แสดงให้เห็นว่าส่วนประกอบอัลฟ่าไม่ได้ถูกละเว้น แต่พวกเขายังคงให้เฉดสีเทาแทน ค่า Alpha ที่สูงขึ้นจะเปลี่ยนเป็นพิกเซลสีขาว ค่า Alpha ที่ต่ำกว่าเปลี่ยนพิกเซลเป็นสีพื้นหลัง (สีดำบนอุปกรณ์ของฉัน) ในพื้นที่แจ้งเตือนหรือเปลี่ยนเป็นสีที่ระบุในการแจ้งเตือนแบบเลื่อนลง (ดูเหมือนว่าคนอื่น ๆ รายงานพฤติกรรมที่แตกต่างกันเล็กน้อยดังนั้นโปรดระวัง!)


2

Post android android Lollipop release ได้เปลี่ยนแนวทางการแสดงไอคอนการแจ้งเตือนในแถบการแจ้งเตือน เอกสารอย่างเป็นทางการกล่าวว่า "อัปเดตหรือลบเนื้อหาที่เกี่ยวข้องกับสีระบบจะละเว้นช่องรายการที่ไม่ใช่ตัวอักษรทั้งหมดในไอคอนการดำเนินการและในไอคอนการแจ้งเตือนหลักคุณควรถือว่าไอคอนเหล่านี้เป็นตัวอักษรเท่านั้นระบบจะดึงไอคอนแจ้งเตือนเป็นสีขาว และไอคอนการกระทำเป็นสีเทาเข้ม” ในตอนนี้ความหมายของคำในการจัดวางคือ "แปลงทุกส่วนของภาพที่คุณไม่ต้องการให้แสดงเป็นพิกเซลโปร่งใส สีทั้งหมดและพิกเซลที่ไม่โปร่งใสจะแสดงเป็นสีขาว "

คุณสามารถดูวิธีการทำอย่างละเอียดพร้อมภาพหน้าจอได้ที่นี่ https://blog.clevertap.com/fixing-notification-icon-for-android-lollipop-and-above/

หวังว่าจะช่วย


2

คุณต้องนำเข้าภาพ PNG แบบโปร่งใสสีเดียว ดังนั้นคุณสามารถตั้งค่าสีไอคอนของไอคอนขนาดเล็กได้ มิฉะนั้นจะปรากฏเป็นสีขาวในอุปกรณ์บางอย่างเช่น MOTO


1

หากคุณใช้ GoogleFireBaseMessaging คุณสามารถตั้งค่า "ไอคอน id" ในส่วนของ "การแจ้งเตือน" (มันช่วยให้ฉันแก้ปัญหาไอคอนแถบสีขาว):

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

ตั้งค่าic_notificationเป็น id ของคุณเองจาก R.drawable


คุณวางไอคอนนั้นไว้ที่ไหน สิ่งที่ฉันได้รับคือไอคอนของแอพของฉันและไฟล์ R.drawable ทั้งหมดที่ฉันพบคือไฟล์ไบนารีคลาส
Shinzou

@kuhaku เขาอ้างถึงไฟล์ ic_launcher.png ในโฟลเดอร์ 'drawable'
จอห์นสัน

0

ฉันยังประสบปัญหามากเกินไปในเรื่องนี้ แต่หลังจากค้นหาทั่วอินเทอร์เน็ตฉันพบวิธีแก้ปัญหาที่แตกต่างกันสำหรับปัญหานี้ให้ฉันสรุปวิธีแก้ปัญหาทั้งหมดและอธิบาย:

หมายเหตุ: วิธีนี้มีไว้สำหรับผู้ใช้ Phonegap Cordova

  1. ตัวอย่าง

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

คุณต้องตั้งค่า android-targetSdkVersion ของคุณเป็นน้อยกว่า 21 ดังนั้นหลังจากตั้งค่าไอคอนรูปภาพการแจ้งเตือนจะปรากฏขึ้นจนถึง Android 6 (Marshmallow) มันจะไม่ทำงานใน Android 7 (Nougat) วิธีนี้ใช้ได้ผลสำหรับฉัน

  1. เปลี่ยน StatusbarStyle ในไฟล์ปรับแต่งของคุณ ตัวอย่าง

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

แต่โซลูชันนี้จะทำงานเฉพาะเมื่อเปิดแอปของคุณ ดังนั้นฉันเดาว่าโซลูชันนี้ไม่ใช่วิธีที่ดีที่สุด แต่ใช้ได้สำหรับผู้ใช้หลายคน

  1. ทำให้ไอคอนของคุณโปร่งใส วิธีนี้ใช้ได้ผลกับหลาย ๆ คน ที่จริงแล้วสิ่งนี้คือในการพัฒนา Native aplication เราต้องจัดเตรียมสามภาพ: (a) ไอคอนแอป (b) ไอคอนการแจ้งเตือน (c) ภาพไอคอนแถบสถานะ แต่ในกรณีของการพัฒนาแอปพลิเคชันมือถือไฮบริด ทำเช่นนั้น ดังนั้นทำให้ไอคอนของคุณโปร่งใสและวิธีนี้จะช่วยแก้ปัญหาของคุณ

และฉันมั่นใจว่าหนึ่งในวิธีการแก้ปัญหาข้างต้นจะได้ผลกับปัญหาของคุณ


0

FYI: หากไอคอนไม่ปรากฏให้ตรวจสอบว่าการกำหนดค่าการแจ้งเตือนในพื้นที่หรือระยะไกลของคุณมีชื่อไอคอนที่ถูกต้องเช่น

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

0

ฉันคิดว่ามันสายเกินไปที่จะพูดคุยเกี่ยวกับ API 21 แต่ฉันพบวิธีที่ง่าย

เมื่อใช้ 'การแจ้งเตือนที่กำหนดเอง (รูปแบบที่กำหนดเอง)

RemoteView ของ

setImageViewResource(int viewId, int srcId);

และ

setImageViewUri(int viewId, Uri uri); 

ทำให้รูปภาพเหล่านั้นเป็นสีขาวบน Lollipop (API 21)

แต่เมื่อใช้งาน

setImageViewBitmap(int viewId, Bitmap bitmap);

ภาพไม่เป็นสีขาว


0

ตามเอกสารอธิบายไอคอนการแจ้งเตือนจะต้องเป็นสีขาวตั้งแต่Android 3.0 (API ระดับ 11) :

https://developer.android.com/guide/practices/ui_guidelines/icon_design_status_bar

"ไอคอนแถบสถานะประกอบด้วยพิกเซลสีขาวบนฉากหลังโปร่งใสโดยมีการผสมอัลฟาที่ใช้สำหรับขอบที่ราบรื่นและพื้นผิวภายในตามความเหมาะสม"


-3

ผสมสองสิ่งนี้ในแอปเกร็ก

 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"
}

-38

android:targetSdkVersion="20"มันควรจะเป็น 21<


1
โปรดอย่าปฏิบัติตามวิธีนี้ตรวจสอบว่ามันอาจใช้งานได้ แต่จะต้องเสียค่าใช้จ่ายในการใช้งานแอพของคุณในโหมดความเข้ากันได้สำหรับ Android รุ่นใหม่กว่า
king_below_my_lord
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.