c2dm为什么我的手机上的错误c2dm应用程序收到消息

时间:2011-07-09 09:38:55

标签: android android-c2dm

[UPDATE]
(当你读到我的问题时,这很好知道)
我有一个小程序错误,现在它的工作。然而,手机上的两个应用程序都收到相同的消息,所以我忘了做什么

[END UPDATE]

我有一个c2dm应用程序和服务器设置为一个月,一切都工作。 我有14个用户/朋友注册,所有推送工作找到

当我在运行下一版本的应用和服务器的另一台计算机上创建沙箱时,我遇到了一些麻烦。

在沙盒上,我更改了应用程序中的包名称 在我的手机上,我安装了两个版本都很好,花花公子 唯一的区别是沙盒版本的应用程序正在与沙盒服务器进行通信(当然) 为什么我手机上的错误c2dm应用程序收到了消息?

现在, 为什么非沙盒应用程序会收到来自沙盒应用程序的消息?

对于像我这样的业余程序员来说,c2dm的文档有时很难理解 我很困惑:

public static final String EXTRA_APPLICATION_PENDING_INTENT = "app";

我应该在这里写包名吗? 有什么必须唯一地识别这两个应用程序吗?

我找不到答案/文件的另一件事是registration_id 我想电话只有一个registration_id但可以有多个c2dm应用程序? 这是我的假设,如果我错了,很乐意纠正我。

如果问题出在我处理registration_id的方式或我发送推送消息的方式上,我很困惑。不知道从哪里开始?

[UPDATE] ...

    <receiver android:name="com.google.android.c2dm.C2DMBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
        <!-- Receive the actual message -->
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="com.bent.blaster" />
        </intent-filter>
        <intent-filter>
        <!-- Receive the registration id -->
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
            <category android:name="com.bent.blaster" />
        </intent-filter>
</receiver>

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.bent.blaster" 
          android:versionCode="1" 
          android:versionName="0.52" 
          android:installLocation="preferExternal">
    <permission android:name="com.bent.blaster.permission.C2D_MESSAGE" android:protectionLevel="signature" />      
    <uses-permission android:name="com.bent.blaster.permission.C2D_MESSAGE" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />      
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-sdk android:minSdkVersion="8" />

3 个答案:

答案 0 :(得分:0)

我在这里写的是我最初从很多页面得到的,但是为我做的最好的是http://www.vogella.de/articles/AndroidCloudToDeviceMessaging/article.html#example_server 一开始我看了谷歌I / O 2010 c2dm介绍,然后我看了这个很好的讲座http://marakana.com/forums/android/general/272.html,但最后那个连接我需要让我的应用程序工作。

答案: 在您指定接收器的清单中(这是应用程序标记内的元素):

    <receiver android:name="com.google.android.c2dm.C2DMBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND">
        <!-- Receive the actual message -->
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="de.vogella.android.c2dm" />
        </intent-filter>
        <!-- Receive the registration id -->
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
            <category android:name="de.vogella.android.c2dm" />
        </intent-filter>
    </receiver>

请注意类别标记,我认为您没有为您的包名称分配一个类别,或者缺少此权限之一(这是清单根标记内的元素):

<permission android:name="de.vogella.android.c2dm.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

正如您已经猜到的那样,类别指定只有该包或子包的应用程序才能读取c2dm消息 而android:protectionLevel =“signature”指定你的c2dm消息受签名保护(即包)。

祝我有个美好的一天,希望我帮助

答案 1 :(得分:0)

当我的两个应用程序都接受相同的推送时,我没有 明白每个应用程序都有自己的registration_id。

我认为他们在短时间内拥有相同的registration_id,直到我卸载/重新安装它们。

答案 2 :(得分:0)

我认为我遇到的问题是因为短时间内两个应用程序都具有相同的reg_id。当我24小时后卸载/重新安装其中一个时,情况发生了变化。一开始有点令人困惑,但在与Google团队交谈后,现在很清楚,一切正常。谢谢你的时间