标签: android-c2dm

Android c2dm自动取消注册

当我发送通知到的设备,该设备获得推送消息,但收到"com.google.android.c2dm.intent.REGISTRATION"的意图,而不是一个"com.google.android.c2dm.intent.RECEIVE" .如果我尝试发送第二个通知,则会收到Google发出的"NotRegistered"错误消息.

设备注册正常(我猜),因为我得到了Auth令牌"APA91 ... -119个字符 - ".

这是我开始注册设备的代码:

Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER");
registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0));
registrationIntent.putExtra("sender", "EMAIL");
startService(registrationIntent);
Run Code Online (Sandbox Code Playgroud)

发件人(这是在Android设备中完成的):

HttpClient client = new DefaultHttpClient();
    HttpPost post = new HttpPost("https://www.google.com/accounts/ClientLogin");

    try {

        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
        nameValuePairs.add(new BasicNameValuePair("Email", "SAME AS LOGIN"));
        nameValuePairs.add(new BasicNameValuePair("Passwd", "****"));
        nameValuePairs.add(new BasicNameValuePair("accountType", "HOSTED_OR_GOOGLE"));
        nameValuePairs.add(new BasicNameValuePair("source","Google-cURL-Example"));
        nameValuePairs.add(new BasicNameValuePair("service", "ac2dm"));

        post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        HttpResponse response = client.execute(post);
        BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

        String line = "";
        while ((line = rd.readLine()) != null) {
            Log.e("C2DM", …
Run Code Online (Sandbox Code Playgroud)

android android-c2dm

5
推荐指数
1
解决办法
3042
查看次数

Android,快速将消息推送到1000台设备

我已经实现了c2dm,它可以正常工作,接收消息和一切.然而,有一个问题我无法找到解决方案.

当某个事件发生时,我想快速将相同的消息推送到几千个设备,最好是在一分钟内.我知道无法确定是否会传递此消息,并且Google可能会因不同情况而延迟发送消息.

我的iOS实现大致相同,当然发送部分除外.对于15000条消息,大约需要5秒.对于5000条到Android的消息,它需要一个多小时才能实现.

有谁知道加速这个的方法?或谷歌是否停止这种大规模推动以阻止垃圾邮件?

代码的C2DM部分如下.这是在PHP中,但我读大多数其他编程语言没有问题.我使用脚本连接()一次然后循环所有标记并使用sendMessage()发送每条消息.发送完所有消息后,它会断开连接().

<?php
class C2DMclient
{
    private $authKey = NULL;
    private $ch = NULL;

    function connect() {
        $post_params = array(
            'Email'       => 'C2DM_USER',
            'Passwd'      => 'C2DM_PWD',
            'accountType' => 'HOSTED_OR_GOOGLE',
            'source'      => 'appname',
            'service'     => 'ac2dm',
        );
        $first = true;
        $data_msg = '';

        foreach($post_params as $key => $value) {
            if($first)
                $first = false;
            else
                $data_msg .= '&';

            $data_msg .= urlencode($key).'='.urlencode($value);
        }

        $x = curl_init('C2DM_CLIENTLOGIN');
        curl_setopt($x, CURLOPT_HEADER, true);
        curl_setopt($x, CURLOPT_POST, true);
        curl_setopt($x, CURLOPT_POSTFIELDS, $data_msg);
        curl_setopt($x, CURLOPT_RETURNTRANSFER, true);
        $response = …
Run Code Online (Sandbox Code Playgroud)

php android push-notification android-c2dm

5
推荐指数
1
解决办法
4814
查看次数

使用registerReceiver的C2DM接收器的动态寄存器

我可以使用<receiver>我的清单中的成功注册我的Android应用程序与C2DM .但是,如果我<receiver>从清单中删除并使用上下文的registerReceiver方法注册我的接收器,则会收到SERVICE_NOT_AVAILABLE错误响应.我已经在模拟器和真实设备中重现了这种行为.

是否可以动态注册C2DM接收器?

这是我删除的清单的片段:

<receiver android:name=".service.C2DM.C2DMReceiver" android:permission="com.google.android.c2dm.permission.SEND">
  <intent-filter>
      <action android:name="com.google.android.c2dm.intent.RECEIVE" />
      <category android:name="mytestapp" />
  </intent-filter>
  <intent-filter>
      <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
      <category android:name="mytestapp" />
  </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

以下是代码:

public class C2DMReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String registration = intent.getStringExtra("registration_id");
        if (intent.getStringExtra("error") != null) {
            //TODO: Registration failed, should try again later.
            Log.e("MyTestAppC2DM", "C2DM Error = " + intent.getStringExtra("error"));
        } else if (intent.getStringExtra("unregistered") != null) {
            Log.d("MyTestAppC2DM", "C2DM Unregistered");
        } else …
Run Code Online (Sandbox Code Playgroud)

android broadcastreceiver android-c2dm

5
推荐指数
1
解决办法
1280
查看次数

如何在后台继续在Android上监听推送通知

我正在研究Android中的推送通知.现在的问题是,我想在应用程序启动后立即在后台运行推送通知,因为我不知道服务器何时将数据推送到设备.

主要要求是我们的企业应用程序有超过10个活动,并根据收到的通知,我必须将相关活动放在前台,以便用户可以对此执行操作或在后台执行一些静默操作,无论活动如何在前景.

有人可以建议我如何实现这种类型的要求.我是否需要在服务中执行此操作.

谢谢

java android android-service android-c2dm google-cloud-messaging

5
推荐指数
1
解决办法
1万
查看次数

android c2dm注册ID失败

我正在研究谷歌的C2DM并且在android模拟器上有一个试图获得注册ID的程序.但我得到以下错误:

DEBUG/GoogleLoginService(171):onBind:Intent {act = android.accounts.AccountAuthenticator cmp = com.google.android.gsf/.loginservice.GoogleLoginService}

WARN/GoogleLoginService(171):设备没有帐户:发送Intent {act = com.google.android.gsf.LOGIN_ACCOUNTS_MISSING}

ERROR/GTalkService(171):asyncFetch:无用户名

DEBUG/C2DMRegistrar(171):[C2DMRegistrar.20] AuthTokenCallback:帐号丢失

android android-emulator android-c2dm

4
推荐指数
1
解决办法
4903
查看次数

c2dm - 使用多行发送数据

我遇到了多行数据的问题(包含换行符的数据\n).这些数据是为url调用编码的:

collapse_key=<my-collapse_key>&registration_id=<my-registrationd>
&data.text=Line1%0ALine2&data.group=This+is+a+test
Run Code Online (Sandbox Code Playgroud)

发送c2dm消息没问题.但是当我试图从意图中恢复我的字符串时,der不是换行符号.

    text = (String) intent.getStringExtra("text");
Run Code Online (Sandbox Code Playgroud)

我想在C2DM框架内对urlstring进行了一些解码并删除了所有特殊字符?

如果有人可以帮助我或者可以证实我的猜测,那就太好了.

android android-c2dm

4
推荐指数
1
解决办法
1899
查看次数

为什么Android C2DM推送消息并不总是到达?

我已经构建了一个功能正常的C2DM应用程序,通常它运行得很好,推送消息快速到达.但是,当我第一次启动应用程序或重新启动应用程序时,我发现相当频繁,但消息不会到达.

它们肯定是成功发送的(我得到200响应)并且消息格式肯定是正确的(稍后发送相同的消息工作正常).失败可以持续很短的几分钟,然后突然它再次开始工作,然后一直工作.

然而,即使它开始工作,旧的消息显然已经消失,永远不会到达.这些消息肯定没有到达 - 我有大量的日志记录,突出显示任何到达的C2DM消息.

我完全清楚C2DM永远不会保证交付,所以我希望有些消息会失败,但根据我的经验,在某些情况下,它只是不起作用.我显然想知道我的应用程序或C2DM服务本身是否存在错误.

什么可能导致C2DM无法传递消息?如果无法传递消息,为什么C2DM服务器不会再次从其队列中尝试?相关 - 我应该仅在应用程序第一次启动时获取新的注册ID,还是每次应用程序启动时刷新它?我目前做的是后者(在应用程序中,而不是活动).

android android-c2dm

4
推荐指数
1
解决办法
2342
查看次数

Google Cloud Messaging中泄漏的IntentReceiver

我在我的应用程序中实现了GCM,并且我正在使用GSMRegistrar,如此处所示.不,我在logcat中收到错误

7-02 23:35:15.830: E/ActivityThread(10442): Activity com.abc.xyz.mnp has leaked IntentReceiver com.google.android.gcm.GCMBroadcastReceiver@44f8fb68 that was originally registered here. Are you missing a call to unregisterReceiver()?
Run Code Online (Sandbox Code Playgroud)

我能从中理解并查看代码GSMRegistrar是我需要打电话GSMRegistrar.onDestroy(this)但我无法理解我应该在哪里调用它?调用onDestroy()活动mnp会导致它停止重试GSM Registartion

android android-c2dm google-cloud-messaging

4
推荐指数
2
解决办法
6636
查看次数

广播意图回调:result = CANCELED forIntent

我有一个移动应用程序,它注册到c2dm服务器.

我有一台服务器向我的应用程序发送消息,以发送通知.服务器从谷歌c2dm收到ok结果代码.

在LogCat中我看到我的应用程序收到消息但立即产生我在帖子中的错误.而且我创建的通知也被忽略了.

08-10 16:28:09.157: W/GTalkService(13962): [DataMsgMgr] broadcast intent callback: result=CANCELLED forIntent { act=com.google.android.c2dm.intent.RECEIVE pkg=com.example.c2dmclient (has extras) }
Run Code Online (Sandbox Code Playgroud)

我不懂.我的清单文件是:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.c2dmclient"
    android:versionCode="1"
    android:versionName="1.0" >

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

    <permission android:name="com.example.c2dmclient.permission.C2D_MESSAGE" android:protectionLevel="signature" />
    <uses-permission android:name="com.example.c2dmclient.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.GET_ACCOUNTS" />

    <!-- Keeps the processor from sleeping when a message is received. -->
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


        <receiver
            android:name=".C2DMRegistrationReceiver" …
Run Code Online (Sandbox Code Playgroud)

java android android-intent android-c2dm

4
推荐指数
2
解决办法
6814
查看次数

推送到达时显示警报

如何从C2DM或GCM到达推送通知时显示警报.现在我正在状态栏上显示通知.那么如何将通知作为警报获取.

android push-notification android-c2dm google-cloud-messaging

4
推荐指数
1
解决办法
5219
查看次数