GCM意图服务中的OnRegistered未被调用

6
我已经创建了一个GCM Intent服务,设备成功注册。我也收到了REGISTRATION Intent,但OnMessage或OnRegistered方法没有被调用。
下面是日志:
07-23 06:24:23.542: V/GCMBroadcastReceiver(1168): onReceive: com.google.android.c2dm.intent.REGISTRATION
07-23 06:24:23.542: V/GCMBroadcastReceiver(1168): GCM IntentService class: com.app.demo.myApp.GCMIntentService
07-23 06:24:23.581: V/GCMBaseIntentService(1168): Acquiring wakelock

以下是 OnMessage 的代码。
请问有人能帮我解决为什么 OnRegistered 或 OnMessage 没有被调用的问题吗?
 public class GCMIntentService extends GCMBaseIntentService {



    @Override
    protected void onMessage(Context arg0, Intent arg1) {
        // TODO Auto-generated method stub
        Toast.makeText(getApplicationContext(), "registered", Toast.LENGTH_LONG).show();
        String device_id = GCMRegistrar.getRegistrationId(this);
        GSLogger.Log("mess_received", device_id);
    }

    @Override
    protected void onRegistered(Context context, String arg1) {
        Toast.makeText(context, "registered", Toast.LENGTH_LONG).show();
        String device_id = GCMRegistrar.getRegistrationId(this);
        GSLogger.Log("registered", device_id);

    }

}

清单代码:

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

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_CALENDAR" />
    <uses-configuration android:name="android.permission.GET_ACCOUNTS"/>
    <uses-permission android:name="com.google.android.c2dm.permission.C2D_MESSAGE"/>


    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
     <permission android:name="com.app.demo.myApp.permission.C2D_MESSAGE" 
        android:protectionLevel="signature" />
    <uses-permission android:name="com.app.demo.myApp.permission.C2D_MESSAGE" />

清单文件中的接收器代码:

<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.app.demo.myApp" />
          </intent-filter>
        </receiver>
        <service android:name="com.app.demo.myApp.GCMIntentService" />

我的包裹图片: 在此输入图片描述

请展示你的 manifest.xml 代码。 - RajaReddy PolamReddy
更新了清单代码。 由于我可以看到GCMBroadCastReciver的OnReceived日志,所以我觉得清单应该没有问题。 - Raghav
3个回答

24

问题是

<service android:name="com.app.demo.myApp.GCMIntentService" />

只是给予

<service android:name=".GCMIntentService" />

将您的GCMIntentService Java文件放置在清单中指定的包名称所在的文件夹中。

例如,如果您声明了com.app.demo.myApp作为应用程序包名称,则将您的GCMIntentService放置在相同的文件夹结构中。


你是否将GCMIntentService添加到正确的包位置? - Nargis
我把它放在了与所有其他.java文件相同的src文件夹下的同一包中。这是正确的位置吗? - Raghav
1
Nargis准确回答了问题... 这对我有用... 但在模拟器中,由于没有Google账户,我遇到了AUTHENTICATION_FAILED错误。 在设备上这个方法非常有效。 - Raghav
这太疯狂了,为什么我不能把它放在任何我想要的包中并从那里运行呢:S 这真是令人沮丧。 - Warpzit
它可以工作了,我没有在清单文件中添加意图服务,是我的错。 - Gujarat Santana
显示剩余5条评论

2
我看到您的清单文件存在一些潜在问题,但我不确定它们是否是导致问题的原因:
以下内容不是必需的:
<uses-permission android:name="com.google.android.c2dm.permission.C2D_MESSAGE"/>

您已经拥有正确的C2D_MESSAGE权限:

 <permission android:name="com.app.demo.myApp.permission.C2D_MESSAGE" 
    android:protectionLevel="signature" />
<uses-permission android:name="com.app.demo.myApp.permission.C2D_MESSAGE" />

另外,GCM支持API级别8及以上,因此您可能不应指定android:minSdkVersion="7"

1
一些示例项目中有两个权限重复且冗余。很好,删除第二个似乎解决了我的问题。 - voghDev

2

请确保将您的GCMIntentService放在主文件夹中..不要把它放在任何子文件夹下,这样它就会正常工作。我也遇到了同样的问题,但它开始起作用了。


这也是我发现的,但是为什么要这样呢..? - Micro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接