C2DM - 从服务器发送的消息成功,但未在设备上显示

时间:2012-04-24 21:58:51

标签: java android android-c2dm

我希望我不会这样做,但过去两天我一直在用一些看起来非常简单的东西来破坏我的头脑。我已经按照googlevogella的教程实现了我的C2DM应用程序客户端+服务器。

我将尝试简要描述我的问题:

  1. 我的客户端应用成功收到 registrationId
  2. 我的服务器成功会收到身份验证令牌
  3. 服务器使用身份验证令牌和设备的 registrationId 发送邮件。
  4. 当从服务器向客户端发送消息时,我收到一条成功的消息响应代码(例如 id = 0:1335303367614556%fd55792500000030响应代码:200 ,根据Google的C2DM文档应该是一个成功的消息)。
  5. 所以我认为我的问题很可能是我的接收器用于消息,因为它们是从我的第三方服务器发送到C2DM服务器,但无法从那里到达我的应用程序。

    我在StackOverflow上的相关主题上读到了问题可能与设备上的端口有关,但我目前使用相同的接收器来注册应用程序和接收消息,并且注册部分每次都有效。

    这是我的接收者:

    public class C2DRegistrationReceiver extends BroadcastReceiver{
    
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
    
        if (action != null){
            if (action.equals("com.google.android.c2dm.intent.REGISTRATION")){
                // do something     
            }
            else if (action.equals("com.google.android.c2dm.intent.RECEIVE")){
                // do something else
            }
        }
    }
    }
    

    我的清单文件:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="ro.raullepsa.coder"
    android:versionCode="1"
    android:versionName="1.0" >
    
    <!-- SDK min version -->
    <uses-sdk android:minSdkVersion="8" />
    
    
    <!-- Only this application can receive the messages and registration result --> 
    <permission android:name="ro.raullepsa.coder.permission.C2D_MESSAGE" android:protectionLevel="signature" />
    <uses-permission android:name="ro.raullepsa.coder.permission.C2D_MESSAGE" />
    
    <!-- This app has permission to register and receive messages from Google's c2dm -->
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    
    <!-- Permission to use internet -->
    <uses-permission android:name="android.permission.INTERNET" />
    
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
    
        <!-- Activities -->
        <activity
            android:name="ro.raullepsa.coder.activity.MainActivity"
            android:label="@string/app_name" 
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
    
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    
        <activity android:name="ro.raullepsa.coder.activity.RegistrationResultActivity" />
        <activity android:name="ro.raullepsa.coder.activity.MessageReceivedActivity" />
        <receiver 
            android:name="ro.raullepsa.coder.util.c2d.C2DRegistrationReceiver" 
            android:permission="com.google.android.c2dm.permission.SEND">
    
            <!-- Receive messages -->
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <category android:name="ro.raullepsa.coder" />
            </intent-filter>
    
            <!-- Receive the registration id -->
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
                <category android:name="ro.raullepsa.coder" />
            </intent-filter>
        </receiver>
    </application>
    </manifest>
    

    我没有错误,我已经反复尝试重新安装应用程序,重新注册,我已尝试使用2个独立的接收器,我已手动强制停止从C2DM运行的所有服务并重新安装,但仍然没有。

    我已经尝试在调试模式下等待接收器的第一行,并且它在注册时到达,但从我从服务器发送消息之后从未到过。

    我有点卡住了,会感激任何帮助。如果需要,我可以提供更多代码,尽管我的应用程序基本上是Lars Vogel's tutorial。我错过了什么?

2 个答案:

答案 0 :(得分:1)

嗯,有趣的事情发生了。虽然我没有对前一天晚上的代码做任何更改,但是当我今天早上醒来并打开Wifi时,我收到了一条消息。

现在一切正常。只要我发送消息,我就会自动进入设备。 (是的,我的Wifi也在昨晚)

我不确定导致延迟的原因,因为我从Google服务器收到了积极的响应代码,但我的设备上没有任何内容。发送第一条消息可能需要一些时间吗?我不确定。

我试过其他Wifi网络,它也有效。希望我不再碰到这个了。不过,我发现这种行为有些奇怪。

答案 1 :(得分:1)

GCM通知作为背景数据发送到您的设备。

启用您在

中的背景数据
  

设置&gt;帐户和同步&gt;背景数据