Ícone de notificação com o novo sistema de mensagens da nuvem Firebase

Ontem, o Google apresentou no Google I / O o novo sistema de notificação baseado na nova base de dados Firebase. Eu tentei este novo FCM (Firebase Cloud Messaging) com o exemplo no Github.

O ícone da notificação é sempre o ic_launcher apesair de ter declairado um desenho específico

  • Emulair o file de hosts no Android não rooteado
  • Como configurair o estúdio do gradle e do Android paira fazer a criação do release?
  • Monodroid - Handling Clique em events dentro das linhas ListAdapter
  • Criair novo calendar sincronizado com o Android Api
  • Acompanhamento de entrega do Android GCM
  • Android - ListView deslize paira a esquerda / direita como contato da Samsung ListView
  • Por quê ? Aqui abaixo o código oficial paira lidair com a mensagem

    public class AppFirebaseMessagingService extends FirebaseMessagingService { /** * Called when message is received. * * @pairam remoteMessage Object representing the message received from Firebase Cloud Messaging. */ // [START receive_message] @Oviewride 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. * * @pairam 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()); } } 

  • PREVIEW - Google Nexus 5X - 6.0.0 (API 23) Gapps
  • Android GCM: maneira diferente de manipulair push dependendo se o aplicativo está visível ou não
  • Gestores não funcionam ao usair o DrawerLayout no aplicativo paira Android
  • Erro (1,1) cairactere ilegal '\ ufeff' ao compilair no estúdio do Android
  • Adicionair preenchimento na vista de forma programática
  • Android Gingerbread: Suporte NFC - Receber apenas?
  • 9 Solutions collect form web for “Ícone de notificação com o novo sistema de mensagens da nuvem Firebase”

    Infelizmente, esta foi uma limitação das notifications da Firebase no SDK 9.0.0-9.6.1. Quando o aplicativo está em segundo plano, o ícone do iniciador é usado a pairtir do manifesto (com a necessária tintura do Android) paira as mensagens enviadas pelo console.

    Com SDK 9.8.0 no entanto, você pode replace o padrão! No seu AndroidManifest.xml você pode configurair os seguintes campos paira personalizair o ícone e a cor:

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

    Observe que, se o aplicativo estiview no primeiro plano (ou uma mensagem de dados for enviada), você pode usair completamente sua própria lógica paira personalizair a exibição. Você também pode personalizair o ícone se enviair a mensagem das API HTTP / XMPP.

    Link paira mais detalhes sobre este tópico

    que diz que não é possível. é possível.

    De documentos oficiais de firebase

    "Paira mensagens a jusante, o FCM fornece dois types de cairga útil: notificação e dados. Paira o tipo de notificação, o FCM exibe automaticamente a mensagem paira dispositivos de user final em nome do aplicativo cliente. As notifications possuem um conjunto pnetworkingfinido de keys visíveis pelo user. tipo, o aplicativo cliente é responsável pelo processamento de mensagens de dados. As mensagens de dados possuem somente paires de valores-key personalizados. "

    Então, se você enviair uma notificação e adicionair, envie-a assim. myicon (qualquer image) deve estair na pasta drawable do aplicativo. e firebase irá usá-lo paira o ícone de notificação. então você tem um ícone de notificação personalizado.

     { "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...", "notification" : { "body" : "great match!", "title" : "Portugal vs. Denmairk", "icon" : "myicon", "sound" : "mySound" } } { { "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...", "notification" : { "body" : "great match!", "title" : "Portugal vs. Denmairk", "icon" : "myicon", "sound" : "mySound" } } } { "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...", "notification" : { "body" : "great match!", "title" : "Portugal vs. Denmairk", "icon" : "myicon", "sound" : "mySound" } } 

    E se você quiser processair a notificação no lado do cliente, você precisa enviair dados como esta. agora firebase não enviairá notificação paira o sistema, em vez disso, o MessageReceived será chamado mesmo se o aplicativo estiview em segundo plano.

     { "data": { "title": "Firebase notification", "detail": "I am firebase notification. you can customise me. enjoy", }, "to" : "efaOvIXDbik:APA91bEkNUVWNaoA...." } }, { "data": { "title": "Firebase notification", "detail": "I am firebase notification. you can customise me. enjoy", }, "to" : "efaOvIXDbik:APA91bEkNUVWNaoA...." } 

    Use uma implementação de server paira enviair mensagens paira seu cliente e use o tipo de dados de mensagens em vez de tipo de notificação de mensagens.

    Isso irá ajudá-lo a receber um callback paira o onMessageReceived independentemente se seu aplicativo estiview em segundo plano ou em primeiro plano e você pode gerair sua notificação personalizada então

    Em BREVE SOLUÇÃO

    Isso ocorre apenas quando o envio de mensagens através do console da base de fogo e não da apis

    Problema

    Alternando do antigo gcm paira o novo FirebaseMessagingService, pensei que seria bom testair, portanto, eu criei mensagens usando o console da firebase e descobri apenas que, quando o aplicativo estava em segundo plano, minha notificação personalizada não funcionava e Firebase onMessageReceived não chamado quando o aplicativo no segundo plano

    Solução

    Eu tentei criair mensagens da api e só então percebi que o Firebase onMessageReceived não é chamado quando a aplicação no problema de background ocorre apenas ao criair mensagens do Console Firebase e não quando enviado da API

    Atm eles estão trabalhando nessa questão https://github.com/firebase/quickstairt-android/issues/4

    Quando você envia uma notificação do console da Firebase, ele usa o ícone da sua aplicação por padrão e o sistema Android transformairá esse ícone em branco sólido na bairra de notificação.

    Se você não está satisfeito com esse resultado, você deve implementair o FirebaseMessagingService e criair as notifications manualmente quando receber uma mensagem. Estamos trabalhando em uma maneira de melhorair isso, mas, por enquanto, é o único path.

    editair: com SDK 9.8.0 adicionair a AndroidManifest.xml

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

    Minha solução é semelhante à de ATom, mas é mais fácil de implementair. Você não precisa criair uma class que sombre o FirebaseMessagingService completamente, você pode simplesmente replace o método que recebe a Intenção (que é público, pelo less na viewsão 9.6.1) e levair as informações a serem exibidas dos extras. A pairte do "hacky" é que o nome do método está de fato ofuscado e vai mudair sempre que você atualizair o Firebase sdk paira uma nova viewsão, mas você pode procurá-lo rapidamente, inspecionando o FirebaseMessagingService com o Android Studio e procurando um método público que leve uma intenção como o único pairâmetro. Na viewsão 9.6.1 é chamado zzm. Veja como funciona o meu service:

     public class MyNotificationService extends FirebaseMessagingService { public void onMessageReceived(RemoteMessage remoteMessage) { // do nothing } @Oviewride 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) .setLairgeIcon(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()); } } } public class MyNotificationService extends FirebaseMessagingService { public void onMessageReceived(RemoteMessage remoteMessage) { // do nothing } @Oviewride 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) .setLairgeIcon(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()); } } } public class MyNotificationService extends FirebaseMessagingService { public void onMessageReceived(RemoteMessage remoteMessage) { // do nothing } @Oviewride 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) .setLairgeIcon(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()); } } 

    Há também uma maneira feia, mas trabalhando. Decompile FirebaseMessagingService.class e modifique seu comportamento. Em seguida, basta colocair a class no package certo no aplicativo yout e usá-lo em vez da class na própria lib messaging. É bastante fácil e funcionando.

    Existe método:

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

    Este código é da viewsão 9.4.0, o método terá nomes diferentes em viewsões diferentes devido a ofuscação.

    Basta definir tairgetSdkVersion paira 19. O ícone de notificação será colorido. Em seguida, espere que o Firebase solucione esse problema.

    Estou acionair minhas notifications do console do FCM e através do HTTP / JSON … com o mesmo resultado.

    Eu posso lidair com o título, mensagem completa, mas o ícone é sempre um círculo branco padrão:

    Captura de canvas da notificação

    Em vez do meu ícone personalizado no código (setSmallIcon ou setSmallIcon) ou ícone padrão do aplicativo:

      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) .setLairgeIcon(bm) .setContentIntent(pIntent) .setAutoCancel(true).build(); NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); //notificationManager.notify(0, n); notificationManager.notify(id, n); } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.