Ontem, o Google apresentou no Google I / O o novo sistema de notificação baseado no novo Firebase. Eu tentei esse novo FCM (Firebase Cloud Messaging) com o exemplo no Github.
O ícone da notificação é sempre o ic_launcher, apesar de eu ter declarado um drawable específico
Por quê ? Aqui abaixo o código oficial para lidar com a mensagem
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());
}
}
Respostas:
Infelizmente, essa foi uma limitação das notificações do Firebase no SDK 9.0.0-9.6.1. Quando o aplicativo está em segundo plano, o ícone do iniciador é usado no manifesto (com a coloração necessária do Android) para mensagens enviadas do console.
No entanto, com o SDK 9.8.0, você pode substituir o padrão! No seu AndroidManifest.xml, você pode definir os seguintes campos para personalizar o ícone e a cor:
Observe que, se o aplicativo estiver em primeiro plano (ou uma mensagem de dados for enviada), você poderá usar completamente sua própria lógica para personalizar a exibição. Você também pode sempre personalizar o ícone se estiver enviando a mensagem das APIs HTTP / XMPP.
fonte
Use uma implementação de servidor para enviar mensagens ao seu cliente e use o tipo de dados de mensagens em vez do tipo de notificação de mensagens.
Isso ajudará você a obter um retorno de chamada
onMessageReceived
independentemente de seu aplicativo estar em segundo plano ou em primeiro plano, e você poderá gerar sua notificação personalizada.fonte
atm eles estão trabalhando nessa questão https://github.com/firebase/quickstart-android/issues/4
edit: com o SDK 9.8.0, adicione ao AndroidManifest.xml
fonte
Minha solução é semelhante à da ATom, mas mais fácil de implementar. Você não precisa criar uma classe que oculte completamente o FirebaseMessagingService, basta substituir o método que recebe o Intent (que é público, pelo menos na versão 9.6.1) e obter as informações a serem exibidas nos extras. A parte "hacky" é que o nome do método é realmente ofuscado e muda sempre que você atualizar o Firebase sdk para uma nova versão, mas você pode procurá-lo rapidamente inspecionando o FirebaseMessagingService com Android Studio e procurando um método público que utilize um Intent como o único parâmetro. Na versão 9.6.1, é chamado zzm. Veja como meu serviço se parece:
fonte
Basta definir targetSdkVersion como 19. O ícone de notificação será colorido. Aguarde o Firebase para corrigir esse problema.
fonte
Há também uma maneira feia, mas funcional. Descompile o FirebaseMessagingService.class e modifique seu comportamento. Em seguida, basta colocar a classe no pacote certo no seu aplicativo e dex usá-lo em vez da classe na própria biblioteca de mensagens. É bem fácil e funcional.
Existe um método:
Este código é da versão 9.4.0, o método terá nomes diferentes em versões diferentes por causa da ofuscação.
fonte
se o seu aplicativo estiver em segundo plano, o ícone de notificação será definido no método Receive da mensagem, mas se o aplicativo estiver em primeiro plano, o ícone de notificação será o que você definiu no manifesto
fonte
Estou acionando minhas notificações do console do FCM e por meio de HTTP / JSON ... com o mesmo resultado.
Consigo lidar com o título, com a mensagem completa, mas o ícone é sempre um círculo branco padrão:
Captura de tela da notificação
Em vez do meu ícone personalizado no código (setSmallIcon ou setSmallIcon) ou no ícone padrão do aplicativo:
fonte
escreva isso
logo abaixo
<application.....>
fonte
Pensei em acrescentar uma resposta a essa, já que meu problema era simples, mas difícil de notar. Em particular, eu copiei / colei um elemento de metadados existente ao criar meu
com.google.firebase.messaging.default_notification_icon
, que usou umaandroid:value
tag para especificar seu valor. Isso não funcionará para o ícone de notificação e, depois que eu o mudei,android:resource
tudo funcionou conforme o esperado.fonte
default_notification_color
meta, ela precisa ser umaandroid:resource
configuração - poisandroid:value
não funcionará