Не удается передать данные через pendingIntent в firebase-cloud-messaging - PullRequest
1 голос
/ 04 апреля 2019

Я использую firebase-cloud-messaging для push-уведомления моего приложения.Я хотел, чтобы, когда пользователь нажимал на уведомление, он открывал OpenWeb класс и открытый URL-адрес намерения.

Отправленные данные с использованием PHP:

$data = array("notification"=> array("title"=>"http://example.com/",
                                 "text"=>"This is a test msg!",
                                 "click_action"=>"OpenWeb"),
          "priority" => "high",
          "to"=>"/topics/main");

MyFirebaseMessagingService.java

 public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);

        String title = remoteMessage.getNotification().getTitle();
        String body = remoteMessage.getNotification().getBody();
        String click_action = remoteMessage.getNotification().getClickAction();

        Context context = getApplicationContext();
        Intent intent = new Intent(click_action);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        intent.putExtra("link",title);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0 , intent, PendingIntent.FLAG_ONE_SHOT);

        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context)
            .setSmallIcon(R.drawable.notification)
            .setLargeIcon(BitmapFactory.decodeResource(context.getResources(),R.drawable.notification))
            .setContentTitle("Notification")
            .setContentText(body)
            .setSound(defaultSoundUri)
            .setAutoCancel(true)
            .setContentIntent(contentIntent);

        NotificationManager notificationManager =
            (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(0 , notificationBuilder.build());

}

OpenWeb.java

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(getIntent.getStringExtra("link"));
    startActivity(intent);
}

AndroidManifest.xml

<activity android:name=".OpenWeb">
    <intent-filter>
        <action android:name="OpenWeb" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Когда я нажимаю на уведомление, начинается действие, и getIntent.getStringExtra("link") в OpenWeb равно нуль .Это означает, что класс MyFirebaseMessagingService не отправляет данные в действие.

Что нужно сделать, чтобы отправить данные в OpenWeb?

1 Ответ

1 голос
/ 04 апреля 2019

Ну, есть некоторые проблемы с кодом 1. в вашем php-скрипте вы не указываете "body", но вы все еще вызываете String body = remoteMessage.getNotification().getBody();, это одно исключение нулевого указателя.

2.Этот ключ click_actionбудет работать только тогда, когда приложение находится на переднем плане, для всех остальных случаев, когда приложение находится в фоновом режиме и закрыто, оно не работает.

3. Вам нужно установить флаги, чтобы начать новое действие, поэтому intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

, так что если ожидающее намерение увольняет вас, в результате чего вы получили npe по причине номер 2, теперь вы можете обойти это, отправив сообщения с данными вместо firebase sdk, обрабатывающего ваши уведомления, и тогда это будут коридоры NONNULL

хорошо, у firebase есть два типа сообщений

  1. Push-сообщения, которые обрабатываются с помощью firebase SDK, и это сообщения, в которых вы задаете заголовок, текст и другие факторы, кроме вас.не может отправлять пользовательские данные

Массажи данных должны быть парами ключ-значение.

в качестве примера вы хотите отправить сомДанные с вашим уведомлением о том, что клиентское приложение будет обрабатывать, например, вы отправляете некоторые новости о спортивном матче, чтобы вы могли создать узел в формате JSON, говоря

data: { 
coolNews: "Some Cool News1",
coolNews2: "Some really cool news2"
}

, а затем вы можете позвонить remoteMessage.getData().get("coolNews");

однако будьте осторожны, потому что если вы отправите следующий JSON

Notification:{
to: //UserToken , 
title: "Some Title",
body: "Some body",
data: { 
coolNews: "Some Cool News1",
coolNews2: "Some really cool news2"
}}

Полезная нагрузка данных будет управляться только после того, как клиент откроет уведомление, однако, если вы отправите целое json-уведомление как полезную нагрузку данныхи вы обрабатываете все на стороне клиента, все это будет получено одновременно.как следующее:

 Notification:{
to: //UserToken 
data: { 
title: "Some Title",
body: "Some body",
coolNews: "Some Cool News1",
coolNews2: "Some really cool news2"
}}

и затем в вашем FirebaseMessageId вы можете позвонить remotemessage.getData().get("title"); для названия и то же самое для всех остальных, таких как body и coolNews ..

Теперь для BroadCast recevier вы можете отправлять трансляции через firebasemessagingId следующим образом:

Intent intent = new Intent(this, NotificationBR.class);
        Bundle bundle = new Bundle();
        bundle.putDouble("key1",remoteMessage.getData().get("title"));
        bundle.putDouble("key2",remoteMessage.getData().get("coolNews1"));
        ......
        intent.putExtras(bundle);
        sendBroadcast(intent);

и инициировать broadcast class и

DONT FORGET TO ADD TO YOUR MANIFEST!

как-то так ...

public class NotificationBR extends BroadCastReciever {
@Override
public void onReceive(Context ctx, Intent intent){
if(intent.getExtras() != null){
String key1 = intent.getStringExtra("key1");
......
}
//Then you can use intent to send it to whichever activity you want

Intent sendToActivity = new Intent(ctx, Activity.class);


 sendToActivity.putExtras(someBundle) //Containing your strings you want to pass to activity, you can also use sendToActivity.putStringExtra("Some values")


 startActivity(sendToActivity);

и все.

извините за опечатки ..

...