2013-04-25 43 views
0

我遇到的情況是一個新的安裝我的Android應用程序的在我的GCMIntentService文件達到onRegistered功能後會崩潰。 GCM註冊成功,我可以在下次打開應用程序時檢索GCM註冊ID,但我不希望用戶第一次打開它時會崩潰。Android應用程序崩潰後GCMIntentServce onRegistered成功

我用它來打電話去報名:

GCMRegistrar.checkDevice(this); 
GCMRegistrar.checkManifest(this); 
String regId = GCMRegistrar.getRegistrationId(this); 
if (regId.equals("")) { 
    GCMRegistrar.register(this, getResources().getString(R.string.gcmToken)); 
} 

這是我GCMIntentService文件

public class GCMIntentService extends GCMBaseIntentService { 

    private static final String LOG_TAG = "GCM"; 

    public GCMIntentService() { 
     super("###############"); // use my GCM ID 
     // TODO Auto-generated constructor stub 
     Log.i(LOG_TAG, "GCMIntentService constructor called"); 
    } 

    @Override 
    protected void onError(Context arg0, String errorId) { 
     // TODO Auto-generated method stub 
     Log.i(LOG_TAG, "GCMIntentService onError called: " + errorId); 
    } 

    @Override 
    protected void onMessage(Context arg0, Intent intent) { 
     // TODO Auto-generated method stub 
     Log.i(LOG_TAG, "GCMIntentService onMessage called"); 
     Log.i(LOG_TAG, "Message is: " + intent.getStringExtra("message")); 
    } 

    @Override 
    protected void onRegistered(Context arg0, String registrationId) { 
     // TODO Auto-generated method stub 
     Log.i(LOG_TAG, "GCMIntentService onRegistered called"); 
     Log.i(LOG_TAG, "Registration id is: " + registrationId); 

     // ! ! ! CRASHES HERE ! ! ! 

    } 

    @Override 
    protected void onUnregistered(Context arg0, String registrationId) { 
     // TODO Auto-generated method stub 
     Log.i(LOG_TAG, "GCMIntentService onUnregistered called"); 
     Log.i(LOG_TAG, "Registration id is: " + registrationId); 
    } 
} 

這裏的logcat的

V/GCMBaseIntentService(9604): Releasing wakelock 
W/dalvikvm(9604): threadid=10: thread exiting with uncaught exception (group=0x40020950) 
E/AndroidRuntime(9604): FATAL EXCEPTION: IntentService[GCMIntentService-##########-1] 
E/AndroidRuntime(9604): java.lang.ClassCastException: android.app.Application 
E/AndroidRuntime(9604): at com.myfile.app.GCMIntentService.onRegistered(GCMIntentService.java:85) 
E/AndroidRuntime(9604): at com.google.android.gcm.GCMBaseIntentService.handleRegistration(GCMBaseIntentService.java:296) 
E/AndroidRuntime(9604): at com.google.android.gcm.GCMBaseIntentService.onHandleIntent(GCMBaseIntentService.java:197) 
E/AndroidRuntime(9604): at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:59) 
E/AndroidRuntime(9604): at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime(9604): at android.os.Looper.loop(Looper.java:123) 
E/AndroidRuntime(9604): at android.os.HandlerThread.run(HandlerThread.java:60) 
D/dalvikvm(9604): GC_FOR_MALLOC freed 3478 objects/299784 bytes in 815ms 

這裏墜毀部分清單文件

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.myfile.app" 
    android:versionCode="1" 
    android:versionName="1.0" > 


    <!-- B1 - BSG DEV --> 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="15" /> 

    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <uses-permission android:name="android.permission.VIBRATE"/> 

    <!-- Google Cloud Messaging --> 
    <permission android:name="com.myfile.app.permission.C2D_MESSAGE" android:protectionLevel="signature" /> 
    <uses-permission android:name="com.myfile.app.permission.C2D_MESSAGE" /> 
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <!-- Google Cloud Messaging --> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/icon1" 
     android:label="@string/app_name" > 


     <activity 
      android:name="com.myfile.app.MainActivity" 
      android:label="@string/app_name" 
      android:screenOrientation="portrait" 
      android:theme="@android:style/Theme.NoTitleBar.Fullscreen"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <activity android:name="com.myfile.app.myclass" android:screenOrientation="portrait"/> 


      <!-- Google Cloud Messaging --> 
     <receiver android:name="com.google.android.gcm.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="com.myfile.app" /> 
      </intent-filter> 
     </receiver> 
     <service android:name=".GCMIntentService" /> 
     <!-- Google Cloud Messaging --> 

     </application> 


</manifest> 

爲什麼發生這種情況,將不勝感激任何想法。

+0

你有一個'ClassCastException'。你想在'onRegistered()'的第85行施放什麼東西? – Karakuri 2013-04-25 15:09:25

+0

這讓我感到困惑......我的GCMIntentService文件甚至不超過85行。 – Chris 2013-04-25 15:22:17

回答

0

您是否登記在清單中的接收器和意圖服務?

例子:

Android的SDK-WINDOWS \演員\谷歌\ GCM \ GCM客戶端\ DIST

有:

<receiver android:name="com.google.android.gcm.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="PACKAGE_NAME" /> 
       </intent-filter> 
      </receiver> 
      <service android:name=".GCMIntentService"></service> 
+0

我確實有這些。我將我的Manifest文件添加到原始文章中。也許我有一些東西混在一起...... – Chris 2013-04-25 15:28:02

+0

我也看到了ClassCastException。你使用正確的gcm.jar庫嗎? – Andres 2013-04-25 15:37:31

+0

我如何知道我是否擁有「正確的」gcm.jar? – Chris 2013-04-25 15:41:35

0

您可以從以下路徑獲得正確的罐子看看這個例子:

GCM Example