GCM Intent服务OnRegistered未被调用

时间:2013-07-23 06:38:44

标签: android push-notification google-cloud-messaging

我创建了一个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" />

我的套餐图片: enter image description here

3 个答案:

答案 0 :(得分:24)

问题是

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

请提供

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

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

例如,如果您已将com.app.demo.myApp声明为应用程序包名称

将GCMIntentService放在相同的文件夹结构中。

答案 1 :(得分: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" />

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

答案 2 :(得分:2)

确保将GCMIntentService放在主文件夹中..然后将其放在任何子文件夹下,它都可以使用。我有同样的问题,它开始工作。