OneSignal 推送通知:点击打开活动

6
我已经集成了OneSignal推送通知库。我想在应用程序未运行时,从点击推送通知打开特定的活动。 我能够接收推送通知,但是当我点击通知时,应用程序崩溃了。这是我的通知接收器代码:
public class ExampleNotificationOpenedHandler implements OneSignal.NotificationOpenedHandler 
{

Context context;
@Override
public void notificationOpened(OSNotificationOpenResult result) {
    OSNotificationAction.ActionType actionType = result.action.type;
    JSONObject data = result.notification.payload.additionalData;
    String customKey;

    if (data != null) {
        customKey = data.optString("customkey", null);
        if (customKey != null)
            Log.e("OneSignalExample", "customkey set with value: " + customKey);
    }

    if (actionType == OSNotificationAction.ActionType.ActionTaken)
        Log.i("OneSignalExample", "Button pressed with id: " + result.action.actionID);

     Intent intent = new Intent(context, User_Detail.class);
     intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK);
     context.startActivity(intent);
}

这是我的错误信息

Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
2个回答

9

在onReceivedMethod之前,我忘记在类中构建构造函数了。

Context context2;

ExampleNotificationOpenedHandler(Context context) {
    context2 = context;
}

@Override
public void notificationOpened(OSNotificationOpenResult result) {
    OSNotificationAction.ActionType actionType = result.action.type;
    JSONObject data = result.notification.payload.additionalData;
    String customKey;

    Intent intent = new Intent(context2,User_Detail.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK);
    context2.startActivity(intent);


   if (data != null) {
        customKey = data.optString("customkey", null);
        if (customKey != null)
            Log.e("OneSignalExample", "customkey set with value: " + customKey);
    }

    if (actionType == OSNotificationAction.ActionType.ActionTaken)
    {
        Log.i("OneSignalExample", "Button pressed with id: " + result.action.actionID);


    }

同时在 Application 类中传递上下文

  @Override
public void onCreate() {
    super.onCreate();
    mInstance = this;


    OneSignal.startInit(this)
            .setNotificationOpenedHandler(new ExampleNotificationOpenedHandler(this))
            .init();

}

它之前还管用,但现在已经是2023年10月了,现在它已经不相关了 - undefined

1
这意味着context变量为空。 如果您查看选择构造函数的Intent的源代码。
public Intent(Context packageContext, Class<?> cls) {
    mComponent = new ComponentName(packageContext, cls);
}

ComponentName 构造函数相关

public ComponentName(Context pkg, String cls) {
     if (cls == null) throw new NullPointerException("class name is null");
     mPackage = pkg.getPackageName(); //here you get crash
     mClass = cls;
 }

您可以使用依赖注入来提供上下文,例如Dagger2。
或者实现应用程序类。
public class DemoApp extends Application {

    private static DemoApp instance;

    @Override
    public void onCreate() {
        instance = this;
        super.onCreate();
    }

    public static DemoApp getInstance() {
        return instance;
    }

}

在你的清单文件中

<application
        android:name=".demo.DemoApp"

谢谢伙计,我只是忘了在构造函数中传递上下文。 - Krunal Prajapati

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接