Thông báo đẩy Android: Biểu tượng không hiển thị trong thông báo, thay vào đó là hình vuông màu trắng


179

Ứng dụng của tôi tạo thông báo, nhưng biểu tượng tôi đặt cho thông báo đó sẽ không được hiển thị. Thay vào đó tôi có được một hình vuông màu trắng.

Tôi đã thử thay đổi kích thước png của biểu tượng (kích thước 720x720, 66x66, 44x44, 22x22). Thật kỳ lạ, khi sử dụng kích thước nhỏ hơn hình vuông màu trắng nhỏ hơn.

Tôi đã giải quyết vấn đề này, cũng như cách tạo thông báo chính xác và từ những gì tôi đã đọc mã của mình phải chính xác. Đáng buồn là mọi thứ không như họ nên được.

Điện thoại của tôi là Nexus 5 với Android 5.1.1. Vấn đề cũng xuất hiện trên các trình giả lập, Samsung Galaxy s4 với Android 5.0.1 và Motorola Moto G với Android 5.0.1 (cả hai đều tôi đã mượn và không có ngay bây giờ)

Mã cho thông báo sau, và hai ảnh chụp màn hình. Nếu bạn cần thêm thông tin, xin vui lòng yêu cầu.

Cảm ơn tất cả.

@SuppressLint("NewApi") private void sendNotification(String msg, String title, String link, Bundle bundle) {
    NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    Intent resultIntent = new Intent(getApplicationContext(), MainActivity.class);
    resultIntent.putExtras(bundle);
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
            resultIntent, Intent.FLAG_ACTIVITY_NEW_TASK);
    Notification notification;
    Uri sound = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.notificationsound);
    notification = new Notification.Builder(this)
                .setSmallIcon(R.drawable.lg_logo)
                .setContentTitle(title)
                .setStyle(new Notification.BigTextStyle().bigText(msg))
                .setAutoCancel(true)
                .setContentText(msg)
                .setContentIntent(contentIntent)
                .setSound(sound)
                .build();
    notificationManager.notify(0, notification);
}

không mở thông báo thông báo đã mở



1
Đây là một tác phẩm xoay quanh stackoverflow.com/a/39142981/1939564
Muhammad Babar

đã khắc phục vấn đề này? Tôi vẫn đang đối mặt với cùng một vấn đề, trong thanh trạng thái trên cùng vẫn hiển thị khoảng trắng cho thông báo nếu tôi thêm hình ảnh trong suốt
AngelJanniee

Có, tôi đã sửa nó bằng cách tạo một biểu tượng trong suốt hoặc nhắm mục tiêu SDK phiên bản 20 trở xuống. Nếu điều này không khắc phục được thì có lẽ vấn đề tương tự của bạn có một nguyên nhân khác. Tôi khuyên bạn nên đặt phiên bản SDK mục tiêu thành 20 và kiểm tra xem điều này có thay đổi gì không. Nếu không, không chắc câu hỏi này có thể giúp bạn không :(
Blueriver

Câu trả lời:


188

Nguyên nhân: Đối với 5.0 Lollipop "Biểu tượng thông báo phải hoàn toàn trắng".

Nếu chúng tôi giải quyết vấn đề biểu tượng màu trắng bằng cách đặt SDK mục tiêu thành 20, ứng dụng của chúng tôi sẽ không nhắm mục tiêu Android Lollipop, điều đó có nghĩa là chúng tôi không thể sử dụng các tính năng dành riêng cho Lollipop.

Giải pháp cho mục tiêu Sdk 21

Nếu bạn muốn hỗ trợ Biểu tượng Vật liệu Lollipop thì hãy tạo biểu tượng trong suốt cho Lollipop và phiên bản cao hơn. Vui lòng tham khảo sau: https://design.google.com/icons/

Vui lòng xem tại http://developer.android.com/design/style/iconography.html và chúng tôi sẽ thấy rằng phong cách màu trắng là cách thông báo được hiển thị trong Android Lollipop.

Trong Lollipop, Google cũng đề xuất rằng chúng tôi sử dụng màu sẽ được hiển thị phía sau biểu tượng thông báo màu trắng. Liên kết tham khảo: https://developer.android.com/about/versions/android-5.0-changes.html

Bất cứ nơi nào chúng tôi muốn thêm Màu sắc https://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html#setColor(int)

Việc triển khai Trình tạo thông báo cho phiên bản hệ điều hành Lollipop bên dưới và bên trên sẽ là:

Notification notification = new NotificationCompat.Builder(this);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    notification.setSmallIcon(R.drawable.icon_transperent);
    notification.setColor(getResources().getColor(R.color.notification_color));
} else { 
    notification.setSmallIcon(R.drawable.icon);
} 

Lưu ý: setColor chỉ khả dụng trong Lollipop và nó chỉ ảnh hưởng đến nền của biểu tượng.

Nó sẽ giải quyết vấn đề của bạn hoàn toàn !!


Ồ, cảm ơn bạn. Tôi nghĩ rằng họ NÊN hoàn toàn trắng, vì một số ứng dụng tôi có trên điện thoại có biểu tượng màu. Bây giờ tôi thấy lý do. Cảm ơn bạn!
Blueriver

3
Bằng cách nói targetSdkVersion 20 , bạn đã cứu ngày của tôi! cảm ơn rất nhiều.
Arshad Ali

11
Hình thức xấu của nó để đặt phiên bản targetSDK thành <21 chỉ vì lợi ích của các biểu tượng. Tốt hơn hết là sửa nó đúng cách, như được mô tả trong câu trả lời này: stackoverflow.com/questions/27343202/ trên
user90766

1
nhưng trong nền khi ứng dụng không nằm trong ngăn xếp, nó sẽ hiển thị các biểu tượng màu trắng, phải làm gì để có kết quả tương tự trong mọi trường hợp
Pratik Vyas

1
Tôi đã thử mọi cách nhưng nó không hoạt động. nó vẫn đang hiển thị dấu chấm với một màu được đề cập trong tệp kê khai
Harsh Shah

67

Nếu bạn đang sử dụng Google Cloud Messaging, thì vấn đề này sẽ không được giải quyết bằng cách thay đổi biểu tượng của bạn. Ví dụ: điều này sẽ không hoạt động:

 Notification notification  = new Notification.Builder(this)
                .setContentTitle(title)
                .setContentText(text)
                .setSmallIcon(R.drawable.ic_notification)
                .setContentIntent(pIntent)
                .setDefaults(Notification.DEFAULT_SOUND|Notification.DEFAULT_LIGHTS|Notification.DEFAULT_VIBRATE)
                .setAutoCancel(true)
                .build();

Ngay cả khi ic_notification là trong suốt và trắng. Nó cũng phải được xác định trong dữ liệu meta Manifest, như vậy:

  <meta-data android:name="com.google.firebase.messaging.default_notification_icon"

            android:resource="@drawable/ic_notification" />

Siêu dữ liệu nằm dưới applicationthẻ, để tham khảo.


6
Cảm ơn bạn rất nhiều vì gợi ý với dữ liệu meta bên trong bảng kê khai.
Eugen Timm

Làm thế nào để bạn đặt "@ drawable / ic_notification"? nó là một biểu tượng? nhiều không có phải là PNG không?
Luke Pighetti

1
@LukePighetti có thể nhiều nếu bạn tải lên các hình ảnh có kích thước khác nhau cho nhiều độ phân giải màn hình. Mặt khác, có, nó có thể là một tệp PNG trên thư mục drawable của bạn.
Ruchir Baronia

1
@RuchirBaronia vậy ví dụ trên res/drawable/ic_notification.pngcó kích thước 196x196?
Luke Pighetti

thx @RuchirBaronia, được nâng cấp cho Meta-datađề xuất thẻ.
Ravi Vaniya

37

Tôi thực sự đề xuất theo Nguyên tắc thiết kế của Google :

trong đó có ghi "Biểu tượng thông báo phải hoàn toàn màu trắng."


2
Câu trả lời của bạn thậm chí còn tốt hơn câu tôi đã chấp nhận. Ước gì tôi cũng có thể chấp nhận bạn. Tôi không thể, nhưng bạn có +1 và lòng biết ơn của tôi. Chúc mừng!
Blueriver

2
Đây không phải là một câu trả lời rất tốt. Điều gì xảy ra nếu, các bên liên quan của dự án cần phải nhắm mục tiêu Android 7? Tôi không thể chỉ nhắm mục tiêu bất kỳ phiên bản SDK nào trước đó.
Chiến tranh neon

1
Đánh giá thấp câu trả lời này vì nó sai. Người hỏi cho biết tôi không thể chạy ứng dụng của mình trên sdk21. Trả lời "không sử dụng sdk 21"
Utsav Gupta

1
Đây thực sự không phải là một giải pháp.
Jose Gómez

1
Tôi không thể tìm thấy bất cứ điều gì trong hướng dẫn thiết kế hiện tại chỉ định rằng biểu tượng phải có màu trắng trên nền trong suốt. Bất kể tài liệu nghèo nàn, nó dường như vẫn là trường hợp.
19 lúc 3:42

29

Khai báo mã này trong Bản kê khai Android:

<meta-data android:name="com.google.firebase.messaging.default_notification_icon" 

android:resource="@drawable/ic_stat_name" />

Tôi hy vọng điều này hữu ích cho bạn.


Ôi trời! Điều này hoạt động hoàn hảo cho các thông báo đẩy FCM! Cảm ơn
Crono

1
Bạn đang đặt ở ic_stat_nameđâu? Có phải là một png? có nhiều không xin vui lòng giúp đỡ!
Luke Pighetti

3
@Luke Pighetti Trong Android Studio Nhấp chuột phải vào Ứng dụng >> Mới >> Tài sản hình ảnh >> IconType (Thông báo)
vicky mahale

1
(Tôi biết đã được một lúc nhưng) Bạn có thể giải thích điều này? Nó phải làm gì đây? Nó làm cho biểu tượng không màu trong suốt đầy đủ hoặc những gì?
afe

Đây là câu trả lời thích hợp cho các thông báo nhắn tin đám mây firebase.
Greg Ellis

11

(Android Studio 3.5) Nếu bạn là phiên bản gần đây của Android Studio, bạn có thể tạo hình ảnh thông báo của mình. Nhấp chuột phải vào thư mục res của bạn > Mới> Tài sản hình ảnh . Sau đó, bạn sẽ thấy Cấu hình tài sản hình ảnh như trong hình bên dưới. Thay đổi biểu tượng Loại để thông báo Icons . Hình ảnh của bạn phải trắng và trong suốt. Đây Assets Cấu hình ảnh sẽ thi hành luật đó. Quan trọng:Cấu hình tài sản hình ảnh Nếu bạn muốn các biểu tượng được sử dụng cho thông báo đám mây / đẩy, bạn phải thêm siêu dữ liệu dưới thẻ ứng dụng của mình để sử dụng các biểu tượng thông báo mới được tạo.

  <application>
      ...
      <meta-data android:name="com.google.firebase.messaging.default_notification_icon"
          android:resource="@drawable/ic_notification" />

10

Chúng ta có thể làm như dưới đây:

Tạo một đối tượng mới của trình tạo thông báo và gọi setSmallIcon() bằng cách sử dụng đối tượng trình tạo thông báo như trong đoạn mã dưới đây.

Tạo một phương thức trong đó chúng tôi sẽ kiểm tra phiên bản HĐH nào chúng tôi sẽ cài đặt ứng dụng của mình. Nếu nó nằm dưới Lolipop tức là API 21 thì nó sẽ lấy biểu tượng ứng dụng bình thường với màu nền khác, nó sẽ lấy biểu tượng ứng dụng trong suốt mà không có bất kỳ nền nào. Vì vậy, các thiết bị sử dụng phiên bản os> = 21 sẽ đặt màu nền của biểu tượng bằng phương thức setColor()lớp xây dựng Thông báo.

Mã mẫu:

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);

notificationBuilder.setSmallIcon(getNotificationIcon(notificationBuilder));

private int getNotificationIcon(NotificationCompat.Builder notificationBuilder) {

   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
             int color = 0x008000;
             notificationBuilder.setColor(color);
             return R.drawable.app_icon_lolipop_above;

    } 
    return R.drawable.app_icon_lolipop_below;
}

Tôi đã thử nghiệm setColortrên Kitkat (API 19) và IceCreamSandwich (API 15), trong cả hai trường hợp, nó đã bỏ qua màu sắc nhưng không bị lỗi . Vì vậy, tôi có thể bỏ qua việc kiểm tra phiên bản hệ điều hành một cách an toàn không?
Maria

10

Thử cái này

Tôi đã phải đối mặt với cùng một vấn đề tôi đã thử rất nhiều anwers nhưng không nhận được bất kỳ giải pháp nào, cuối cùng tôi đã tìm ra cách giải quyết vấn đề của mình.

- tạo biểu tượng thông báo với nền trong suốt. Chiều rộng và chiều cao của ứng dụng phải giống như kích thước bên dưới và dán tất cả các kích thước này vào dự án của bạn-> ứng dụng-> src-> main-> res

  • MDPI 24 * 24

  • HDPI 36 * 36

  • XHDPI 48 * 48

  • XXHDPI 72 * 72


sau khi dán ở trên dòng dưới đây trong phương thức onMessageReceured của bạn


Intent intent = new Intent(this, News.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
                    PendingIntent.FLAG_ONE_SHOT);
            Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);
            if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
            {
                notificationBuilder.setSmallIcon(R.drawable.notify)
                                      //            .setContentTitle(title)
                            //                        .setContentText(message)
                        .setAutoCancel(true)
                        .setSound(defaultSoundUri)
                        .setContentIntent(pendingIntent);
            } else
                {
                    notificationBuilder.setSmallIcon(R.drawable.notify)
                       //                                .setContentTitle(title)
                        //                        .setContentText(message)
                            .setAutoCancel(true)
                            .setSound(defaultSoundUri)
                            .setContentIntent(pendingIntent);
            }
            NotificationManager notificationManager =
                    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            notificationManager.notify(0, notificationBuilder.build());

Đừng quên thêm mã này vào tệp kê khai

<meta-data 
android:name="com.google.firebase.messaging.default_notification_icon" 
android:resource="@drawable/app_icon" />

10
 <meta-data android:name="com.google.firebase.messaging.default_notification_icon"

        android:resource="@drawable/ic_notification" />

thêm dòng này vào tệp manifest.xml trong khối ứng dụng


7

Nếu bạn muốn cung cấp biểu tượng thông báo hỗ trợ kẹo mút thì hãy tạo biểu tượng thông báo hai loại:

  1. biểu tượng thông báo bình thường: cho phiên bản kẹo mút bên dưới.
  2. biểu tượng thông báo với nền trong suốt: cho kẹo mút và phiên bản trên.

Bây giờ hãy đặt biểu tượng thích hợp cho trình tạo thông báo vào thời gian chạy trên phiên bản HĐH:

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    mBuilder.setSmallIcon(R.drawable.ic_push_notification_transperent);
} else {
    mBuilder.setSmallIcon(R.drawable.ic_push_notification);
}

7

Cuối cùng tôi đã có giải pháp cho vấn đề này.

Sự cố này chỉ xảy ra khi ứng dụng hoàn toàn không chạy. (không ở nền cũng không phải ở nền trước) . Khi ứng dụng chạy trên nền trước hoặc nền, biểu tượng thông báo được hiển thị đúng . (Không phải hình vuông màu trắng)

Vì vậy, những gì chúng ta phải đặt là cùng một cấu hình cho biểu tượng thông báo trong API cuối cùng như của Frontend.

Ở frontend, chúng tôi đã sử dụng React Native và để thông báo đẩy, chúng tôi đã sử dụng gói npm Reac -igen-fcm .

FCM.on("notification", notif => {
   FCM.presentLocalNotification({
       body: notif.fcm.body,
       title: notif.fcm.title,
       big_text: notif.fcm.body,
       priority: "high",
       large_icon: "notification_icon", // notification icon
       icon: "notification_icon",
       show_in_foreground: true,
       color: '#8bc34b',
       vibrate: 300,
       lights: true,
       status: notif.status
   });
});

Chúng tôi đã sử dụng gói npm-đẩy npm bằng Node.js làm phụ trợ cho thông báo đẩy và đặt cấu trúc tải trọng như sau.

{
  to: '/topics/user', // required
  data: {
    id:212,
    message: 'test message',
    title: 'test title'
  },
  notification: {
    title: 'test title',
    body: 'test message',
    icon : 'notification_icon', // same name as mentioned in the front end
    color : '#8bc34b',
    click_action : "BROADCAST"
  }
}

Những gì nó về cơ bản tìm kiếm hình ảnh notify_icon được lưu trữ cục bộ trong hệ thống Android của chúng tôi.


1
Vấn đề của bạn RẤT khác với tôi, mặc dù nó có tác dụng tương tự. Cảm ơn bạn đã đăng câu trả lời này, nó có thể sẽ giúp ai đó sử dụng cùng ngăn xếp công nghệ mà bạn đang sử dụng.
Blueriver

1
@IanWarburton: Không cần.
Aniruddha Shevle

5

Thông báo là thang độ xám như được giải thích dưới đây. Chúng không phải là màu đen và trắng, bất chấp những gì người khác đã viết. Bạn có thể đã thấy các biểu tượng với nhiều sắc thái, như các thanh cường độ mạng.

Trước API 21 (Lollipop 5.0), các biểu tượng màu hoạt động. Bạn có thể buộc ứng dụng của mình nhắm mục tiêu API 20, nhưng điều đó giới hạn các tính năng có sẵn cho ứng dụng của bạn, vì vậy không nên sử dụng ứng dụng này. Bạn có thể kiểm tra mức API đang chạy và đặt biểu tượng màu hoặc biểu tượng thang độ xám một cách thích hợp, nhưng điều này có thể không đáng giá. Trong hầu hết các trường hợp, tốt nhất là đi với một biểu tượng thang độ xám.

Hình ảnh có bốn kênh, RGBA (đỏ / xanh / xanh / alpha). Đối với các biểu tượng thông báo, Android bỏ qua các kênh R, G và B. Kênh duy nhất được tính là Alpha, còn được gọi là độ mờ. Thiết kế biểu tượng của bạn với trình chỉnh sửa cho phép bạn kiểm soát giá trị Alpha của màu vẽ.

Cách các giá trị Alpha tạo ra hình ảnh thang độ xám:

  • Alpha = 0 (trong suốt) - Những pixel này trong suốt, hiển thị màu nền.
  • Alpha = 255 (mờ đục) - Những pixel này có màu trắng.
  • Alpha = 1 ... 254 - Những pixel này chính xác là những gì bạn mong đợi, cung cấp các sắc thái giữa trong suốt và trắng.

Thay đổi nó bằng setColor:

  • Gọi NotificationCompat.Builder.setColor(int argb). Từ tài liệu cho Notification.color:

    Màu nhấn (một số nguyên ARGB như các hằng số trong Màu) sẽ được áp dụng bởi các mẫu Kiểu chuẩn khi trình bày thông báo này. Thiết kế mẫu hiện tại xây dựng một hình ảnh tiêu đề đầy màu sắc bằng cách phủ lên hình ảnh biểu tượng (được tô màu trắng) trên một trường có màu này. Các thành phần Alpha bị bỏ qua.

    Thử nghiệm của tôi với setColor cho thấy các thành phần Alpha không bị bỏ qua. Giá trị Alpha cao hơn biến một pixel trắng. Các giá trị Alpha thấp hơn biến pixel thành màu nền (màu đen trên thiết bị của tôi) trong vùng thông báo hoặc thành màu được chỉ định trong thông báo kéo xuống.


5

Tôi đã giải quyết vấn đề bằng cách thêm mã dưới đây vào tệp kê khai,

    <meta-data
        android:name="com.google.firebase.messaging.default_notification_icon"
        android:resource="@drawable/ic_stat_name" />

    <meta-data
        android:name="com.google.firebase.messaging.default_notification_color"
        android:resource="@color/black" />

nơi ic_stat_nameđược tạo trên Android Studio Nhấp chuột phải vào res >> Mới >> Tài sản hình ảnh >> IconType (Thông báo)

Và một bước nữa tôi phải làm ở phía máy chủ php với tải trọng thông báo

$message = [
    "message" => [
        "notification" => [
            "body"  => $title , 
            "title" => $message
        ],

        "token" => $token,

    "android" => [
           "notification" => [
            "sound"  => "default",
            "icon"  => "ic_stat_name"
            ]
        ],

       "data" => [
            "title" => $title,
            "message" => $message
         ]


    ]
];

Lưu ý phần

    "android" => [
           "notification" => [
            "sound"  => "default",
            "icon"  => "ic_stat_name"
            ]
        ]

trong đó tên biểu tượng "icon" => "ic_stat_name"nên được đặt cùng trên bảng kê khai.



4

Tôi đã tìm thấy một liên kết nơi chúng ta có thể tạo biểu tượng màu trắng của riêng mình,

thử liên kết này để tạo biểu tượng màu trắng của biểu tượng trình khởi chạy của bạn.

Mở Liên kết này và tải lên ic_launcher hoặc biểu tượng thông báo của bạn


1

Bạn có thể sử dụng biểu tượng khác nhau cho các phiên bản khác nhau. Chỉ cần đặt logic trên biểu tượng của bạn như thế này:

int icon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? R.drawable.colored_: R.drawable.white_tint_icon_for_lolipop_or_upper;

1

Đối với SDK> = 23, vui lòng thêm setLargeIcon

notification = new Notification.Builder(this)
            .setSmallIcon(R.drawable.ic_launcher)
            .setLargeIcon(context.getResources(), R.drawable.lg_logo))
            .setContentTitle(title)
            .setStyle(new Notification.BigTextStyle().bigText(msg))
            .setAutoCancel(true)
            .setContentText(msg)
            .setContentIntent(contentIntent)
            .setSound(sound)
            .build();

1

Để giảm các phiên bản cụ thể của SDK, bạn chỉ cần thực hiện việc này: (thay thế '#' thành '0x')

Notification notification = new NotificationCompat.Builder(this);
notification.setSmallIcon(R.drawable.icon_transperent);
notification.setColor(0x169AB9); //for color: #169AB9

0xFF169AB9, bạn đang thiếu kênh alpha hoàn toàn mờ đục.
Eugen Pechanec

0

Khi bạn muốn giữ biểu tượng đầy màu sắc - Workaround
Thêm pixel với màu sắc hơi khác nhau vào biểu tượng.
Trong trường hợp của tôi, một biểu tượng màu đen với sắc thái và ánh sáng. Khi thêm pixel màu xanh đậm nó hoạt động.


0

Tôi có vấn đề tương tự trên Android 8.0. Cố gắng sử dụng tài nguyên biểu tượng TRẮNG. Tôi có hình vuông màu trắng khi tôi đang cố gắng sử dụng hình ảnh màu cho biểu tượng, khi tôi thay thế nó thành biểu tượng màu trắng, nó bắt đầu hoạt động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.