2

我有使用 GCM 的库项目。我正在尝试使用不推荐使用没有 gcm.jar 的方式。让我们从应用程序项目(不是库)的清单开始:

这里我有套餐

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.sennin.app"

在这里,我创建了我的权限:

<permission android:name="com.sennin.app.permission.C2D_MESSAGE" android:protectionLevel="signature" />

在这里我和其他人一起使用它:

<uses-permission android:name="com.sennin.app.permission.C2D_MESSAGE"/>
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="android.permission.USE_CREDENTIALS"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

这是接收者和 IntentService 条目:

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

我知道接收器操作com.google.android.c2dm.intent.REGISTRATION在理论上是多余的,但这是使注册与旧设备一起工作的黑客(顺便在 stackoverflow 上找到)。

我需要补充一点,我的图书馆有 package com.sennin

好的,现在让我们转到接收器本身:

public class SenninGCMBroadcastReceiver extends WakefulBroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("GCM", "RECEIVE GCM");
        // 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);
    }
}

如您所见,在第一行 onReceive 方法是Log。这个日志很重要,我只想看到这个日志logcat;)

我省略了消息传递过程的注册部分,因为注册运行良好。我有registration_id我将它发送到服务器。在我放入registration_id数据存储的服务器站点上。之后,我只是想发送一些消息。我可以在服务器端看到该消息已发送。我有 message_id 并且没有错误。一切似乎都很好,但接收者永远不会被调用。我想看看这个登录onReceive()方法,但它永远不会发生。

有什么明显的错误吗?也许我只是不想找到它;)

我只想补充一点,我已经在 Android 2.3 和 Android 4.0.3 上对其进行了测试。

4

1 回答 1

0

你说你的库的包是 com.sennin,但是在清单中你有 com.sennin.app 在接收者和服务的声明中。哪一个。不匹配可能会解释您的问题,因为清单中声明的​​接收器不存在,因此无法启动。

于 2013-10-11T10:44:39.380 回答