【问题标题】:Android- Firebase push notification click eventAndroid- Firebase 推送通知点击事件
【发布时间】:2018-09-13 07:29:49
【问题描述】:

我已经按照这个线程https://stackoverflow.com/a/38149137/6795758 来处理click_action,它在应用程序关闭时可以正常工作。但是当应用程序打开时,如果我推送通知,应用程序崩溃并显示以下错误:

Theme: themes:{default=overlay:com.cyngn.hexo, iconPack:com.cyngn.hexo, fontPkg:com.cyngn.hexo, com.android.systemui=overlay:com.cyngn.hexo, com.android.systemui.navbar=overlay:com.cyngn.hexo}
                                                                               java.lang.NullPointerException: Attempt to invoke virtual method 'void android.os.Bundle.unparcel()' on a null object reference
                                                                                   at android.os.Bundle.putAll(Bundle.java:182)
                                                                                   at android.content.Intent.putExtras(Intent.java:7098)
                                                                                   at com.seven.sample.fcm.ClickActionHelper.startActivity(ClickActionHelper.java:20)
                                                                                   at com.seven.sample.fcm.MyFirebaseMessagingService.onMessageReceived(MyFirebaseMessagingService.java:33)
                                                                                   at com.google.firebase.messaging.FirebaseMessagingService.handleIntent(Unknown Source)
                                                                                   at com.google.firebase.iid.zzc.run(Unknown Source)
                                                                                   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
                                                                                   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
                                                                                   at java.lang.Thread.run(Thread.java:818)

下面是我的 ClickActionHelper 类和 FirebaseMessaging 服务的代码

ClickActionHelper.java

public class ClickActionHelper {

public static void startActivity(String className, Bundle extras, Context context){
    Class cls;

    try {
            cls = Class.forName(className);
            Intent i = new Intent(context, cls);
            i.putExtras(extras);
            context.startActivity(i);


    }catch(ClassNotFoundException e){
        Log.e("NotificationError",e.getMessage());
        //means you made a wrong input in firebase console
    }

 }
}      

MyFirebaseMessagingService

public class MyFirebaseMessagingService extends FirebaseMessagingService {

private static final String TAG = "MyGcmListenerService";

@Override
public void onMessageReceived(RemoteMessage message) {

    Map<String, String> data = message.getData();
    if (data.containsKey("click_action")) {
        ClickActionHelper.startActivity(data.get("click_action"), null, this);
    }

    String image = message.getNotification().getIcon();
    String title = message.getNotification().getTitle();
    String text = message.getNotification().getBody();
    String sound = message.getNotification().getSound();

    int id = 0;
    Object obj = message.getData().get("id");
    if (obj != null) {
        id = Integer.valueOf(obj.toString());
    }

    this.sendNotification(new NotificationData(image, id, title, text, sound));
}


/**
 * Create and show a simple notification containing the received GCM message.
 *
 * @param notificationData GCM message received.
 */
private void sendNotification(NotificationData notificationData) {

    Intent intent = new Intent(this, LandingPage.class);
    intent.putExtra(notificationData.getTitle(), notificationData.getTextMessage());

    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);

    NotificationCompat.Builder notificationBuilder = null;
    try {

        notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("Sample")
                .setContentText(notificationData.getTextMessage()+"")
                .setAutoCancel(true)
                .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
                .setContentIntent(pendingIntent);

    } catch (Exception e) {
        e.printStackTrace();
    }

    if (notificationBuilder != null) {
        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(notificationData.getId(), notificationBuilder.build());
    } else {
        Log.d(TAG, "NotificationBuilder");
    }
}

}

【问题讨论】:

  • 您必须使用一些空参数创建新的 NotidicationData 对象。将一些日志放在 onMessageReceived 方法中,以查看是否每个变量(图像、id、标题、文本、声音)都已初始化且不为空。
  • 您将 null Bundle 传递给 ClickActionHelper,然后尝试将其放入您的附加组件中。这可能会导致 NPE。在添加捆绑包之前尝试添加一个空检查器,看看您是否仍然会遇到问题。
  • 感谢@AL 的帮助
  • 不客气。这解决了问题吗?我可以输入一个答案,以便我们可以将您的帖子标记为已回答。干杯!
  • @AL 是的。谢谢你的澄清

标签: android firebase firebase-cloud-messaging


【解决方案1】:

在您的onMessageReceived() 中,您正在调用startActivity()

ClickActionHelper.startActivity(data.get("click_action"), null, this);

传递 null 捆绑包,然后将其插入到您的 Intent Extras 中:

i.putExtras(extras);

这是导致 NPE 的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-05
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    相关资源
    最近更新 更多