Aqui está o meu manifesto
<service android:name=".fcm.PshycoFirebaseMessagingServices">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<service android:name=".fcm.PshycoFirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
Quando o aplicativo está em segundo plano e a notificação chega, a notificação padrão chega e não executa o meu código de onMessageReceived
.
Aqui está o meu onMessageReceived
código. Isso chama se meu aplicativo estiver sendo executado em primeiro plano, não quando o aplicativo estiver em segundo plano. Como executar esse código quando o aplicativo também está em segundo plano?
// [START receive_message]
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
// TODO(developer): Handle FCM messages here.
// 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.
data = remoteMessage.getData();
String title = remoteMessage.getNotification().getTitle();
String message = remoteMessage.getNotification().getBody();
String imageUrl = (String) data.get("image");
String action = (String) data.get("action");
Log.i(TAG, "onMessageReceived: title : "+title);
Log.i(TAG, "onMessageReceived: message : "+message);
Log.i(TAG, "onMessageReceived: imageUrl : "+imageUrl);
Log.i(TAG, "onMessageReceived: action : "+action);
if (imageUrl == null) {
sendNotification(title,message,action);
} else {
new BigPictureNotification(this,title,message,imageUrl,action);
}
}
// [END receive_message]
android
firebase
firebase-cloud-messaging
Parth Patel
fonte
fonte
Not getting messages here? See why this may be: goo.gl/39bRNJ
. A solução, como as respostas abaixo, pode ser encontrada na documentação em Mensagens com cargas de notificação e de dadosRespostas:
1. Por que isso está acontecendo?
Existem dois tipos de mensagens no FCM (Firebase Cloud Messaging):
onMessageReceived()
retorno de chamada somente quando seu aplicativo está em primeiro planoonMessageReceived()
retorno de chamada mesmo que seu aplicativo esteja em primeiro plano / em segundo plano / eliminado2. como?
Para conseguir isso, você deve executar uma
POST
solicitação para o seguinte URL:Cabeçalhos
Content-Type
, Valor:application/json
Authorization
, Valor:key=<your-server-key>
Corpo usando tópicos
Ou se você deseja enviá-lo para dispositivos específicos
3. Como lidar com a mensagem de notificação por push?
É assim que você lida com a mensagem recebida:
fonte
Firebase team have not developed a UI to send data-messages to your devices, yet.
Isso mudou no ano passado?onMessageReceived
, não é chamado e é um problema sério no FCM !!! Atualize também sua resposta.Para fazer com que a biblioteca do firebase chame seu onMessageReceived () nos seguintes casos
você não deve colocar a chave JSON 'notificação' em sua solicitação à API do firebase, mas usar 'dados', veja abaixo.
A mensagem a seguir não chamará seu onMessageReceived () quando seu aplicativo estiver em segundo plano ou morto, e você não poderá personalizar sua notificação.
mas, em vez disso, usar isso funcionará
Basicamente, a mensagem é enviada no argumento RemoteMessage, juntamente com o seu objeto de dados como Map, e você pode gerenciar a notificação no onMessageReceived como no snippet aqui
fonte
Sinto que todas as respostas estão incompletas, mas todas têm algo que você precisa para processar uma notificação com dados quando o aplicativo está em segundo plano.
Siga estas etapas e você poderá processar suas notificações quando o aplicativo estiver em segundo plano.
1. Adicione um filtro de intenção como este:
para uma atividade que você deseja processar os dados da notificação.
Envie notificações com o próximo formato:
A chave aqui é adicionar
onde .MainActivity é a atividade com o filtro de intenção que você adicionou na etapa 1.
Obtenha informações de "dados" da notificação no onCreate de ".MainActivity":
E isso deve ser tudo o que você precisa fazer. Espero que isso ajude alguém :)
fonte
De acordo com a documentação do firebase em enviar a jusante usando o firebase , há 2 tipos de carga útil:
dados
notificação
Quando você está em primeiro plano, pode obter os dados no FCM usando onMessageReceived () , pode obter os dados da carga útil dos dados .
Quando você está em segundo plano, o FCM mostra a notificação na bandeja do sistema com base nas informações da carga útil da notificação . O título, a mensagem e o ícone usados para a notificação na bandeja do sistema são obtidos da carga útil da notificação .
Essa carga útil da notificação é usada quando você deseja mostrar automaticamente a notificação na bandeja do sistema quando o aplicativo está em segundo plano. Para obter dados de notificação quando seu aplicativo estiver em segundo plano, adicione click_action na carga útil da notificação .
Coloque esse filtro de intenção em seu manifesto, dentro de uma das tags de atividade. Quando você clica na notificação, ele abre o aplicativo e vai diretamente para a atividade definida em click_action, neste caso "OPEN_ACTIVTY_1". E nessa atividade, você pode obter os dados:
Estou usando o FCM para meu aplicativo para Android e uso a carga útil. Aqui está o exemplo de JSON que estou usando:
fonte
De acordo com documentos
Editar:
Com base neste tópico :
Você não pode definir a carga útil do click_action usando o Firebase Console. Você pode tentar testar com um comando curl ou um servidor http personalizado
fonte
Em julho de 2019
Android compileSdkVersion 28, buildToolsVersion 28.0.3 e firebase-messaging: 19.0.1
Depois de muitas horas pesquisando todas as outras perguntas e respostas do StackOverflow e tentando inúmeras soluções desatualizadas, essa solução conseguiu mostrar notificações nesses três cenários:
- O aplicativo está em primeiro plano:
a notificação é recebida pelo método onMessageReceived na minha classe MyFirebaseMessagingService
- O aplicativo foi eliminado (não está sendo executado em segundo plano): a notificação é enviada para a bandeja de notificação automaticamente pelo FCM. Quando o usuário toca na notificação, o aplicativo é iniciado chamando a atividade que possui android.intent.category.LAUNCHER no manifesto. Você pode obter a parte dos dados da notificação usando getIntent (). GetExtras () no método onCreate ().
- O aplicativo está em segundo plano: a notificação é enviada para a bandeja de notificação automaticamente pelo FCM. Quando o usuário toca na notificação, o aplicativo é trazido para o primeiro plano iniciando a atividade que possui android.intent.category.LAUNCHER no manifesto. Como meu aplicativo possui launchMode = "singleTop" nessa atividade, o método onCreate () não é chamado porque uma atividade da mesma classe já foi criada. Em vez disso, o método onNewIntent () dessa classe é chamado e você obtém a parte dos dados a notificação lá usando intent.getExtras ().
Etapas: 1- Se você definir a atividade principal do seu aplicativo, assim:
2- adicione essas linhas no método onCreate () da sua classe MainActivity.class
e esses métodos para a mesma MainActivity.class:
3- crie a classe MyFirebase assim:
4- crie uma nova classe NotificationActivity.class assim:
}
5- Adicione essas linhas ao manifesto do seu aplicativo, dentro das suas tags
6- adicione essas linhas no método Application.java onCreate () ou no método MainActivity.class onCreate ():
Feito.
Agora, para que isso funcione bem nos três cenários mencionados, você deve enviar a notificação do console da web do Firebase da seguinte maneira:
Na seção Notificação: Título da notificação = Título a ser exibido na caixa de diálogo de notificação (opcional) Texto da notificação = Mensagem para mostrar ao usuário (obrigatório) Na seção Destino: Aplicativo = seu aplicativo Android e na seção Opções Adicionais: Canal de Notificação Android = default_channel_id Chave de dados personalizados: valor do título: (o mesmo texto aqui que no campo Título da seção Notificação) chave: valor do corpo: (mesmo texto aqui que no campo Mensagem da seção Notificação) chave: valor da ação do clique: valor da ação do clique: .MainActivity Sound = Desativado
expira = 4 semanas
Você pode depurá-lo no emulador com API 28 no Google Play.
Feliz codificação!
fonte
Uma vez
display-messages
que os que são enviados pela interface do usuário do Firebase Notification só funcionam se o aplicativo estiver em primeiro plano. Paradata-messages
, é necessário fazer uma chamada POST para o FCMPassos
Instale a Extensão do Google Chrome do Advanced Rest Client
Adicione os seguintes cabeçalhos
Chave : Tipo de Conteúdo, Valor : application / json
Chave : Autorização, Valor : key = "sua chave do servidor"
Adicione o corpo
Se estiver usando tópicos:
Se estiver usando o ID de registro:
É isso aí!. Agora ouça o
onMessageReceived
retorno de chamada, como de costume.fonte
Para capturar a mensagem em segundo plano, você precisa usar um
BroadcastReceiver
e adicione isso ao seu manifesto:
fonte
não é chamado toda vez que é chamado somente quando o aplicativo está em forground
existe um método de substituição que esse método é chamado sempre, não importa qual aplicativo esteja em primeiro plano ou em segundo plano ou seja morto, mas esse método esteja disponível nesta versão da API do firebase
esta é a versão que você precisa importar do gradle
este é o método
com a API anterior do firebase, esse método não estava lá; nesse caso, a base de incêndio se autodefine quando o aplicativo está em segundo plano ... agora você tem esse método, o que quer que você queira fazer ... você pode fazê-lo aqui neste método .. ...
se você estiver usando a versão anterior, a atividade padrão iniciará nesse caso, você poderá obter os dados da mesma maneira
// faça o que você quiser ....}
geralmente esta é a estrutura do servidor que recebemos na notificação
cabe a você como você deseja fornecer essa chave de dados ou deseja notificar qualquer coisa que você possa fornecer ....... o que você fornecer aqui com a mesma chave, você obterá esses dados ........ .
existem poucos casos se você não enviar ação de clique, nesse caso, quando você clicará na notificação, a atividade padrão será aberta, mas se você desejar abrir sua atividade específica quando o aplicativo estiver em segundo plano, poderá chamar sua atividade a partir desse método on handleIntent, porque isso é chamado toda vez
fonte
De acordo com os documentos: 17 de maio de 2017
Portanto, você deve usar a notificação de carga útil + os dados:
Não é necessário usar a ação click_action. Você deve obter exras da intenção na atividade LAUNCHER
O código Java deve estar no método onCreate em MainActivity:
Você pode testar a notificação de carga útil + os dados do Firebase Notifications Console . Não se esqueça de preencher campos de dados personalizados na seção Opções avançadas
fonte
Aqui estão conceitos mais claros sobre a mensagem do firebase. Encontrei na equipe de suporte.
O Firebase possui três tipos de mensagens :
Mensagens de notificação : a mensagem de notificação funciona em segundo plano ou em primeiro plano. Quando o aplicativo está em segundo plano, as mensagens de notificação são entregues na bandeja do sistema. Se o aplicativo estiver em primeiro plano, as mensagens serão tratadas
onMessageReceived()
oudidReceiveRemoteNotification
retornadas. Essas são essencialmente as chamadas mensagens de exibição.Mensagens de dados : na plataforma Android, as mensagens de dados podem funcionar em segundo plano e em primeiro plano. A mensagem de dados será tratada por onMessageReceived (). Uma observação específica da plataforma aqui seria: No Android, a carga útil dos dados pode ser recuperada no Intent usado para iniciar sua atividade. Para elaborar, se você tiver
"click_action":"launch_Activity_1"
, você pode recuperar essa intençãogetIntent()
somente deActivity_1
.Mensagens com carga útil de notificação e de dados : quando em segundo plano, os aplicativos recebem a carga útil de notificação na bandeja de notificação e só lidam com a carga útil de dados quando o usuário toca na notificação. Quando em primeiro plano, seu aplicativo recebe um objeto de mensagem com as duas cargas úteis disponíveis. Em segundo lugar, o
click_action
parâmetro é frequentemente usado na carga útil da notificação e não na carga útil dos dados. Se usado dentro da carga útil dos dados, esse parâmetro seria tratado como um par de valor-chave personalizado e, portanto, seria necessário implementar uma lógica personalizada para que funcionasse conforme o planejado.Além disso, recomendo que você use o
onMessageReceived
método (consulte Mensagem de dados) para extrair o pacote de dados. Pela sua lógica, verifiquei o objeto do pacote e não encontrei o conteúdo de dados esperado. Aqui está uma referência a um caso semelhante que pode fornecer mais clareza.Para mais informações visite o meu tópico
fonte
2017 resposta atualizada
Aqui está uma resposta clara dos documentos sobre isso:
fonte
Resumo simples como este
se seu aplicativo estiver sendo executado;
é gatilhos.
se o seu aplicativo não estiver em execução (eliminado ao passar o dedo);
não é acionado e entregue por direclty. Se você tiver algum par de valor-chave específico. Eles não funcionam porque onMessageReceived () não está funcionando.
Eu encontrei este caminho;
Na sua atividade do iniciador, coloque essa lógica,
nesse bloco if, procure suas chaves de acordo com a interface do usuário do firebase.
Neste exemplo, minha chave e valor como acima; (desculpe pelo idioma =))
Quando meu código funciona, eu recebo "com.rda.note".
com essa linha de código, fechei meu aplicativo e abro o Google Play Market
codificação feliz =)
fonte
Eu descobri os cenários,
Quando o aplicativo está em primeiro plano , o método onMessageReceived () é chamado do FirebaseService . Portanto, o pendingIntent definido na classe de serviço será chamado.
E quando o aplicativo está em segundo plano , a primeira atividade é chamada.
Agora, se você usar uma atividade inicial , em seguida, deve ter em mente o splashactivity será chamado, outra coisa se não houver splashActivity, então qualquer que seja a primeira atividade é, será chamado.
Em seguida, é necessário verificar getIntent () da firstActivity para ver se há algum pacote. Se estiver tudo bem, você verá que o pacote está com os valores preenchidos. Se o valor na tag de dados enviada pelo servidor se parecer com isso,
Então, na primeira atividade, você verá, há uma intenção válida ( getIntent () não é nula ), pacote válido e pacote interno, haverá todo o JSON mencionado acima com dados como chave .
Nesse cenário, o código para extração de valor terá a seguinte aparência:
fonte
Obrigado a todos por suas respostas. Mas eu resolvi isso enviando uma mensagem de dados em vez de enviar uma notificação . Código do servidor
E capturou os dados no onMessageReceived
fonte
Remova completamente a carga útil da notificação da sua solicitação do servidor. Envie apenas dados e trate-os
onMessageReceived()
, caso contrário, vocêonMessageReceived
não será acionado quando o aplicativo estiver em segundo plano ou morto.Aqui está o que estou enviando do servidor:
Para que você possa receber seus dados
onMessageReceived(RemoteMessage message)
assim: (digamos que eu precise obter o ID)Da mesma forma, você pode obter todos os dados que você enviou do servidor
onMessageReceived()
.fonte
A maneira mais fácil de enviar mensagens, mesmo que o aplicativo esteja em segundo plano e em primeiro plano, como segue: - Para enviar uma mensagem usando a API, você pode usar uma ferramenta chamada AdvancedREST Client, uma extensão do chrome, e enviar uma mensagem com os seguintes parâmetros.
Link para ferramenta de descanso do cliente: https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo
use este URL: - https://fcm.googleapis.com/fcm/send Tipo de conteúdo: application / json Autorização: key = Chave do servidor ou chave de Authoization (veja abaixo ref)
A chave de autorização pode ser obtida visitando o console do desenvolvedor do Google e clique no botão Credenciais no menu à esquerda do seu projeto. Entre as chaves de API listadas, a chave do servidor será sua chave de autorização.
E você precisa colocar o tokenID do receptor na seção "para" da sua solicitação POST enviada usando a API.
fonte
você deseja trabalhar em MessageReceived (RemoteMessage remoteMessage) em segundo plano, envie apenas uma parte da notificação de parte dos dados:
"AnotherActivity": "True", "to": "ID do dispositivo ou token do dispositivo"
Por isso, onMessageRecivied é o plano de fundo e o primeiro plano da chamada, não é necessário manipular a notificação usando a bandeja de notificação na atividade do iniciador. Manipule a carga útil dos dados usando isso:
fonte
Junho 2018 Resposta -
Você deve garantir que não haja uma palavra-chave de "notificação" em nenhum lugar da mensagem. Inclua apenas "dados" e o aplicativo poderá manipular a mensagem em onMessageReceived, mesmo se estiver em segundo plano ou morto.
Usando funções da nuvem:
Em seguida, em seu onMessageReceived (), em sua classe, estendendo com.google.firebase.messaging.FirebaseMessagingService:
fonte
De acordo com o OAUTH 2.0:
Haverá um problema de autenticação para este caso, porque o FCM agora está usando OAUTH 2
Então, eu li a documentação do firebase e, de acordo com a documentação, é uma nova maneira de postar uma mensagem de dados;
Cabeçalhos
Auth
Corpo de exemplo
No URL, há o ID do banco de dados, que você pode encontrar no console do firebase. (Ir configurações do projeto)
E agora vamos pegar nosso token (ele será válido apenas 1 hora):
Primeiro no console do Firebase, abra Configurações> Contas de serviço . Clique em Gerar nova chave privada , armazene com segurança o arquivo JSON que contém a chave. Eu precisava desse arquivo JSON para autorizar solicitações do servidor manualmente. Eu baixei.
Em seguida, crio um projeto node.js e usei essa função para obter meu token;
Agora eu posso usar esse token na minha solicitação de postagem. Em seguida, publico minha mensagem de dados e agora ela é tratada pelos meus aplicativos na função Message Message.
fonte
Desde 2019, o Google Firebase tem uma grande mudança em suas APIs, quero dizer:
'com.google.firebase:firebase-messaging:18.0.0'
na versão 18.0.0, eles foram removidos
MyFirebaseInstanceIDService
e você precisa obter o token,MyFirebaseMessagingService
para escrever:e também no seu AndroidManifest.xml, você deve remover:
Além disso, é recomendável definir valores padrão para personalizar a aparência das notificações. Você pode especificar um ícone padrão personalizado e uma cor padrão personalizada que serão aplicadas sempre que valores equivalentes não forem definidos na carga útil da notificação.
Adicione estas linhas dentro da tag do aplicativo para definir o ícone padrão personalizado e a cor personalizada:
agora, para lidar com mensagens de notificação em um aplicativo em segundo plano, você deve definir uma Intenção na sua primeira Atividade, mesmo que seja SplashScreen. Quando o aplicativo está em segundo plano, o Android direciona as mensagens de notificação para a bandeja do sistema. Um toque do usuário na notificação abre o iniciador de aplicativos por padrão.
por exemplo, se seu Json é assim:
você só precisa escrever uma intenção simples de obter esses valores:
fonte
Além de respostas acima, Se você estiver testando notificações push usando consola FCM , chave e objeto 'dados' é não adicionado ao pacote Push Notification. Portanto, você não receberá uma notificação push detalhada quando o aplicativo estiver em segundo plano ou for morto.
Nesse caso, você deve optar pelo console administrativo de back-end para testar o cenário de segundo plano do aplicativo.
Aqui, você adicionou a chave 'data' ao seu pacote de envio. portanto, o envio detalhado será mostrado conforme o esperado. Espero que isso ajude poucos.
fonte
Usando esse código, você pode obter a notificação em segundo plano / primeiro plano e também executar uma ação:
No aplicativo, use este código:
fonte
Haverá dois tipos de notificações
Você deve usar as Notificações de dados para lidar com a notificação quando o aplicativo estiver em segundo plano.
fonte
Eu experimentei o mesmo problema, recompilei a biblioteca do firebase e impedi-a de enviar notificações quando o aplicativo está em segundo plano
* biblioteca https://github.com/erdalceylan/com-google-firebase-messaging
*
a esperança ajuda. Boa sorte
fonte