Android Push Bildirimleri: Simge bildirimde görüntülenmiyor, bunun yerine beyaz kare gösteriliyor


179

Uygulamam bir bildirim oluşturuyor, ancak bu bildirim için ayarladığım simge görüntülenmiyor. Bunun yerine beyaz bir kare alıyorum.

Simgenin pngını yeniden boyutlandırmayı denedim (boyutlar 720x720, 66x66, 44x44, 22x22). İlginçtir ki, daha küçük boyutlar kullanılırken beyaz kare daha küçüktür.

Bu sorunu googled yanı sıra, bildirim oluşturmak için doğru yolu ve ne okudum benim kod doğru olmalıdır. Ne yazık ki işler olması gerektiği gibi değil.

Telefonum Android 5.1.1 yüklü bir Nexus 5. Emülatörlerde, Android 5.0.1 yüklü bir Samsung Galaxy s4 ve Android 5.0.1 yüklü bir Motorola Moto G (her ikisi de ödünç aldığım ve şu anda sahip olmadığım) üzerinde de sorun var

Aşağıdaki bildirimler için kod ve iki ekran görüntüsü. Daha fazla bilgiye ihtiyacınız varsa, lütfen sormaya çekinmeyin.

Hepinize teşekkür ederim.

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

bildirimi açmadan bildirimler açıldı




bu sorunu çözdü mü? hala şeffaf bir görüntü eklerseniz üst durum çubuğunda hala bildirim için beyaz boşluk gösteren aynı sorunla karşı karşıya
AngelJanniee 16:17

Evet, şeffaf bir simge oluşturarak veya SDK sürüm 20 veya daha düşük bir sürümünü hedefleyerek düzelttim. Bu sizin için düzeltmezse, benzer sorunun farklı bir nedeni olabilir. Hedef SDK sürümünü 20 olarak ayarlamanızı ve bunun bir şey değiştirip değiştirmediğini kontrol etmenizi öneririm. Değilse, bu sorunun size yardımcı olup olmayacağından emin değilim :(
Blueriver

Yanıtlar:


188

Neden: 5.0 Lollipop için "Bildirim simgeleri tamamen beyaz olmalıdır".

Beyaz simge sorununu hedef SDK'yı 20'ye ayarlayarak çözersek, uygulamamız Android Lollipop'u hedeflemez, bu da Lollipop'a özgü özellikleri kullanamayacağımız anlamına gelir.

Hedef SDK 21 için çözüm

Lollipop Material Icons'ı desteklemek istiyorsanız, Lollipop ve üzeri sürümler için şeffaf simgeler yapın. Lütfen aşağıdakilere bakın: https://design.google.com/icons/

Lütfen http://developer.android.com/design/style/iconography.html adresine bakın. ; beyaz stilin, bildirimlerin Android Lollipop'ta nasıl görüntülenmesi gerektiğini göreceğiz.

Lollipop'ta Google, beyaz bildirim simgesinin arkasında görüntülenecek bir renk kullanmanızı öneriyor. Bakınız Bağlantı: https://developer.android.com/about/versions/android-5.0-changes.html

Nereye Renkler eklemek istiyorsak https://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html#setColor(int)

Lollipop OS sürümünün altında ve üstünde için Bildirim Oluşturucu uygulaması şöyle olacaktır:

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

Not: setColor yalnızca Lollipop'ta kullanılabilir ve yalnızca simgenin arka planını etkiler.

Sorununuzu tamamen çözecek !!


Vay canına, teşekkür ederim. Telefonumdaki bazı uygulamalarda renk simgeleri olduğu için tamamen beyaz olması gerektiğini düşündüm. Şimdi sebebini görüyorum. Teşekkür ederim!
Blueriver

3
TargetSdkVersion 20 diyerek günümü kurtardın! çok teşekkürler.
Arshad Ali

11
Sadece simgeler uğruna targetSDK sürümünü <21 olarak ayarlamak kötü bir formdur. Bu cevapta açıklandığı gibi doğru şekilde düzeltmek daha iyidir: stackoverflow.com/questions/27343202/…
user90766

1
ancak uygulama yığınta olmadığında arka planda beyaz simgeler gösteriyor, her durumda aynı sonucu almak için ne yapmalı
Pratik Vyas

1
Her şeyi denedim ama işe yaramıyor. hala manifest dosyasında bir renk sözü ile nokta gösteriyor
Harsh Shah

67

Google Cloud Messaging kullanıyorsanız , simgenizi değiştirerek bu sorun çözülmeyecektir . Örneğin, bu işe yaramaz:

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

İc_notification şeffaf ve beyaz olsa bile . Ayrıca, Manifest meta verilerinde de tanımlanmalıdır:

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

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

Meta veriler applicationreferans olarak etiketin altına girer .


6
Manifest içindeki meta verilerle ilgili ipucu için teşekkür ederiz.
Eugen Timm

"@ drawable / ic_notification" nasıl yerleştirilir? bir ikon mu? Birçok? PNG mi?
Luke Pighetti

1
@LukePighetti, birden çok ekran çözünürlüğü için farklı boyutlu görüntüler yüklüyorsanız çok olabilir. Aksi takdirde, evet, çekilebilir dizininizdeki bir PNG dosyası olabilir.
Ruchir Baronia

1
@RuchirBaronia 196x196 res/drawable/ic_notification.pngboyutunun yukarıdaki örneği için mi?
Luke Pighetti

thx @RuchirBaronia, Meta-dataetiket önerisi için seçildi .
Ravi Vaniya

37

Google'ın Tasarım Yönergeleri'ne uymanızı gerçekten öneririm :

hangi diyor "Bildirim simgeleri tamamen beyaz olmalı."


2
Cevabınız kabul ettiğim yanıttan daha iyi. Ben de seninkini kabul edebilseydim. Yapamam, ama +1 ve minnettarlığım var. Şerefe!
Blueriver

2
Bu çok iyi bir cevap değil. Ya projenin paydaşlarının Android 7'yi hedeflemesi gerekiyorsa? Bundan önce herhangi bir SDK sürümünü hedefleyemiyorum.
Neon Warge

1
Bu cevabı yanlış olduğu için reddetti. Sorgulayan, sdk21'de uygulamamı çalıştıramayacağımı söylüyor. Cevap "sdk 21 kullanmayın" diyor
Utsav Gupta

1
Bu gerçekten bir çözüm değil.
Jose Gómez

1
Geçerli tasarım yönergelerinde simgenin saydam bir arka plan üzerinde beyaz olması gerektiğini belirten hiçbir şey bulamıyorum. Kötü belgelere bakılmaksızın, durum hala böyle görünmektedir.
imagio

29

Android Manifest'te bu kodu bildirin:

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

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

Umarım bu sizin için yararlıdır.


Aman! Bu FCM push bildirimleri için mükemmel çalışıyor! Teşekkürler
Crono

1
Nereye koyuyorsun ic_stat_name? Bir png mi? çok mu lütfen yardım et!
Luke Pighetti

3
@Luke Pighetti Android Studio'da Uygulamaya sağ tıklayın >> Yeni >> Görüntü Varlıkları >> IconType (Bildirim)
vicky mahale

1
(Bir süre geçtiğini biliyorum ama) Lütfen bunu açıklayabilir misiniz? Ne yapması gerekiyor? Tam renkli şeffaf olmayan simgeyi oluşturuyor mu veya ne?
afe

Bu firebase bulut mesajlaşma bildirimleri için uygun cevap.
Greg Ellis

11

(Android Studio 3.5) Android Studio'nun yeni bir sürümüyseniz bildirim resimlerinizi oluşturabilirsiniz. Res klasörünüze sağ tıklayın > Yeni> Görüntü Varlığı . Ardından , aşağıdaki resimde gösterildiği gibi Görüntü Varlıklarını Yapılandırma'yı göreceksiniz . Değişim Simge Tipi için Bildirim Simgeleri . Resimlerinizin beyaz ve şeffaf olması gerekir. Bu Görüntü Varlıklarını Yapılandır bu kuralı uygular. Önemli: Simgelerin bulut / push bildirimleri için kullanılmasını istiyorsanız, yeni oluşturulan bildirim simgelerini kullanmak için uygulama etiketinizin altına meta verileri eklemeniz gerekir.Görüntü Varlıklarını Yapılandırma

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

10

Aşağıdaki gibi yapabiliriz:

Yeni bir setSmallIcon()bildirim oluşturucu nesnesi oluşturun ve aşağıdaki kodda olduğu gibi bildirim oluşturucu nesnesini kullanarak arayın .

Uygulamamızı hangi işletim sistemi sürümünü yüklediğimizi kontrol edeceğimiz bir yöntem oluşturun. Lolipop yani API 21'in altındaysa, arka plan rengiyle normal uygulama simgesini alacaktır, başka bir arka plan olmadan şeffaf uygulama simgesini alacaktır. Bu nedenle os sürümü> = 21 kullanan cihazlar setColor(), Bildirim oluşturucu sınıfının yöntemini kullanarak simgenin arka plan rengini ayarlar .

Basit kod:

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

setColorKitkat (API 19) ve IceCreamSandwich (API 15) üzerinde test ettim , her iki durumda da rengi görmezden geldi, ancak çökmedi . İşletim sistemi sürümünü güvenli bir şekilde atlayabilir miyim?
Maria

10

Bunu dene

i anwers çok denedim ama herhangi bir çözüm alamadım aynı sorunla karşı karşıyaydı, nihayet benim sorunu çözmek için bir yol buldum.

- şeffaf arka plan ile bildirim simgesi yapmak.Uygulamanın genişliği ve yüksekliği aşağıdaki boyutlarda gibi olmalı ve tüm bunları projenize yapıştırın-> app-> src-> main-> res

  • MDPI 24 * 24

  • HDPI 36 * 36

  • XHDPI 48 * 48

  • XXHDPI 72 * 72


yukarıdakilerden sonra bunu aşağıdaki satırı onMessageReceived yönteminize yapıştırı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());

Bu kodu bildirim dosyasına eklemeyi unutmayın

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

bu satırı uygulama bloğundaki manifest.xml dosyasına ekleyin


7

Lolipop desteği bildirim simgesi sağlamak istiyorsanız, iki tür bildirim simgesi yapın:

  1. normal bildirim simgesi: aşağıdaki lolipop sürümü için.
  2. arka plan ile kırmızı bildirim simgesi: lolipop ve üstü sürüm için.

Şimdi işletim sistemi sürümünde çalışma zamanı bazında bildirim oluşturucuya uygun simgeyi ayarlayın:

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

Sonunda bu sorunun çözümü var.

Bu sorun yalnızca uygulama hiç çalışmadığında oluşur. (ne arka planda ne de ön planda) . Ne zaman ya ön veya arka planda bildirim simgesini üzerinde uygulama çalışır düzgün görüntülenir . (Değil beyaz kare)

Ayarlamamız gereken, Arka Uç API'larındaki bildirim simgesi için Ön Uç ile aynı yapılandırma yapılandırmasıdır.

Ön uçta React Native kullandık ve push bildirimi için reat-native-fcm npm paketini kullandık .

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

Biz kullanılan ettik fcm-itme npm paketini kullanarak node.js itme bildirimi için bir arka uç olarak ve aşağıdaki gibi yük yapısını ayarlayın.

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

Temel olarak Android sistemimizde yerel olarak depolanan bildirim_icon resmini arar.


1
Sorununuz aynı etkiye sahip olsa da, benimkinden ÇOK farklı. Bu yanıtı gönderdiğiniz için teşekkür ederiz, muhtemelen kullandığınız teknoloji yığınını kullanan birine yardımcı olacaktır.
17'de Blueriver

1
@IanWarburton: Gerek yok.
Aniruddha Shevle

5

Bildirimler gri tonlamalı aşağıda açıklandığı gibi . Başkalarının yazdıklarına rağmen siyah-beyaz değiller. Muhtemelen ağ gücü çubukları gibi birden fazla gölgeye sahip simgeler görmüşsünüzdür.

API 21'den (Lollipop 5.0) önce renk simgeleri çalışır. Uygulamanızı API 20'yi hedeflemeye zorlayabilirsiniz, ancak bu, uygulamanız için kullanılabilir özellikleri sınırlandırdığından önerilmez. Çalışan API düzeyini test edebilir ve uygun şekilde bir renk simgesi veya gri tonlama simgesi ayarlayabilirsiniz, ancak bu muhtemelen önemli değildir. Çoğu durumda, gri tonlamalı bir simgeyle gitmek en iyisidir.

Görüntülerin RGBA (kırmızı / yeşil / mavi / alfa) olmak üzere dört kanalı vardır. Bildirim simgeleri için Android, R, G ve B kanallarını yok sayar. Önemli olan tek kanal, opaklık olarak da bilinen Alfa'dır. Simgenizi çizim renklerinizin Alfa değeri üzerinde kontrol sağlayan bir düzenleyici ile tasarlayın.

Alfa değerleri gri tonlamalı bir görüntü nasıl oluşturulur:

  • Alfa = 0 (saydam) - Bu pikseller saydamdır ve arka plan rengini gösterir.
  • Alfa = 255 (opak) - Bu pikseller beyaz.
  • Alpha = 1 ... 254 - Bu pikseller tam olarak beklediğiniz gibi, saydam ve beyaz arasındaki gölgeleri sağlar.

Şununla değiştirme setColor:

  • Arayın NotificationCompat.Builder.setColor(int argb). İçin olan belgelerdenNotification.color :

    Bu bildirimi sunarken standart Stil şablonları tarafından uygulanacak vurgu rengi (Renk sabitleri gibi bir ARGB tamsayısı). Geçerli şablon tasarımı, bu rengin bir alanının üstüne simge görüntüsünü (beyaz renkte) yerleştirerek renkli bir başlık görüntüsü oluşturur. Alfa bileşenleri yok sayılır.

    Alfa bileşenleri olduğunu setColor gösterileriyle Benim test değil görmezden geldi. Daha yüksek Alfa değerleri bir pikseli beyaza dönüştürür. Düşük Alfa değerleri, bir pikseli bildirim alanındaki arka plan rengine (cihazımda siyah) veya açılır bildirimde belirtilen renge döndürür.


5

Göstermek için aşağıdaki kodu ekleyerek sorunu çözdüm,

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

nerede ic_stat_name Android Studio Sağda oluşturulan res tıklayın >> Yeni >> Görüntü Varlıklar >> IconType (Bildirim)

Ve bildirim yükü ile sunucu php tarafında yapmak zorunda bir adım daha

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

        "token" => $token,

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

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


    ]
];

Bölümü not edin

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

Burada simge adının "icon" => "ic_stat_name"manifest'te aynı set olması gerekir.



4

Kendi beyaz ikonumuzu oluşturabileceğimiz bir bağlantı buldum,

başlatıcı simgenizin beyaz simgesini oluşturmak için bu bağlantıyı deneyin.

Bu Bağlantıyı açın ve ic_launcher veya bildirim simgenizi yükleyin


1

Farklı sürümler için farklı simge kullanabilirsiniz. Simgenizde mantığı şu şekilde ayarlamanız yeterlidir:

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

1

SDK> = 23 için lütfen setLargeIcon öğesini ekleyin

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

SDK'ya özgü sürümleri azaltmak için şunları yapabilirsiniz: ('#' yerine '0x' yazın)

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

0xFF169AB9, tamamen opak alfa kanalını kaçırıyorsunuz.
Eugen Pechanec

0

Renkli simge tutmak istediğinizde - Geçici Çözüm Simgeye
biraz farklı renkte piksel ekleyin.
Benim durumumda gölgeler ve ışık ile siyah bir simge var. Koyu mavi piksel eklendiğinde çalışır.


0

Android 8.0'da benzer bir sorunum var. BEYAZ simge kaynağını kullanmaya çalışın. Simge için renkli görüntü kullanmaya çalıştığımda beyaz karem var, beyaz simgeye değiştirdiğimde işe başlıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.