当我发送通知到的设备,该设备获得推送消息,但收到"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) 我已经实现了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) 我可以使用<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中的推送通知.现在的问题是,我想在应用程序启动后立即在后台运行推送通知,因为我不知道服务器何时将数据推送到设备.
主要要求是我们的企业应用程序有超过10个活动,并根据收到的通知,我必须将相关活动放在前台,以便用户可以对此执行操作或在后台执行一些静默操作,无论活动如何在前景.
有人可以建议我如何实现这种类型的要求.我是否需要在服务中执行此操作.
谢谢
java android android-service android-c2dm google-cloud-messaging
我正在研究谷歌的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:帐号丢失
我遇到了多行数据的问题(包含换行符的数据\n).这些数据是为url调用编码的:
collapse_key=<my-collapse_key>®istration_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进行了一些解码并删除了所有特殊字符?
如果有人可以帮助我或者可以证实我的猜测,那就太好了.
我已经构建了一个功能正常的C2DM应用程序,通常它运行得很好,推送消息快速到达.但是,当我第一次启动应用程序或重新启动应用程序时,我发现相当频繁,但消息不会到达.
它们肯定是成功发送的(我得到200响应)并且消息格式肯定是正确的(稍后发送相同的消息工作正常).失败可以持续很短的几分钟,然后突然它再次开始工作,然后一直工作.
然而,即使它开始工作,旧的消息显然已经消失,永远不会到达.这些消息肯定没有到达 - 我有大量的日志记录,突出显示任何到达的C2DM消息.
我完全清楚C2DM永远不会保证交付,所以我希望有些消息会失败,但根据我的经验,在某些情况下,它只是不起作用.我显然想知道我的应用程序或C2DM服务本身是否存在错误.
什么可能导致C2DM无法传递消息?如果无法传递消息,为什么C2DM服务器不会再次从其队列中尝试?相关 - 我应该仅在应用程序第一次启动时获取新的注册ID,还是每次应用程序启动时刷新它?我目前做的是后者(在应用程序中,而不是活动).
我在我的应用程序中实现了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
我有一个移动应用程序,它注册到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) 如何从C2DM或GCM到达推送通知时显示警报.现在我正在状态栏上显示通知.那么如何将通知作为警报获取.
android push-notification android-c2dm google-cloud-messaging