4

我正在尝试在 Android 上将 parse.com 推送服务与 Qt5.5 一起使用。尝试调用 ParseInstallation.getCurrentInstallation() 时出现以下错误:

W/System.err( 9094): java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.File com.parse.ParsePlugins.getParseDir()' on a null object reference
W/System.err( 9094):    at com.parse.ParseCorePlugins.getCurrentInstallationController(ParseCorePlugins.java:272)
W/System.err( 9094):    at com.parse.ParseInstallation.getCurrentInstallationController(ParseInstallation.java:52)
W/System.err( 9094):    at com.parse.ParseInstallation.getCurrentInstallation(ParseInstallation.java:57)

这是我的代码:

QAndroidJniEnvironment env;

if (!QAndroidJniObject::isClassAvailable("com/parse/Parse")) {
    qDebug() << "com/parse/Parse not available";
    return;
}

if (!QAndroidJniObject::isClassAvailable("com/parse/ParseInstallation")) {
    qDebug() << "com/parse/ParseInstallation not available";
    return;
}

QAndroidJniObject applicationId = QAndroidJniObject::fromString("MY_PARSE_APPLICATION_ID");
QAndroidJniObject clientKey = QAndroidJniObject::fromString("MY_PARSE_CLIENT_ID");
QAndroidJniObject activity = QtAndroid::androidActivity();

if (!activity.isValid()) {
    qDebug() << "invalid activity";
}

QAndroidJniObject application = activity.callObjectMethod("getApplication", "()Landroid/app/Application;");
if (!application.isValid()) {
    qDebug() << "invalid application";
}

qDebug() << env->ExceptionCheck();

QAndroidJniObject::callStaticMethod<void>("com/parse/Parse",
                      "enableLocalDatastore",
                      "(Ljava/lang/object;)V",
                      application.object<jobject>()
                      );
qDebug() << env->ExceptionCheck();

QAndroidJniObject::callStaticMethod<void>("com/parse/Parse",
                      "initialize",
                      "(Ljava/lang/object;Ljava/lang/String;Ljava/lang/String;)V",
                      application.object<jobject>(),
                      applicationId.object<jstring>(),
                      clientKey.object<jstring>()
                      );

qDebug() << env->ExceptionCheck();

// this is where it fails, until here all exception checks show no error:
QAndroidJniObject parseInstallation = QAndroidJniObject::callStaticObjectMethod("com/parse/ParseInstallation",
                                       "getCurrentInstallation",
                                       "()Lcom/parse/ParseInstallation;");

// here ExceptionCheck reports an error for the first time
qDebug() << env->ExceptionCheck();
// this gives the above error message
env->ExceptionDescribe();

if (!parseInstallation.isValid()) {
    qDebug() << "invalid parseInstallation";
    return;
}

我的 AndroidManifest.xml 在打开应用程序标记之前有以下内容(myapp 是一个占位符,真实的应用程序 ID 设置正确):

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

<!--
  IMPORTANT: Change "com.parse.starter.permission.C2D_MESSAGE" in the lines below
  to match your app's package name + ".permission.C2D_MESSAGE".
-->
<permission android:protectionLevel="signature" android:name="myapp.permission.C2D_MESSAGE"/>
<uses-permission android:name="myapp.permission.C2D_MESSAGE"/>

...以及关闭应用程序标记之前的以下内容:

<service android:name="com.parse.PushService"/>
<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="myapp"/>
  </intent-filter>
</receiver>

到目前为止,我实际上一直在使用 v-play 插件,但它停止了工作,所以我尝试自己实现它,这意味着解析端配置正确,因为它曾经与 v-play 插件一起工作(直到它停止工作; ) - 但这是 v-play 方面的错误)

我究竟做错了什么?

4

0 回答 0