Presione usando Parse en Qt5.5 para Android: NullPointerException en getCurrentInstallation
parse.com qtandroidextras (0)
Estoy tratando de usar el servicio push de parse.com con Qt5.5 en Android. Cuando intento llamar a ParseInstallation.getCurrentInstallation () obtengo el siguiente error:
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)
Aquí está mi código:
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;
}
Mi AndroidManifest.xml tiene lo siguiente, justo antes de la etiqueta de la aplicación de apertura (myapp es un marcador de posición, la identificación de la aplicación real está configurada correctamente):
<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"/>
... y lo siguiente justo antes de la etiqueta de cierre de la aplicación:
<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>
De hecho, utilicé el complemento v-play hasta ahora, pero dejó de funcionar, así que intento implementarlo yo mismo, lo que significa que el análisis sintáctico se configuró correctamente, porque solía funcionar con el complemento v-play (hasta que dejó de funcionar; ) - pero eso es un error en el lado de v-play)
¿Qué estoy haciendo mal?