【问题标题】:Parse Installation not getting DeviceToken解析安装未获得 DeviceToken
【发布时间】:2015-10-06 00:36:38
【问题描述】:

我正在尝试在 android 中使用解析来推送通知,我在 Application 类中注册解析,如下所示:

@Override
public void onCreate() {
    super.onCreate();
    Parse.initialize(this, "***************", "***************");
}

我在主要活动中订阅这样的推送:

@Override
    protected void onCreate(Bundle savedInstanceState) {

    ParsePush.subscribeInBackground("", new SaveCallback() {
        @Override
        public void done(ParseException e) {
            if (e == null) {

                        ParseInstallation.getCurrentInstallation().saveInBackground(new SaveCallback() {
                            @Override
                            public void done(ParseException e) {


                                if (e == null) {
                                    String deviceToken = (String) ParseInstallation.getCurrentInstallation().get("deviceToken");
                                    Log.e("MainActivity", "device toekn " + deviceToken);

                                } else {
                                    Log.e("MainActivity", "failed to subscribe for push " + e.getLocalizedMessage());
                                }
                            }
                        });

            } else {
                Log.e("MainActivity", "failed to subscribe for push", e);
            }
        }
    });



    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

这是我的清单部分,适用于解析:

  <service android:name="com.parse.PushService" />
    <receiver android:name="com.parse.ParseBroadcastReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.USER_PRESENT" />
        </intent-filter>
    </receiver>
    <receiver android:name="com.parse.ParsePushBroadcastReceiver"
        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>
    <receiver android:name="com.parse.GcmBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />

            <!--
              IMPORTANT: Change "com.parse.starter" to match your app's package name.
            -->
            <category android:name="com.****" />
        </intent-filter>
    </receiver>

但是,设备令牌大多数时候返回 null 并且设备在解析仪表板中没有设备令牌,因此,我的设备没有收到推送通知。

奇怪的是,有时它确实有效,我确实得到了 deviceToken 而安装对象确实得到了推送,有没有人遇到过这种行为?

【问题讨论】:

    标签: android parse-platform push-notification push android-notifications


    【解决方案1】:

    这个问题最终解决了,一个简单的错误在标签中清单的标签中的应用程序名称。 由于我在这里发布的代码是“com.***”,没有人能帮上忙,我很抱歉。

    【讨论】:

      【解决方案2】:

      我遇到了这个问题,我通过修改我的 AndroidManifest 文件解决了这个问题。

      您似乎可以将解析配置为使用“解析推送网络”或GCM(谷歌云消息)

      Parse 为希望避免依赖 Google Play 商店的应用以及不支持 Play 商店的设备(如 Kindle)使用自己的推送网络。 因此,在 other 中设置以下内容以使用 GCM 很重要。

      <uses-permission android:name="android.permission.INTERNET" />
       <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
       <uses-permission android:name="android.permission.VIBRATE" />
       <uses-permission android:name="android.permission.WAKE_LOCK" />
       <uses-permission android:name="android.permission.GET_ACCOUNTS" />
       <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
       <permission android:name="YOUR_PACKAGE_NAME.permission.C2D_MESSAGE"
         android:protectionLevel="signature" />
       <uses-permission android:name="YOUR_PACKAGE_NAME.permission.C2D_MESSAGE" />
      

      将上述声明中的 YOUR_PACKAGE_NAME 替换为您的应用程序包名称。此外,请确保将 com.parse.GcmBroadcastReceiver 和 com.parse.PushService 声明为元素的子元素:

      这对我有用,也对你有用。

      Read this to get a full understanding

      【讨论】:

        【解决方案3】:

        我猜你使用的是 1.9.3 版。在 1.9.4 版中,他们已经解决了这个问题。检查release notes

        【讨论】:

        • 我已经看到这个问题并尝试过,我没有使用 1.9.3 我正在使用 1.9.4,这个问题仍然存在
        • @ZivKesten 你得到这个问题的解决方案了吗.. 我面临着与 1.10.2 相同的问题
        • 我的问题是清单中的类别名称中的一个简单错误。 在意图接收器中。不幸的是,这里没有真正的解决方案。
        【解决方案4】:

        将解析日志设置为详细有助于进一步调试:

        Parse.setLogLevel(Parse.LOG_LEVEL_VERBOSE);
        

        我注意到我在清单中使用了错误的“sender_id”:

        <meta-data android:name="com.parse.push.gcm_sender_id"
                android:value="id:123456789"/>
        

        我正在使用我自己的 GCM,而你在这里没有这样做......但是 LOG_LEVEL_VERBOSE 可能会帮助其他人调试它。

        【讨论】:

          【解决方案5】:

          如果不添加任何内容,为什么要保存安装? ParseSDK 已经为您做到了。

          您必须将有效的“频道”参数传递给 subscribeInBackground: 这是 parse 用来推送的通道;没有它,你根本不会得到任何推动。 https://parse.com/docs/android/api/com/parse/ParsePush.html#subscribeInBackground(java.lang.String,%20com.parse.SaveCallback)

          此外,请确保您已在清单中添加所需的标签,以便解析推送正常工作 - 所需的标签就像这里解释的那样:

          https://parse.com/docs/android/guide#push-notifications-receiving-pushes

          【讨论】:

          • 据我了解,如果我在频道参数中加上“,这意味着这个应用程序正在注册所有频道。我觉得我必须强调这个代码确实有效的事实时间,我只是不知道为什么,为什么不。
          • “时不时”听起来像是你遇到的一种竞争条件。
          • 我不明白你所说的“比赛条件”是什么意思,你能解释一下吗?
          猜你喜欢
          • 2015-02-14
          • 2015-04-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-29
          相关资源
          最近更新 更多