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

相关问题