2014-05-09 13 views
6

Desidero aggiungere il servizio di notifica push parse.com alla mia app Cordova. Ho letto la guida rapida di parse.com e ho inserito il file SDK nella cartella libs. dopo di che ho aggiunto i codici al file java principale e AndroidManifest.xml. l'app funziona correttamente. parse.com può ricevere il mio token dispositivo e posso inviare notifiche push al dispositivo, ma dopo due o tre notifiche push l'app si blocca.apache cordova si blocca dopo aver ricevuto notifica push parse.com

il messaggio di errore nel CatLog è questo:

05-07 02:08:25.185: E/com.parse.PushService(28735): The Parse push service cannot start because Parse.initialize has not yet been called. If you call Parse.initialize from an Activity's onCreate, that call should instead be in the Application.onCreate. Be sure your Application class is registered in your AndroidManifest.xml with the android:name property of your <application> tag. 
05-07 02:08:25.185: D/AndroidRuntime(28735): Shutting down VM 
05-07 02:08:25.185: W/dalvikvm(28735): threadid=1: thread exiting with uncaught exception (group=0x41b0de48) 
05-07 02:08:25.185: E/AndroidRuntime(28735): FATAL EXCEPTION: main 
05-07 02:08:25.185: E/AndroidRuntime(28735): Process: ir.wedesign.pushapp, PID: 28735 
05-07 02:08:25.185: E/AndroidRuntime(28735): java.lang.RuntimeException: Unable to start service [email protected] with Intent { act=com.google.android.c2dm.intent.RECEIVE flg=0x10 pkg=ir.wedesign.pushapp cmp=ir.wedesign.pushapp/com.parse.PushService (has extras) }: java.lang.RuntimeException: applicationContext is null. You must call Parse.initialize(context, applicationId, clientKey) before using the Parse library. 
05-07 02:08:25.185: E/AndroidRuntime(28735): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2726) 
05-07 02:08:25.185: E/AndroidRuntime(28735): at android.app.ActivityThread.access$2100(ActivityThread.java:139) 
05-07 02:08:25.185: E/AndroidRuntime(28735): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1297) 
05-07 02:08:25.185: E/AndroidRuntime(28735): at android.os.Handler.dispatchMessage(Handler.java:102) 
05-07 02:08:25.185: E/AndroidRuntime(28735): at android.os.Looper.loop(Looper.java:136) 
05-07 02:08:25.185: E/AndroidRuntime(28735): at android.app.ActivityThread.main(ActivityThread.java:5105) 
05-07 02:08:25.185: E/AndroidRuntime(28735): at java.lang.reflect.Method.invokeNative(Native Method) 
05-07 02:08:25.185: E/AndroidRuntime(28735): at java.lang.reflect.Method.invoke(Method.java:515) 
05-07 02:08:25.185: E/AndroidRuntime(28735): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792) 
05-07 02:08:25.185: E/AndroidRuntime(28735): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608) 
05-07 02:08:25.185: E/AndroidRuntime(28735): at dalvik.system.NativeStart.main(Native Method) 
05-07 02:08:25.185: E/AndroidRuntime(28735): Caused by: java.lang.RuntimeException: applicationContext is null. You must call Parse.initialize(context, applicationId, clientKey) before using the Parse library. 
05-07 02:08:25.185: E/AndroidRuntime(28735): at com.parse.Parse.checkContext(Parse.java:557) 
05-07 02:08:25.185: E/AndroidRuntime(28735): at com.parse.Parse.getApplicationContext(Parse.java:165) 
05-07 02:08:25.185: E/AndroidRuntime(28735): at com.parse.ManifestInfo.getContext(ManifestInfo.java:221) 
05-07 02:08:25.185: E/AndroidRuntime(28735): at com.parse.ManifestInfo.getPackageManager(ManifestInfo.java:229) 
05-07 02:08:25.185: E/AndroidRuntime(28735): at com.parse.ManifestInfo.getPackageInfo(ManifestInfo.java:240) 
05-07 02:08:25.185: E/AndroidRuntime(28735): at com.parse.ManifestInfo.deviceSupportsGcm(ManifestInfo.java:325) 
05-07 02:08:25.185: E/AndroidRuntime(28735): at com.parse.ManifestInfo.getPushType(ManifestInfo.java:109) 
05-07 02:08:25.185: E/AndroidRuntime(28735): at com.parse.PushService.onStartCommand(PushService.java:377) 
05-07 02:08:25.185: E/AndroidRuntime(28735): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2709) 
05-07 02:08:25.185: E/AndroidRuntime(28735): ... 10 more 

questo è il mio principale di file java:

/* 
     Licensed to the Apache Software Foundation (ASF) under one 
     or more contributor license agreements. See the NOTICE file 
     distributed with this work for additional information 
     regarding copyright ownership. The ASF licenses this file 
     to you under the Apache License, Version 2.0 (the 
     "License"); you may not use this file except in compliance 
     with the License. You may obtain a copy of the License at 

     http://www.apache.org/licenses/LICENSE-2.0 

     Unless required by applicable law or agreed to in writing, 
     software distributed under the License is distributed on an 
     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
     KIND, either express or implied. See the License for the 
     specific language governing permissions and limitations 
     under the License. 
*/ 

package ir.wedesign.pushapp; 

import android.os.Bundle; 
import org.apache.cordova.*; 
import com.parse.Parse; 
import com.parse.ParseAnalytics; 
import com.parse.ParseInstallation; 
import com.parse.PushService; 

public class PushApp extends CordovaActivity 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     super.init(); 
     // Set by <content src="index.html" /> in config.xml 
     super.loadUrl(Config.getStartUrl()); 
     //super.loadUrl("file:///android_asset/www/index.html"); 
     Parse.initialize(this, "xJK9ZA0Dtsjd8RwoNUUsIHPXzMRbmcxXGWqiw", "19g9eUKjLjlUdogHEXStUABNcvy2rA6azb5mXy"); 
     PushService.setDefaultPushCallback(this, PushApp.class); 
     ParseInstallation.getCurrentInstallation().saveInBackground(); 

    } 
} 

e il mio file manifest.xml è:

<?xml version='1.0' encoding='utf-8'?> 
<manifest android:hardwareAccelerated="true" android:versionCode="1" android:versionName="0.0.1" android:windowSoftInputMode="adjustPan" package="ir.wedesign.pushapp" xmlns:android="http://schemas.android.com/apk/res/android"> 
    <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" /> 
    <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.RECEIVE_BOOT_COMPLETED" /> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
    <permission android:protectionLevel="signature" 
     android:name="ir.wedesign.pushapp.permission.C2D_MESSAGE" /> 
    <uses-permission android:name="ir.wedesign.pushapp.permission.C2D_MESSAGE" /> 

    <application android:hardwareAccelerated="true" android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/app_name" android:name="PushApp" android:theme="@android:style/Theme.Black.NoTitleBar"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <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.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" /> 
    <category android:name="ir.wedesign.pushapp" /> 
    </intent-filter> 
</receiver> 
    </application> 
    <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="19" /> 
</manifest> 

I ho cercato e sembra che molti sviluppatori abbiano esattamente lo stesso problema. Ho trovato due argomenti in parse.com forum di assistenza: https://www.parse.com/questions/app-crashes-after-after-screen-unlock https://www.parse.com/questions/cannot-send-push-to-android-after-app-is-closed-until-screen-unlock e questa qui: Android App crashes when push is received and app is closed

ma le soluzioni non è chiaro per qualcuno che non conoscono Java. Come posso modificare il mio AndroidManifest.xml e il file java principale per farlo funzionare.

grazie in anticipo

risposta

6

Il servizio push Parse non possono iniziare perché Parse.initialize non è ancora stato definito. Se chiami Parse.initialize da un onCreate di un'attività, quella chiamata dovrebbe invece essere in Application.onCreate. Assicurati che la tua classe Application sia registrata nel tuo AndroidManifest.xml con la proprietà android: name del tuo tag.

Provare a separare Attività e Applicazione, creare un nuovo file di classe, ad es. Principale dell'applicazione.

PushApp.java:

public class PushApp extends CordovaActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     super.init(); 
     // Set by <content src="index.html" /> in config.xml 
     super.loadUrl(Config.getStartUrl()); 
     //super.loadUrl("file:///android_asset/www/index.html"); 
    } 
} 

MainApplication.java:

public class MainApplication extends Application { 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Parse.initialize(this, "xJK9ZA0Dtsjd8RwoNUUsIHPXzMRbmcxXGWqiw", "19g9eUKjLjlUdogHEXStUABNcvy2rA6azb5mXy"); 
     PushService.setDefaultPushCallback(this, PushApp.class); 
     ParseInstallation.getCurrentInstallation().saveInBackground(); 
    } 
} 

e il cambiamento:

<activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/app_name" android:name="PushApp" android:theme="@android:style/Theme.Black.NoTitleBar"> 

a:

<activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/app_name" android:name="MainApplication" android:theme="@android:style/Theme.Black.NoTitleBar"> 

ora si dovrebbe anche ricevere notifiche push quando applicazione è chiusa/schermo è bloccato

1

controllare il vostro manifest.xml se avete chiamato i <application> come android:name="MainApplication"

ei <activity> come android:name="PushApp"

+0

grazie mille :) sta funzionando come un fascino ora –

Problemi correlati