Android Push Notifications: Ikon tidak ditampilkan dalam notifikasi, kotak putih malah ditampilkan

179

Aplikasi saya menghasilkan pemberitahuan, tetapi ikon yang saya tetapkan untuk pemberitahuan itu tidak ditampilkan. Sebaliknya saya mendapatkan kotak putih.

Saya telah mencoba mengubah ukuran png ikon (dimensi 720x720, 66x66, 44x44, 22x22). Anehnya, ketika menggunakan dimensi yang lebih kecil kotak putih lebih kecil.

Saya telah memeriksa masalah ini di Google, serta cara yang benar untuk menghasilkan notifikasi, dan dari apa yang saya baca, kode saya harus benar. Sayangnya hal-hal tidak seperti yang seharusnya.

Ponsel saya adalah Nexus 5 dengan Android 5.1.1. Masalah juga ada pada emulator, Samsung Galaxy s4 dengan Android 5.0.1 dan Motorola Moto G dengan Android 5.0.1 (keduanya saya pinjam, dan tidak punya sekarang)

Kode untuk notifikasi berikut, dan dua tangkapan layar. Jika Anda memerlukan informasi lebih lanjut, silakan bertanya.

Terima kasih semua.

@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);
}

tanpa membuka notifikasi pemberitahuan dibuka

Blueriver
sumber
4
Kemungkinan duplikat ikon Notification bar berubah putih di Android 5 Lollipop
Ciro Santilli 郝海东 冠状 病 六四 事件 事件
1
Ini adalah karya seputar stackoverflow.com/a/39142981/1939564
Muhammad Babar
apakah memperbaiki masalah ini? masih saya menghadapi masalah yang sama, di bilah status atas masih menunjukkan ruang putih untuk pemberitahuan jika saya menambahkan gambar transparan
AngelJanniee
Ya, saya memperbaikinya dengan membuat ikon transparan atau menargetkan SDK versi 20 atau lebih rendah. Jika ini tidak memperbaikinya untuk Anda, mungkin masalah Anda yang serupa memiliki penyebab yang berbeda. Saya menyarankan untuk menetapkan target versi SDK ke 20 dan memeriksa apakah ini mengubah sesuatu. Jika tidak, tidak yakin apakah pertanyaan ini dapat membantu Anda :(
Blueriver

Jawaban:

188

Penyebab: Untuk 5.0 Lollipop "Ikon pemberitahuan harus seluruhnya putih".

Jika kami memecahkan masalah ikon putih dengan menetapkan target SDK ke 20, aplikasi kami tidak akan menargetkan Android Lollipop, yang berarti bahwa kami tidak dapat menggunakan fitur khusus Lollipop.

Solusi untuk target Sdk 21

Jika Anda ingin mendukung Ikon Bahan Lollipop maka buatlah ikon transparan untuk Lollipop dan versi di atas. Silakan lihat berikut ini: https://design.google.com/icons/

Silakan lihat http://developer.android.com/design/style/iconography.html , dan kita akan melihat bahwa gaya putih adalah bagaimana notifikasi dimaksudkan untuk ditampilkan di Android Lollipop.

Di Lollipop, Google juga menyarankan agar kami menggunakan warna yang akan ditampilkan di belakang ikon pemberitahuan putih. Tautan Rujukan: https://developer.android.com/about/versions/android-5.0-changes.html

Di mana pun kami ingin menambahkan Warna https://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html#setColor(int)

Implementasi Notification Builder untuk versi OS Lollipop di bawah dan di atas adalah:

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);
} 

Catatan: setColor hanya tersedia di Lollipop dan hanya memengaruhi latar belakang ikon.

Ini akan menyelesaikan masalah Anda sepenuhnya !!

Garima Mathur
sumber
Wow Terimakasih. Saya pikir mereka HARUS seluruhnya putih, karena beberapa aplikasi yang saya miliki di ponsel saya memiliki ikon warna. Sekarang saya melihat alasannya. Terima kasih!
Blueriver
3
Dengan mengatakan targetSdkVersion 20 , Anda menghemat hari saya! Terima kasih banyak.
Arshad Ali
11
Bentuknya buruk untuk mengatur versi targetSDK ke <21 hanya demi ikon. Lebih baik memperbaikinya dengan cara yang benar, seperti dijelaskan dalam jawaban ini: stackoverflow.com/questions/27343202/…
user90766
1
tetapi di latar belakang ketika aplikasi tidak dalam tumpukan itu menunjukkan ikon putih, apa yang harus dilakukan untuk mendapatkan hasil yang sama dalam hal apapun
Pratik Vyas
1
Saya mencoba segalanya tetapi tidak berhasil. masih menunjukkan titik dengan penyebutan warna dalam file manifes
Harsh Shah
67

Jika Anda menggunakan Google Cloud Messaging, maka masalah ini tidak akan diselesaikan dengan hanya mengubah ikon Anda. Misalnya, ini tidak akan berfungsi:

 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();

Bahkan jika ic_notification transparan dan putih. Itu juga harus didefinisikan dalam meta data Manifest, seperti:

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

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

Meta-data berada di bawah applicationtag, untuk referensi.

Ruchir Baronia
sumber
6
Terima kasih banyak atas petunjuknya dengan meta data di dalam manifes.
Eugen Timm
bagaimana Anda menempatkan "@ drawable / ic_notification"? apakah itu satu ikon? banyak? apakah itu PNG?
Luke Pighetti
1
@LukePighetti bisa banyak jika Anda mengunggah gambar berukuran berbeda untuk resolusi layar ganda. Kalau tidak, ya, itu mungkin satu file PNG di direktori Anda yang dapat digambar.
Ruchir Baronia
1
@RuchirBaronia jadi untuk contoh res/drawable/ic_notification.pngukuran 196x196 di atas?
Luke Pighetti
thx @RuchirBaronia, terunggah untuk Meta-datasaran tag.
Ravi Vaniya
37

Saya sangat menyarankan mengikuti Panduan Desain Google :

yang mengatakan "Ikon pemberitahuan harus seluruhnya putih."

NJ
sumber
2
Jawaban Anda bahkan lebih baik daripada yang saya terima. Seandainya aku bisa menerima milikmu juga. Saya tidak bisa, tetapi Anda memiliki +1 saya dan rasa terima kasih saya. Bersulang!
Blueriver
2
Ini bukan jawaban yang sangat bagus. Bagaimana jika, para pemangku kepentingan proyek diperlukan untuk menargetkan Android 7? Saya tidak bisa hanya menargetkan versi SDK apa pun sebelum itu.
Neon Warge
1
Menurunkan jawaban ini karena salah. Penanya mengatakan saya tidak dapat menjalankan aplikasi saya di SDK21. Jawaban mengatakan "jangan gunakan sdk 21"
Utsav Gupta
1
Ini benar-benar bukan solusi.
Jose Gómez
1
Saya tidak dapat menemukan apa pun dalam pedoman desain saat ini yang menentukan bahwa ikon harus berwarna putih dengan latar belakang transparan. Terlepas dari dokumentasi yang buruk, sepertinya masih demikian.
imagio
29

Nyatakan kode ini di Android Manifest:

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

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

Semoga bermanfaat bagi Anda.

vicky mahale
sumber
Astaga! Yang ini berfungsi sempurna untuk pemberitahuan push FCM! Terima kasih
Crono
1
Di mana Anda menempatkan ic_stat_name? Apakah ini satu png? apakah ini banyak? tolong bantu!
Luke Pighetti
3
@Luke Pighetti Di Android Studio Klik kanan pada App >> Baru >> Aset Gambar >> IconType (Pemberitahuan)
vicky mahale
1
(Saya tahu ini sudah lama tetapi) Bisakah Anda jelaskan ini? Apa yang seharusnya dilakukan? Apakah itu membuat ikon penuh warna tidak transparan atau apa?
afe
Ini jawaban yang tepat untuk pemberitahuan olahpesan cloud firebase.
Greg Ellis
11

(Android Studio 3.5) Jika Anda adalah Android Studio versi terbaru, Anda dapat menghasilkan gambar notifikasi. Klik kanan pada folder res Anda > New> Image Asset . Anda kemudian akan melihat Mengkonfigurasi Aset Gambar seperti yang ditunjukkan pada gambar di bawah ini. Ubah Jenis Ikon menjadi Ikon Pemberitahuan . Gambar Anda harus putih dan transparan. Aset Gambar Konfigurasi ini akan menegakkan aturan itu. Konfigurasikan Aset Gambar Penting: Jika Anda ingin ikon digunakan untuk pemberitahuan cloud / push, Anda harus menambahkan meta-data di bawah tag aplikasi Anda untuk menggunakan ikon pemberitahuan yang baru dibuat.

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

Kita bisa melakukan seperti di bawah ini:

Buat objek baru pembuat pemberitahuan dan panggilan setSmallIcon() menggunakan objek pembuat pemberitahuan seperti dalam kode di bawah ini.

Buat metode di mana kami akan memeriksa versi OS yang kami instal aplikasi kami. Jika di bawah Lolipop yaitu API 21 maka akan mengambil ikon aplikasi normal dengan warna latar belakang yang lain itu akan mengambil ikon aplikasi transparan tanpa latar belakang apa pun. Jadi perangkat yang menggunakan versi os> = 21 akan mengatur warna latar belakang ikon menggunakan metodesetColor() kelas pembangun Pemberitahuan.

Kode sampel:

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;
}
rahul sharma
sumber
Saya sudah menguji setColorpada Kitkat (API 19) dan IceCreamSandwich (API 15), dalam kedua kasus itu mengabaikan warna tetapi tidak crash . Jadi bisakah saya dengan aman menghilangkan memeriksa versi OS?
Maria
10

Coba ini

saya menghadapi masalah yang sama saya mencoba banyak jawaban tetapi tidak mendapatkan solusi, akhirnya saya menemukan cara untuk menyelesaikan masalah saya.

- Membuat ikon pemberitahuan dengan latar belakang transparan. Lebar dan tinggi aplikasi harus seperti ukuran di bawah ini dan tempel semua ini di proyek Anda-> aplikasi-> src-> main-> res

  • MDPI 24 * 24

  • HDPI 36 * 36

  • XHDPI 48 * 48

  • XXHDPI 72 * 72


setelah di atas tempelkan baris di bawah ini dalam metode onMessageReceived Anda


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());

Jangan lupa untuk menambahkan kode ini dalam file manifes

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

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

tambahkan baris ini dalam file manifest.xml di blok aplikasi

Sajidh Zahir
sumber
7

Jika Anda ingin memberikan ikon pemberitahuan dukungan lollipop maka buat dua jenis ikon pemberitahuan:

  1. ikon pemberitahuan normal: untuk versi lollipop di bawah ini.
  2. ikon pemberitahuan dengan latar belakang transparan: untuk lollipop dan versi di atas.

Sekarang atur ikon yang sesuai untuk pembuat notifikasi pada run time base pada versi OS:

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);
}
Haresh Chhelana
sumber
7

Akhirnya saya punya solusi untuk masalah ini.

Masalah ini terjadi hanya ketika aplikasi sama sekali tidak berjalan. (baik di latar belakang maupun di latar depan) . Saat aplikasi berjalan di latar depan atau di belakang, ikon pemberitahuan ditampilkan dengan benar . (Bukan kotak putih)

Jadi yang harus kita atur adalah konfigurasi yang sama untuk ikon notifikasi di Backend APIs seperti pada Frontend.

Di frontend kami telah menggunakan React Native dan untuk push notification kami telah menggunakan paket react-native-fcm npm .

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
   });
});

Kami telah menggunakan paket fcm-push npm menggunakan Node.js sebagai backend untuk pemberitahuan push dan mengatur struktur payload sebagai berikut.

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

Apa yang pada dasarnya mencari gambar notification_icon disimpan secara lokal di sistem Android kami.

Aniruddha Shevle
sumber
1
Masalah Anda SANGAT berbeda dengan masalah saya, meskipun memiliki efek yang sama. Terima kasih telah mengirim jawaban ini, mungkin akan membantu seseorang menggunakan tumpukan teknologi yang sama dengan yang Anda gunakan.
Blueriver
1
@IanWarburton: Tidak perlu.
Aniruddha Shevle
5

Notifikasi abu - abu seperti yang dijelaskan di bawah ini. Mereka tidak hitam-putih, terlepas dari apa yang ditulis orang lain. Anda mungkin telah melihat ikon dengan banyak corak, seperti bilah kekuatan jaringan.

Sebelum API 21 (Lollipop 5.0), ikon warna berfungsi. Anda dapat memaksa aplikasi Anda untuk menargetkan API 20, tetapi itu membatasi fitur yang tersedia untuk aplikasi Anda, jadi itu tidak dianjurkan. Anda dapat menguji level API yang sedang berjalan dan mengatur ikon warna atau ikon skala abu-abu dengan tepat, tetapi ini mungkin tidak bermanfaat. Dalam kebanyakan kasus, yang terbaik adalah menggunakan ikon skala abu-abu.

Gambar memiliki empat saluran, RGBA (merah / hijau / biru / alfa). Untuk ikon notifikasi, Android mengabaikan saluran R, G, dan B. Satu-satunya saluran yang diperhitungkan adalah Alpha, juga dikenal sebagai opacity. Desain ikon Anda dengan editor yang memberi Anda kendali atas nilai Alpha warna gambar Anda.

Bagaimana nilai-nilai Alpha menghasilkan gambar skala abu-abu:

  • Alpha = 0 (transparan) - Pixel ini transparan, menunjukkan warna latar belakang.
  • Alpha = 255 (opaque) - Pixel ini berwarna putih.
  • Alpha = 1 ... 254 - Pixel ini persis seperti yang Anda harapkan, memberikan nuansa antara transparan dan putih.

Mengubahnya dengan setColor:

  • Panggil NotificationCompat.Builder.setColor(int argb). Dari dokumentasi untuk Notification.color:

    Warna aksen (bilangan bulat ARGB seperti konstanta dalam Warna) untuk diterapkan oleh templat Gaya standar saat menyajikan pemberitahuan ini. Desain template saat ini membangun gambar header berwarna-warni dengan overlay gambar ikon (stensil putih) di atas bidang warna ini. Komponen alfa diabaikan.

    Pengujian saya dengan setColor menunjukkan bahwa komponen Alpha tidak diabaikan. Nilai Alpha yang lebih tinggi menjadikan piksel putih. Nilai Alpha yang lebih rendah mengubah piksel ke warna latar belakang (hitam di perangkat saya) di area notifikasi, atau ke warna yang ditentukan dalam notifikasi pull-down.

Jeremy Frank
sumber
5

Saya telah menyelesaikan masalah dengan menambahkan kode di bawah ini ke manifes,

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

di mana ic_stat_namedibuat di Android Studio Klik kanan pada res >> Baru >> Aset Gambar >> IconType (Pemberitahuan)

Dan satu langkah lagi yang harus saya lakukan di sisi server php dengan notifikasi payload

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

        "token" => $token,

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

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


    ]
];

Perhatikan bagian ini

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

di mana nama ikon "icon" => "ic_stat_name"harus sama pada manifes.

Haris
sumber
4

Saya menemukan tautan di mana kita dapat menghasilkan ikon putih kita sendiri,

coba tautan ini untuk menghasilkan ikon putih ikon peluncur Anda.

Buka Tautan ini dan unggah ikon ic_launcher atau pemberitahuan Anda

Ghanshyam Nayma
sumber
1

Anda dapat menggunakan ikon berbeda untuk versi berbeda. Cukup setel logika pada ikon Anda seperti ini:

int icon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? R.drawable.colored_: R.drawable.white_tint_icon_for_lolipop_or_upper;
Md. Al-Rasel
sumber
1

Untuk SDK> = 23, silakan tambahkan 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();
Caat c
sumber
1

Untuk mengurangi versi spesifik SDK, Anda cukup melakukan ini: (ganti '#' ke '0x')

Notification notification = new NotificationCompat.Builder(this);
notification.setSmallIcon(R.drawable.icon_transperent);
notification.setColor(0x169AB9); //for color: #169AB9
dongkichan
sumber
0xFF169AB9, Anda kehilangan saluran alfa yang sepenuhnya buram.
Eugen Pechanec
0

Saat Anda ingin menyimpan ikon berwarna-warni - Penanganan masalah
Tambahkan piksel dengan warna yang sedikit berbeda menjadi ikon.
Dalam kasus saya, ada ikon hitam dengan nuansa dan cahaya. Ketika ditambahkan piksel biru gelap itu berfungsi.

Vouskopes
sumber
0

Saya memiliki masalah serupa di Android 8.0. Cobalah untuk menggunakan sumber daya ikon PUTIH. Saya memiliki kotak putih ketika saya mencoba menggunakan gambar berwarna untuk ikon, ketika saya menggantinya dengan ikon putih, itu mulai bekerja.

Zeon
sumber