2014-05-09 22 views
6

Tôi muốn thêm dịch vụ thông báo đẩy parse.com vào ứng dụng Cordova của mình. Tôi đã đọc hướng dẫn bắt đầu nhanh parse.com và tôi đã đặt tệp SDK trong thư mục libs. sau đó tôi đã thêm các mã vào tệp java chính và AndroidManifest.xml. ứng dụng hoạt động chính xác. parse.com có ​​thể nhận được mã thông báo thiết bị của tôi và tôi có thể gửi thông báo đẩy tới thiết bị nhưng sau hai hoặc ba thông báo đẩy ứng dụng sẽ bị lỗi.ứng dụng apache cordova bị treo sau khi nhận được thông báo đẩy parse.com

được thông báo lỗi trong catlog là thế này:

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 

này là chính file java của tôi:

/* 
     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(); 

    } 
} 

và tập tin manifest.xml của tôi là:

<?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> 

tôi đã tìm kiếm và có vẻ như nhiều nhà phát triển có cùng một vấn đề. Tôi đã tìm thấy hai chủ đề trong diễn đàn giúp đỡ parse.com: 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 và điều này ở đây: Android App crashes when push is received and app is closed

nhưng giải pháp không rõ ràng cho một ai đó mà không biết java. Làm thế nào tôi có thể thay đổi tệp AndroidManifest.xml và tệp java chính của mình để làm cho nó hoạt động.

cảm ơn trước

Trả lời

6

Các dịch vụ push Parse không thể bắt đầu vì Parse.initialize vẫn chưa được gọi. Nếu bạn gọi Parse.initialize từ onCreate của Activity, cuộc gọi đó sẽ thay thế trong Application.onCreate. Hãy chắc chắn rằng lớp Ứng dụng của bạn được đăng ký trong AndroidManifest.xml của bạn với thuộc tính android: name của thẻ của bạn.

Cố gắng tách riêng Hoạt động và ứng dụng, tạo tệp lớp mới, ví dụ: Ứng dụng chính.

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(); 
    } 
} 

và thay đổi:

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

tới:

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

bây giờ bạn cũng sẽ nhận được thông báo đẩy khi ứng dụng được đóng/màn hình bị khóa

1

kiểm tra manifest.xml của bạn nếu bạn đặt tên cho <application> như android:name="MainApplication"

<activity> như android:name="PushApp"

+0

thanks a lot :) nó hoạt động như một sự quyến rũ bây giờ –

Các vấn đề liên quan