android - notification - registration id firebase
Firebase(FCM): abre la actividad y pasa datos al hacer clic en la notificación. androide (4)
Después de probar todas las respuestas y blogs surgió con la solución. si alguien lo necesita, use este video como referencia
https://www.youtube.com/watch?v=hi8IPLNq59o
ADEMÁS del video para agregar intenciones en MyFirebaseMessagingService:
public class MyFirebaseMessagingService extends FirebaseMessagingService {
private static final String TAG = "MyFirebaseMsgService";
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
String user_id = "0";
String date = "0";
String hal_id = "0";
String M_view = "0";
if (remoteMessage.getData().size() > 0) {
Log.d(TAG, "Message data payload: " + remoteMessage.getData());
user_id = remoteMessage.getData().get("user_id");
date = remoteMessage.getData().get("date");
cal_id = remoteMessage.getData().get("hal_id");
M_view = remoteMessage.getData().get("M_view");
}
String click_action = remoteMessage.getNotification().getClickAction();
//Calling method to generate notification
sendNotification(remoteMessage.getNotification().getBody(), remoteMessage.getNotification().getTitle(), user_id, date, hal_id, M_view, click_action);
}
private void sendNotification(String messageBody, String messageTitle, String user_id, String date, String hal_id, String M_view, String click_action) {
Intent intent = new Intent(click_action);
intent.putExtra("user_id", user_id);
intent.putExtra("date", date);
intent.putExtra("hal_id", hal_id);
intent.putExtra("M_view", M_view);
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent,
PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);
notificationBuilder.setSmallIcon(R.drawable.ic_launcher)
.setContentTitle(messageTitle)
.setContentText(messageBody)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, notificationBuilder.build());
}}
y en NotificationReceive nueva actividad en onCreate o onResume agregue esto
notification_Y_N = (TextView) findViewById(R.id.notification_Y_N);
user_id_text = (TextView) findViewById(R.id.user_id_text);
Intent intent_o = getIntent();
String user_id = intent_o.getStringExtra("user_id");
String date = intent_o.getStringExtra("date");
String hal_id = intent_o.getStringExtra("hal_id");
String M_view = intent_o.getStringExtra("M_view");
notification_Y_N.setText(date);
user_id_text.setText(hal_id);
Debe haber una implementación clara de cómo trabajar con notificaciones y datos de Firebase. Leí muchas respuestas pero parece que no puedo hacer que funcione. Aquí están mis pasos:
1.) Estoy pasando notificaciones y datos a Android en PHP y parece estar bien:
$msg = array
(
"body" => $body,
"title" => $title,
"sound" => "mySound"
);
$data = array
(
"user_id" => $res_id,
"date" => $date,
"hal_id" => $hal_id,
"M_view" => $M_view
);
$fields = array
(
''registration_ids'' => $registrationIds,
''notification'' => $msg,
''data'' => $data
);
$headers = array
(
''Authorization: key=''.API_ACCESS_KEY,
''Content-Type: application/json''
);
$ch = curl_init();
curl_setopt( $ch,CURLOPT_URL, ''https://android.googleapis.com/gcm/send'' );
curl_setopt( $ch,CURLOPT_POST, true );
curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );
curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );
$result = curl_exec($ch );
curl_close( $ch );
2.) cuando se reciben notificaciones y datos en Android, se muestra una notificación. Cuando hago clic en esta notificación, se abre la aplicación. Pero no puedo encontrar la manera de manejar los datos cuando se abre la aplicación. Hay un par de diferencias cuando la aplicación está en primer plano y en segundo plano. El código que tengo ahora es el siguiente:
public class MyFirebaseMessagingService extends FirebaseMessagingService {
private static final String TAG = "MyFirebaseMsgService";
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
String user_id = "0";
String date = "0";
String cal_id = "0";
String M_view = "0";
if (remoteMessage.getData().size() > 0) {
Log.d(TAG, "Message data payload: " + remoteMessage.getData());
user_id = remoteMessage.getData().get("user_id");
date = remoteMessage.getData().get("date");
hal_id = remoteMessage.getData().get("hal_id");
M_view = remoteMessage.getData().get("M_view");
}
//Calling method to generate notification
sendNotification(remoteMessage.getNotification().getBody(), user_id, date, hal_id, M_view);
}
private void sendNotification(String messageBody, String user_id, String date, String hal_id, String M_view) {
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("fcm_notification", "Y");
intent.putExtra("user_id", user_id);
intent.putExtra("date", date);
intent.putExtra("hal_id", hal_id);
intent.putExtra("M_view", M_view);
int uniqueInt = (int) (System.currentTimeMillis() & 0xff);
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), uniqueInt, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);
notificationBuilder.setSmallIcon(R.drawable.ic_launcher)
.setContentText(messageBody)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, notificationBuilder.build());
}}
3.) Cuando uso el código anterior y cuando hago clic en notificación, todo lo que hace, abre la aplicación si está en segundo plano. Si la aplicación está en primer plano, en la notificación, haga clic en ella, simplemente descarta la notificación. Sin embargo, quiero recibir datos y abrir Actividad específica en ambos escenarios (en segundo plano y en primer plano). Tengo en MainActivity el siguiente código, pero no puedo obtener datos. fcm_notification, date, hal_id devuelve nulo.
public class MainActivity extends Activity {
UserFunctions userFunctions;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
Intent intent_o = getIntent();
}
@Override
protected void onResume() {
super.onResume();
userFunctions = new UserFunctions();
if(userFunctions.isUserLoggedIn(getApplicationContext())){
Intent intent_o = getIntent();
String fcm_notification = intent_o.getStringExtra("fcm_notification") ;
String user_id = intent_o.getStringExtra("user_id");
String date = intent_o.getStringExtra("date");
String hal_id = intent_o.getStringExtra("hal_id");
String M_view = intent_o.getStringExtra("M_view");
Intent intent = new Intent(this, JobList.class);
// THIS RETURNS NULL, user_id = null
System.out.print("FCM" + user_id);
startActivity(intent);
finish();
}else{
// user is not logged in show login screen
Intent login = new Intent(this, LoginActivity.class);
startActivity(login);
// Closing dashboard screen
finish();
}
}}
SI alguien puede dirigir o aconsejar, ¿cómo puedo recuperar datos en MainActivity.java de Firebase en cualquiera de los escenarios (en primer plano o en segundo plano) que sería fantástico.
En primer lugar, pondré los detalles mencionados en los documentos de Manejo de mensajes .
En el resumen debajo de la fila
Ambos
, muestra que cuando la aplicación está en
primer plano
, la carga útil se manejará en su
onMessageReceived()
.
Para abrir la actividad desde
onMessageReceived()
, debe verificar si los datos que necesita están en la carga útil, si lo hace, llame a su actividad específica y luego pase todos los demás detalles que necesite por intención.
Ahora, si la aplicación está en
segundo plano
, se menciona en los documentos que la bandeja del sistema Android recibe la notificación y que la carga de
data
se puede recuperar de los
extras de la intención.
Solo agrego los detalles de mi respuesta here que prácticamente da la declaración de documentos y un enlace a una muestra:
Manejar mensajes de notificación en una aplicación de fondo
Cuando su aplicación está en segundo plano, Android dirige los mensajes de notificación a la bandeja del sistema. Un usuario que toca la notificación abre el iniciador de aplicaciones de forma predeterminada.
Esto incluye mensajes que contienen notificaciones y carga de datos (y todos los mensajes enviados desde la consola de Notificaciones). En estos casos, la notificación se entrega a la bandeja del sistema del dispositivo, y la carga de datos se entrega en los extras de la intención de su Actividad de inicio.
Creo que esta answer de @ArthurThompson lo explica muy bien:
Cuando envía un mensaje de notificación con una carga útil de datos (notificación y datos) y la aplicación está en segundo plano, puede recuperar los datos de los extras de la intención que se inicia como resultado de que el usuario toque la notificación.
Del ejemplo de FCM que inicia MainActivity cuando se toca la notificación:
if (getIntent().getExtras() != null) {
for (String key : getIntent().getExtras().keySet()) {
String value = getIntent().getExtras().getString(key);
Log.d(TAG, "Key: " + key + " Value: " + value);
}
}
No necesita implementar
sendNotification
y
onMessageReceived
usted mismo.
Al enviar:
$data = array
(
"user_id" => $res_id
//whatever fields you want to include
);
$msg = array
(
"body" => $body,
"title" => $title,
"data" => $data
// more fields
);
lado de Android (en su
MainACtivity
:
private void handleIntent(Intent intent) {
String user_id= intent.getStringExtra("user_id");
if(user_id!= null)
Log.d(TAG, user_id);
}
y por supuesto:
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
handleIntent(intent);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handleIntent(getIntent());
}
los campos que ingrese en los
data
se enviarán a su intención
extra
.
Para invocar el método
onMessageReceived()
, deberá usar otro método para enviar notificaciones (como crear una API web para enviar notificaciones).
Luego usándolo,
elimine la carga de notificación de sus mensajes de FCM para que la carga de datos se entregue al método
onMessageReceived()
.
Cuando su aplicación está en segundo plano, la carga de datos se entrega al método
onMessageReceived
solo si no hay una carga de notificación.
En caso de que existan ambas cargas útiles, el sistema maneja automáticamente la parte de notificación (bandeja del sistema) y su aplicación obtiene la carga útil de datos en los extras de la intención de la Actividad del iniciador (después de que el usuario toque la notificación).
Para obtener más información, consulte los siguientes enlaces:
- ¿Por qué está pasando esto? ¿Cómo? ¿Cómo manejar las notificaciones push?
- Respuesta original de kws. Dale un voto positivo.