无法从 android 上的解析推送通知接收额外数据

Posted

技术标签:

【中文标题】无法从 android 上的解析推送通知接收额外数据【英文标题】:cannot receive extra data from parse push notification on android 【发布时间】:2017-08-01 14:10:13 【问题描述】:

我使用以下云代码向安卓设备发送解析通知:

Parse.Cloud.define('SendNot', function(request, response)

    var query = new Parse.Query(Parse.Installation);
    query.equalTo('channels', 'Customer');

    Parse.Push.send
    (
        where: query ,
        data: 
        
            alert: "Hai customers",
            flag: "true"
        
    , 
     
        useMasterKey : true,
        success: function() 
        
            response.success("true");
        ,
        error: function(error) 
        
            response.error("error");
        
    );
);

我想获取存储在“标志”字段中的数据。我使用以下代码接收通知:

@Override
public void onReceive(Context context, Intent intent)

    System.out.println("Received Notification");
    jsonString = intent.getExtras().getString("com.parse.Data");
    try 
        json = new JSONObject(jsonString);
        System.out.println(json.getString("flag") + " Notification content");
     catch (Exception e) 
        e.printStackTrace();
    

我能够收到通知。但是,我无法获得“标志”的价值。它显示以下异常:

java.lang.NullPointerException: Attempt to invoke virtual method 'int 
java.lang.String.length()' on a null object reference
                    03-11 10:56:48.170 22214-22214/com.hashcoder.eegoomain W/System.err:     at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
                    03-11 10:56:48.170 22214-22214/com.hashcoder.eegoomain W/System.err:     at org.json.JSONTokener.nextValue(JSONTokener.java:94)
                    03-11 10:56:48.170 22214-22214/com.hashcoder.eegoomain W/System.err:     at org.json.JSONObject.<init>(JSONObject.java:156)
                    03-11 10:56:48.170 22214-22214/com.hashcoder.eegoomain W/System.err:     at org.json.JSONObject.<init>(JSONObject.java:173)
                    03-11 10:56:48.170 22214-22214/com.hashcoder.eegoomain W/System.err:     at com.hashcoder.eegoomain.MyBroadcastReceiver.onReceive(MyBroadcastReceiver.java:31)
                    03-11 10:56:48.170 22214-22214/com.hashcoder.eegoomain W/System.err:     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2732)
                    03-11 10:56:48.170 22214-22214/com.hashcoder.eegoomain W/System.err:     at android.app.ActivityThread.access$1800(ActivityThread.java:153)
                    03-11 10:56:48.170 22214-22214/com.hashcoder.eegoomain W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1428)
                    03-11 10:56:48.171 22214-22214/com.hashcoder.eegoomain W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
                    03-11 10:56:48.171 22214-22214/com.hashcoder.eegoomain W/System.err:     at android.os.Looper.loop(Looper.java:148)
                    03-11 10:56:48.171 22214-22214/com.hashcoder.eegoomain W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5441)
                    03-11 10:56:48.171 22214-22214/com.hashcoder.eegoomain W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
                    03-11 10:56:48.171 22214-22214/com.hashcoder.eegoomain W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738)
                    03-11 10:56:48.171 22214-22214/com.hashcoder.eegoomain W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628)

代码有什么问题?

【问题讨论】:

你从哪里调用函数'onReceive'? 我从一个名为 MyBroadcastReceiver 的类中调用它,该类扩展了 WakefulBroadcastReceiver。我还添加了这个类来显示为这样的接收器:&lt;receiver android:name=".MyBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND"&gt; &lt;intent-filter&gt; &lt;action android:name="com.google.android.c2dm.intent.RECEIVE"/&gt; &lt;category android:name="com.hashcoder.eegoomain"/&gt; &lt;/intent-filter&gt; &lt;/receiver&gt; 【参考方案1】:

创建另一个扩展 ParsePushBroadcastReceiver 的类并在该类上调用 onPushReceive 函数。

    public class ClassName extends ParsePushBroadcastReceiver
    
        String jsonString;
        JSONObject json;`

        protected void onPushReceive(Context mContext, Intent mintent)
        
            jsonString = mintent.getExtras().getString("com.parse.Data");
            try 
                json = new JSONObject(jsonString);
                System.out.println(json.getString("flag") + " Notification content");
             catch (Exception e) 
                e.printStackTrace();
            
                                                                                                         
    

并将此类作为接收器添加到清单文件中,如下所示:

<receiver
        android:name=".ClassName"
        android:exported="false">
        <intent-filter>
            <action android:name="com.parse.push.intent.RECEIVE" />
            <action android:name="com.parse.push.intent.DELETE" />
            <action android:name="com.parse.push.intent.OPEN" />
        </intent-filter>
    </receiver>

【讨论】:

以上是关于无法从 android 上的解析推送通知接收额外数据的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序被杀死Android时无法接收解析推送通知

在 Android 上解析接收通知

Android:使用 ParsePushBroadcastReceiver 解析推送通知不起作用

解析服务器中的推送通知

通过谷歌推送通知接收来自额外密钥的旧值

解析推送通知错误