wake-up-neo.com

Firebase-Konsole: So legen Sie click_action für Benachrichtigungen fest

Ich habe Firebase implementiert und die Firebase-Benachrichtigungen getestet. Wenn die App im Vordergrund ist, habe ich keine Probleme. Ich habe einen Dienst implementiert, der FirebaseMessagingService erweitert und die Nachrichten und Daten in onMessageReceived verarbeitet.

Ich habe Probleme, wenn sich die App im Hintergrund befindet. Ich möchte eine Benachrichtigung senden, die eine bestimmte Aktivität öffnet und das tut, was ich geplant habe, und nicht nur die App öffnen.

Ich habe es wie im Firebase-Handbuch beschrieben, aber ich kann die spezifische Aktivität nicht starten.

Hier das Manifest:

<activity Android:name=".BasicNotificationActivity">
            <intent-filter>
                <action Android:name="OPEN_ACTIVITY_1" />
                <category Android:name="Android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

Und hier die Firebase Console. Was muss ich in diesen Feldern schreiben, um meine "BasicNotificationActivity" zu öffnen?

 Firebase console

14
Alex

Dies ist ein Duplikat dieser Frage: Firebase FCM-Benachrichtigungen click_action payload

Die Antwort, die vom Autor dieser Frage akzeptiert wurde, besagt jedoch nur, dass dies mit Firebase Console nicht möglich ist. Dies ist jedoch mit einer einfachen Problemumgehung möglich. Diese Antwort von diidu auf dieselbe Frage erklärt die Problemumgehung, die ich verwenden würde.

UPDATE:
Um auf seine Antwort einzugehen: 

Fügen Sie eine Hilfsklasse hinzu (oder implementieren Sie die startActivity()-Methode irgendwie): 

public class ClickActionHelper {
    public static void startActivity(String className, Bundle extras, Context context){
        Class cls;
        try {
            cls = Class.forName(className);
        }catch(ClassNotFoundException e){
            //means you made a wrong input in firebase console
        }
        Intent i = new Intent(context, cls);
        i.putExtras(extras);
        context.startActivity(i);
    }
}

Rufen Sie in der Launcher-Aktivität Ihrer App ein mehtod auf, um neue Absichten in onCreate() und onNewIntent() zu überprüfen (onNewIntent() wird nur anstelle von onCreate() aufgerufen, wenn Activity mit Single-Top-Flag gestartet wird):

@Override
protected void onCreate(Bundle bundle) {
    [...]
    checkIntent(getIntent());
 }

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    [...]
    checkIntent(intent);
}

public void checkIntent(Intent intent) {
       if (intent.hasExtra("click_action")) {
        ClickActionHelper.startActivity(intent.getStringExtra("click_action"), intent.getExtras(), this);
       }
}

Und in onMessageReceived():

 public void onMessageReceived(RemoteMessage remoteMessage) {
     Map<String, String> data = remoteMessage.getData();        
     if (data.containsKey("click_action")) {
         ClickActionHelper.startActivity(data.get("click_action"), null, this);
     }
 }

Um eine Benachrichtigung mit der Firebase-Konsole zu senden, geben Sie ein Schlüssel-Wert-Paar als benutzerdefinierte Daten wie folgt ein:

Key: click_action
Value: <fully qualified classname of your activity>

Wenn nun eine Benachrichtigung empfangen und angeklickt wird, wird Ihre Aktivität geöffnet. Wenn sich Ihre App im Vordergrund befindet, wird sie auch sofort in die Aktivität geändert. Es ist wahrscheinlich gut, den Benutzer zu fragen, ob er zu dieser Aktivität gehen möchte oder nicht (indem Sie einen Dialog in onMessageReceived() anzeigen).

21
Micha F.

Ich habe die handleIntent(Intent intent)-Methode verwendet, um mit intent umzugehen und zu diesem bestimmten Bildschirm zu gelangen. Unten ist mein Code, der auch dann perfekt funktioniert, wenn sich die App im Hintergrund befindet:

FCMMessagingService.Java welche extends FCMMessagingService

@Override
    public void handleIntent(Intent intent) {
        super.handleIntent(intent);

     Intent i = null;
     String value_action = "";

      if (intent.getExtras() != null) {
          if (key.equals("click_action")) {
                value_action = intent.getExtras().getString(key);
            }

          i = new Intent(FCMMessagingService.this, MainActivity.class);
          i.putExtra("notificationFlag", value_action);
          i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

      }
     PendingIntent pendingIntent = PendingIntent.getActivity(this, notifCount, i, PendingIntent.FLAG_ONE_SHOT);
        final int icon = R.mipmap.logo;
    Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);

    Notification notification;
    notification = notificationBuilder.setSmallIcon(icon).setTicker(title)
            .setAutoCancel(true)
            .setContentTitle(title)
            .setContentText(body)
            .setSound(defaultSoundUri)
            .setContentIntent(pendingIntent)
            .setSmallIcon(R.mipmap.notification_icon)
            .setLargeIcon(BitmapFactory.decodeResource(getResources(), icon))
            .build();


    notificationBuilder.setContentTitle(title);
    notificationBuilder.setContentText(body);
    notificationBuilder.setAutoCancel(true);
    notificationBuilder.setSound(defaultSoundUri);
    notificationBuilder.setContentIntent(pendingIntent);
    notificationBuilder.setLargeIcon(BitmapFactory.decodeResource(getResources(), icon));
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
        notificationBuilder.setSmallIcon(R.mipmap.logo);
    } else {
        notificationBuilder.setSmallIcon(R.mipmap.logo);
    }

    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(notifCount, notification);

}
1
R G

Ich habe auch die Probleme wie du, aber ich bekomme keine richtige Antwort. Das sind die Fakten, die ich kenne,

  1. onNewIntent 

diese Überschreibungsmethode funktioniert nicht, wenn die App im Hintergrund arbeitet. Standardaktion istAndroid.intent.action.MAIN 

  1. Firebase-Konsole

die Firebase-Konsole reicht nicht aus, um mit click_action umzugehen das bedeutet, dass die Klick-Aktion die Anwendung nicht erreichen kann, wenn sich die App im Hintergrund befindet.

  1. CURL

Curl arbeitet im App-Hintergrund, aber nicht im Vordergrund. Ich kann es nicht finden.

curl --header "Authorization: key=<Colud_Messaging_Server_Key_here>" --header Content-Type:"application/json" https://fcm.googleapis.com/fcm/send  -d "{\"to\":\"dwdfosu6SDs:APA91bFWxZZB2f8AOgP9MG504cy5AhFECHGbYFfIzVixoAfy-ErT0NYQrREg150CbKYBtk3Ywpu7WQuWsQhk-VmoOe-0iDK3ZgaFZNvYxDuixZB8zQp0zydoXhyrMosi5C4eyBb7Ai1z\",\"notification\": {\"title\": \"Click Action Message\",\"text\": \"Sample message\",\"click_action\":\"noti\",\"ticket_download\":\"noti\"}}"

Minifest hinzufügen

<activity
   Android:name=".activity.TicketDownload"
   Android:exported="true">
   <intent-filter>
      <action Android:name="noti" />
      <category Android:name="Android.intent.category.DEFAULT" />
   </intent-filter>
</activity>

note Hinweis: cloud_messaging_server_key ist locate einstellung> cloudmessaging

wenn etwas neue Fakten, lass es mich wissen.

0
Nyan Lin Tun

Diese Frage ist 2 Jahre alt. Ist aber immer noch relevant ..__ So könnte man es mit der Firebase-Konsole machen (ohne "click_action").

Wenn sich Ihre App im Hintergrund befindet, wird onMessageReceived nicht aufgerufen. Wenn Sie jedoch eine Benachrichtigung erhalten, während sich Ihre App im Hintergrund befindet, erhalten Sie eine Intent zusammen mit den benutzerdefinierten Daten, die Sie in der Firebase-Konsole angeben.

Wenn der Benutzer auf die Benachrichtigung tippt, wird the intent ausgeführt, um die Launcher-Aktivität zu öffnen. Sie können die Daten über getIntent().hasExtra("key") in Ihrer Launcher-Aktivität überprüfen. Der "key" ist der Schlüssel, den Sie in der Konsole angeben.

Überprüfen Sie, ob Sie diesen "key" haben. Dann können Sie eine andere Intent erstellen und startActivity aufrufen.

Hier ist eine Implementierung von mir,

Auf meiner SplashActivity> OnCreate (Diese Methode Sieht am besten aus, wenn Sie als Startprogramm einen Begrüßungsbildschirm haben):

if (getIntent().hasExtra("key")){

      Intent intent = new Intent(this, TargetActivity.class);
      startActivity(intent);
      finish();

} else {
      startActivity(new Intent(this, MainActivity.class));
      finish();
}

Dies startet nur die TargetActivity. Sie können jede Funktionalität nach Ihren Wünschen hinzufügen :)

0
Ali