Yeni Firebase Cloud Messaging sistemiyle Bildirim Simgesi


132

Dün Google, Google I / O'da yeni Firebase'e dayalı yeni bildirim sistemini sundu. Bu yeni FCM'yi (Firebase Cloud Messaging) Github'daki örnekle denedim.

Belirli bir çekilebilirlik beyan etmeme rağmen bildirimin simgesi her zaman ic_launcher'dır

Neden ? Mesajın işlenmesi için resmi kodun altında

public class AppFirebaseMessagingService extends FirebaseMessagingService {

    /**
     * Called when message is received.
     *
     * @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
     */
    // [START receive_message]
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        // If the application is in the foreground handle both data and notification messages here.
        // Also if you intend on generating your own notifications as a result of a received FCM
        // message, here is where that should be initiated. See sendNotification method below.
        sendNotification(remoteMessage);
    }
    // [END receive_message]

    /**
     * Create and show a simple notification containing the received FCM message.
     *
     * @param remoteMessage FCM RemoteMessage received.
     */
    private void sendNotification(RemoteMessage remoteMessage) {

        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
                PendingIntent.FLAG_ONE_SHOT);

        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

// this is a my insertion looking for a solution
        int icon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? R.drawable.myicon: R.mipmap.myicon;
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(icon)
                .setContentTitle(remoteMessage.getFrom())
                .setContentText(remoteMessage.getNotification().getBody())
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }

}

firebase'in bildirimi nasıl oluşturduğunuzla ilgisi yoktur, lütfen gördüklerinize dair bir resim sağlayın
tyczj

1
kesin. bu kod doğrudan Firebase'den gelir ve sendNotification () yöntemi herhangi bir bildirim için tamamen aynıdır. Bu kod GCM ile sorunsuz çalışır, ancak FCM no. mesaj göndermek için yeni web arayüzünü kullanarak her zaman ic_launcher olarak kalır
marco

küçük simgeyi ayarlarsınız ancak büyük simgeyi ayarlamazsınız, itme yükünde bildirim etiketi ile bir itme göndermiyorsanız, bunun FCM ile hiçbir ilgisi yoktur
tyczj

Uygulama ön plandayken özel bildirim simgenizi gösteriyor mu? Bu benim için çalışıyor. Bununla birlikte, uygulama arka plandayken, tüm bildirim ayarları göz ardı edildiğinden (simge, ses, ışıklar, titreşim vb. Özelleştirilemez) bir tür varsayılan FCM işleyicisi kullanmalıdır.
shinypenguin

Yanıtlar:


267

Maalesef bu, SDK 9.0.0-9.6.1'deki Firebase Bildirimleri'nin bir sınırlamasıydı. Uygulama arka plandayken, konsoldan gönderilen mesajlar için başlatıcı simgesi bildirimden (gerekli Android renklendirme ile) kullanılır.

Ancak SDK 9.8.0 ile varsayılanı geçersiz kılabilirsiniz! AndroidManifest.xml dosyanızda, simgeyi ve rengi özelleştirmek için aşağıdaki alanları ayarlayabilirsiniz:

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

Uygulama ön plandaysa (veya bir veri mesajı gönderilirse), ekranı özelleştirmek için tamamen kendi mantığınızı kullanabileceğinizi unutmayın. Ayrıca, mesajı HTTP / XMPP API'lerinden gönderiyorsanız, simgeyi her zaman özelleştirebilirsiniz.


1
@Ian Barber: Google'da yakın gelecekte bu davranışı değiştirmek için herhangi bir planınız var mı?
skylve

1
Ekip sorunun farkındadır ve bir düzeltme üzerinde çalışmaktadır.
Arthur Thompson

1
herhangi bir güncelleme var mı? Bir Google mühendisinin yamayı itmeyi unuttuğu durumlar olduğu için soracağımı düşündüm.
CQM

7
Ah, 9.8.0 ile çalışmasını sağladım. Başkalarına yardımcı olmak için, durum çubuğu simgenizin gereksinimleri karşılaması gerektiğini unutmayın: developer.android.com/guide/practices/ui_guidelines/… . Benimki bunu yapmadı ve bu nedenle firebase, bildirimde belirtilen simgeyi kullanmak yerine varsayılan olarak standart beyaz kareye ayarlandı.
zaifrun

3
Bunu denerseniz ve simgenin diğer bildirimlerden daha küçük olduğunu görürseniz, bir vektör çizilebilir (png değil) kullandığınızdan emin olun. Bu benim için çözdü.
2016

35

İstemcinize mesaj göndermek için bir sunucu uygulaması kullanın ve mesajların bildirim türü yerine veri türü mesajlar kullanın .

Bu, onMessageReceiveduygulamanızın arka planda veya ön planda olup olmadığına bakılmaksızın geri arama almanıza yardımcı olur ve ardından özel bildiriminizi oluşturabilirsiniz.


2
Bu, Firebase belgelerinde de önerilen çözümdür, bildirim yerine veri aktarımına güveniyorsanız bildirimi tercih ettiğiniz şekilde gösterebilirsiniz.
2016

1
Evet katılıyorum. bu doğru bir cevap olarak işaretlenmelidir. veya aşağıdaki cevabım :)
Developine

3
Hayır, bildirim bekleyen diğer istemcilerle / eski sürümlerle uyumluluğu sürdürmesi gereken kişiler için bu mümkün değildir.
Gabor

Üretimde zaten bildirim türü bir push bekleyen uygulamalarımız var ve bu (karmaşık) arka uç bileşenini yeni istemciler için veri eklemek üzere genişlettik. Ancak uygulamamızın eski sürümleri için desteği kaldıramıyoruz.
Gabor

Oh katılıyorum. Bu başka bir sorundur. Bütünleştirmeden önce belgeleri iyice okumanızı öneririm. Ayrıca üretime geçmeden önce iyice test etmek. Uygulama lansmandan önce iyi bir şekilde test edilmiş olsaydı sorun önlenebilirdi. Her neyse, öğrenmen gereken bir şey vardı.
geekoraul

9

atm bu sorun üzerinde çalışıyorlar https://github.com/firebase/quickstart-android/issues/4

Firebase konsolundan bir bildirim gönderdiğinizde varsayılan olarak uygulama simgenizi kullanır ve Android sistemi bildirim çubuğundayken bu simgeyi sabit beyaza çevirir.

Bu sonuçtan memnun değilseniz, FirebaseMessagingService'i uygulamalı ve bir mesaj aldığınızda bildirimleri manuel olarak oluşturmalısınız. Bunu iyileştirmenin bir yolu üzerinde çalışıyoruz ama şimdilik tek yol bu.

düzenleme: SDK 9.8.0 ile AndroidManifest.xml'ye ekle

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

özelleştirilmiş simge bildirim tepsisi hatmi ile nasıl görüntülenir
Harsha

6

Benim çözümüm ATom'un çözümüne benzer, ancak uygulaması daha kolay. FirebaseMessagingService'i tamamen gölgeleyen bir sınıf oluşturmanıza gerek yoktur, sadece Amacı alan yöntemi (en azından 9.6.1 sürümünde herkese açık olan) geçersiz kılabilir ve ekstralardan görüntülenecek bilgileri alabilirsiniz. "Keskin" kısmı, yöntem adının gerçekten de karmaşık hale getirilmiş olmasıdır ve Firebase sdk'yi yeni bir sürüme her güncellediğinizde değişecektir, ancak Android Studio ile FirebaseMessagingService'i inceleyerek ve bunu gerektiren genel bir yöntem arayarak hızlıca tek parametre olarak bir Amaç. 9.6.1 sürümünde buna zzm denir. Hizmetim şöyle görünüyor:

public class MyNotificationService extends FirebaseMessagingService {

    public void onMessageReceived(RemoteMessage remoteMessage) {
        // do nothing
    }

    @Override
    public void zzm(Intent intent) {
        Intent launchIntent = new Intent(this, SplashScreenActivity.class);
        launchIntent.setAction(Intent.ACTION_MAIN);
        launchIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* R    equest code */, launchIntent,
                PendingIntent.FLAG_ONE_SHOT);
        Bitmap rawBitmap = BitmapFactory.decodeResource(getResources(),
                R.mipmap.ic_launcher);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_notification)
                .setLargeIcon(rawBitmap)
                .setContentTitle(intent.getStringExtra("gcm.notification.title"))
                .setContentText(intent.getStringExtra("gcm.notification.body"))
                .setAutoCancel(true)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager =
                (NotificationManager)     getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }
}

anahtar adı için gcm.notification.title tüm sürümler için% 100 güvenli mi?
pedroooo

3

Sadece targetSdkVersion'ı 19'a ayarlayın. Bildirim simgesi renkli olacaktır. Ardından Firebase'in bu sorunu çözmesini bekleyin.


7
: D Vay canına, yan etkilerin listesi nerede?
Eugen Pechanec

@EugenPechanec evet, takas, 20'den fazla
sürümde

3

Bir de çirkin ama işe yarayan bir yol var. FirebaseMessagingService.class dosyasını yeniden derleyin ve davranışını değiştirin. Ardından, sınıfı yout uygulamasında doğru pakete koyun ve dex bunu mesajlaşma kitaplığındaki sınıfın yerine kullanın. Oldukça kolay ve çalışıyor.

Yöntem var:

private void zzo(Intent intent) {
    Bundle bundle = intent.getExtras();
    bundle.remove("android.support.content.wakelockid");
    if (zza.zzac(bundle)) {  // true if msg is notification sent from FirebaseConsole
        if (!zza.zzdc((Context)this)) { // true if app is on foreground
            zza.zzer((Context)this).zzas(bundle); // create notification
            return;
        }
        // parse notification data to allow use it in onMessageReceived whe app is on foreground
        if (FirebaseMessagingService.zzav(bundle)) {
            zzb.zzo((Context)this, intent);
        }
    }
    this.onMessageReceived(new RemoteMessage(bundle));
}

Bu kod 9.4.0 sürümündendir, yöntemin şaşırtması nedeniyle farklı sürümlerde farklı adlar olacaktır.


3

Uygulamanız arka plandaysa, bildirim simgesi Mesaj Alma yönteminde ayarlanır, ancak uygulamanız ön plandaysa bildirim simgesi bildirimde tanımladığınız simge olur

görüntü açıklamasını buraya girin


2

Bildirimlerimi FCM konsolundan ve HTTP / JSON üzerinden tetikliyorum ... aynı sonuçla.

Başlığı, tam mesajı halledebilirim, ancak simge her zaman varsayılan bir beyaz dairedir:

Bildirim ekran görüntüsü

Koddaki özel simgem (setSmallIcon veya setSmallIcon) veya uygulamadaki varsayılan simge yerine:

 Intent intent = new Intent(this, MainActivity.class);
    // use System.currentTimeMillis() to have a unique ID for the pending intent
    PendingIntent pIntent = PendingIntent.getActivity(this, (int) System.currentTimeMillis(), intent, 0);

    if (Build.VERSION.SDK_INT < 16) {
        Notification n  = new Notification.Builder(this)
                .setContentTitle(messageTitle)
                .setContentText(messageBody)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentIntent(pIntent)
                .setAutoCancel(true).getNotification();
        NotificationManager notificationManager =
                (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        //notificationManager.notify(0, n);
        notificationManager.notify(id, n);
    } else {
        Bitmap bm = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);

        Notification n  = new Notification.Builder(this)
                .setContentTitle(messageTitle)
                .setContentText(messageBody)
                .setSmallIcon(R.drawable.ic_stat_ic_notification)
                .setLargeIcon(bm)
                .setContentIntent(pIntent)
                .setAutoCancel(true).build();

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        //notificationManager.notify(0, n);
        notificationManager.notify(id, n);
    }

1
Anladım! <service> etiketlerim AndroidManifest.xml'deki <application> etiketinin dışında. Burada stackoverflow.com/a/37352142/6366150
Gonzalo

Yalnızca ön plan uygulaması çalışırken çalışır ... arka planda hala aynı önceki davranışı
Gonzalo

uygulama ön planda olduğunda, bu özel bildirim simgesi iyi çalışıyor ve çalışıyor ancak uygulama arka planında beyaz kare simgesi geliyor
Harsha

1

bunu yaz

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

sağ aşağı <application.....>

görüntü açıklamasını buraya girin


0

Sorunum basit ama fark edilmesi zor olduğu için buna bir cevap ekleyeceğimi düşündüm. Özellikle , değerini belirtmek için com.google.firebase.messaging.default_notification_iconbir android:valueetiket kullanan, var olan bir meta veri öğesini kopyaladım / yapıştırdım . Bu, bildirim simgesi için çalışmayacak ve android:resourceher şeyi değiştirdiğimde beklendiği gibi çalıştı.


Aynı şey default_notification_colormeta için de geçerli, bir android:resource- android:valueçalışmayacak şekilde ayarlanması gerekiyor
flochtililoch
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.