0

我已經遵循谷歌指南關於新的GCM與谷歌播放服務和開發小時後我設法註冊我的設備在GCM服務器上,以獲得REGISTER_ID和創建一個PHP腳本哪些發送了正確的發佈請求。谷歌雲消息傳遞錯誤:無法實例化接收器

壞消息是,我不設法得到我的推送通知,當我運行我的應用程序的logcat顯示了這個錯誤:

12-19 19:48:24.405: E/AndroidRuntime(9570): FATAL EXCEPTION: main 
12-19 19:48:24.405: E/AndroidRuntime(9570): java.lang.RuntimeException: Unable to instantiate receiver com.baruckis.SlidingMenuImplementation.GcmBroadcastReceiver: 
              java.lang.ClassNotFoundException: com.baruckis.SlidingMenuImplementation.GcmBroadcastReceiver 
12-19 19:48:24.405: E/AndroidRuntime(9570):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2112) 
12-19 19:48:24.405: E/AndroidRuntime(9570):  at android.app.ActivityThread.access$1500(ActivityThread.java:127) 
12-19 19:48:24.405: E/AndroidRuntime(9570):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1209) 
12-19 19:48:24.405: E/AndroidRuntime(9570):  at android.os.Handler.dispatchMessage(Handler.java:99) 
12-19 19:48:24.405: E/AndroidRuntime(9570):  at android.os.Looper.loop(Looper.java:137) 
12-19 19:48:24.405: E/AndroidRuntime(9570):  at android.app.ActivityThread.main(ActivityThread.java:4507) 
12-19 19:48:24.405: E/AndroidRuntime(9570):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-19 19:48:24.405: E/AndroidRuntime(9570):  at java.lang.reflect.Method.invoke(Method.java:511) 
12-19 19:48:24.405: E/AndroidRuntime(9570):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) 
12-19 19:48:24.405: E/AndroidRuntime(9570):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
12-19 19:48:24.405: E/AndroidRuntime(9570):  at dalvik.system.NativeStart.main(Native Method) 
12-19 19:48:24.405: E/AndroidRuntime(9570): Caused by: java.lang.ClassNotFoundException: com.baruckis.SlidingMenuImplementation.GcmBroadcastReceiver 
12-19 19:48:24.405: E/AndroidRuntime(9570):  at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61) 
12-19 19:48:24.405: E/AndroidRuntime(9570):  at java.lang.ClassLoader.loadClass(ClassLoader.java:501) 
12-19 19:48:24.405: E/AndroidRuntime(9570):  at java.lang.ClassLoader.loadClass(ClassLoader.java:461) 
12-19 19:48:24.405: E/AndroidRuntime(9570):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2107) 
12-19 19:48:24.405: E/AndroidRuntime(9570):  ... 10 more 
12-19 19:48:52.620: I/Process(9570): Sending signal. PID: 9570 SIG: 9 

這是我的清單(我省略了不必要的部分代碼):

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="17" 
    /> 
<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 

<permission android:name="com.baruckis.SlidingMenuImplementation.permission.C2D_MESSAGE" 
    android:protectionLevel="signature" /> 
<uses-permission android:name="com.baruckis.SlidingMenuImplementation.permission.C2D_MESSAGE" /> 

<!-- This app has permission to register and receive data message. --> 
<uses-permission 
    android:name="com.google.android.c2dm.permission.RECEIVE" /> 

<application 

       [...] 

<receiver 
     android:name="com.baruckis.SlidingMenuImplementation.GcmBroadcastReceiver" 
     android:enabled="true" 
     android:exported="true" 
     android:permission="com.google.android.c2dm.permission.SEND" > 
     <intent-filter> 
      <!-- Receives the actual messages. --> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
      <category android:name="com.baruckis.SlidingMenuImplementation" /> 
     </intent-filter> 
</receiver> 

<service android:name="com.baruckis.SlidingMenuImplementation.GcmIntentService" /> 
<meta-data android:name="com.google.android.gms.version" android:value="4030500" /> 
    </application> 

最後,這是我GcmBroadcastReceiver代碼:

package com.baruckis.SlidingMenuImplementation; 

import android.app.Activity; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.support.v4.content.WakefulBroadcastReceiver; 

public class GcmBroadcastReceiver extends WakefulBroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    // Explicitly specify that GcmIntentService will handle the intent. 
    ComponentName comp = new ComponentName(context.getPackageName(), 
      GcmIntentService.class.getName()); 
    // Start the service, keeping the device awake while it is launching. 
    startWakefulService(context, (intent.setComponent(comp))); 
    setResultCode(Activity.RESULT_OK); 
    } 
} 

多虧了二! :)

+0

哪裏是在GcmBroadcastReceiver代碼包線? –

+0

更新代碼,對不起,我忘了複製並粘貼它! – Peppegiuseppe

回答

1

嘗試擴展提供:com.google.android.gcm.GCMBroadcastReceiver

public class MyGCMBroadcastReceiver extends com.google.android.gcm.GCMBroadcastReceiver { 
    protected String getGCMIntentServiceClassName(Context context) { 
     return GCMIntentService.class.getName(); 
    } 
} 
+0

我認爲這不是一個可行的解決方案!我需要從WakefulBroadcastReceiver延伸... – Peppegiuseppe

+0

好的。嘗試使用:android:name =「。GcmBroadcastReceiver」而不是android:name =「com.baruckis.SlidingMenuImplementation.GcmBroadcastReceiver」。我知道(根據經驗)GCM庫代碼對你的接收器類與你的意圖服務的相對位置做了一些假設。試一試。他們的例子顯示在清單中註冊的接收者是相對包名。 –

+0

沒有...我有同樣的錯誤! – Peppegiuseppe

相關問題