c2dm:如何在设备中接收消息? (使用PHP)
我有 c2dm 的注册 ID 和身份验证令牌。然后我将这些值存储在数据库中。使用 php,我可以向 c2dm 服务器发送一条消息。但我的问题是我不知道如何在应用程序中接收消息。我不确定我获取消息的方式是否正确。无论如何,我将在下面给出。
我有一项使用注册意图注册到 c2dm 的活动。以及一个接收器,用于接收reg_id和通知消息。它正在向 c2dm 注册,但不接收消息。
显现
<intent-filter>
<action android:name="com.google.android.c2dm.intent.REGISTRATION"></action>
<category android:name="my.android.c2dm"></category>
</intent-filter>
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE"></action>
<category android:name="my.android.c2dm"></category>
</intent-filter>
</receiver>
</application>
C2dmRegistration.class(活动)
Intent objRegIntnet=new Intent("com.google.android.c2dm.intent.REGISTER");
objRegIntnet.putExtra("app",PendingIntent.getBroadcast(this,0,new Intent(),0));
objRegIntnet.putExtra("sender","[email protected]");
startService(objRegIntnet);
c2dmReceiver
public class c2dmReceiver extends BroadcastReceiver
{
private static String KEY = "c2dmPref";
private static String REGISTRATION_KEY = "registrationKey";
private Context context;
@Override
public void onReceive(Context context, Intent intent)
{
this.context = context;
if (intent.getAction().equals("com.google.android.c2dm.intent.REGISTRATION"))
{
handleRegistration(context, intent);
}
else if (intent.getAction().equals("com.google.android.c2dm.intent.RECEIVE"))
{
handleMessage(context, intent);
}
}
private void handleRegistration(Context context, Intent intent)
{
//handles registeration
}
private void handleMessage(Context context, Intent intent)
{
String title= intent.getStringExtra("title");
String message= intent.getStringExtra("msg");
Toast.makeText(context,"title : "+title+"\n message : "+message,1).show();
//Do whatever you want with the message
}
请告诉我我犯了什么错误...
更新
大家好,今天我正在使用相同的代码。我犯的错误是 php 代码。我不再以 POST 方式传递值,而是以 GET 方式发送。当我将其更改为 POST 时,会显示 toast 消息。但仍然存在一些问题。
此处的标题和消息值为空。 我的php代码是:
function sendMessageToPhone($authCode, $deviceRegistrationId, $msgType, $messageText)
{
//$messageText="have a nice day";
//$msgtype="important";
$headers = array('Authorization: GoogleLogin auth=' . $authCode);
$data = array(
'registration_id' => $deviceRegistrationId,
'collapse_key' => $msgType,
'data.message' => $messageText
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://android.apis.google.com/c2dm/send");
if ($headers)
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
实际上我不确定collapse_key和data.message变量应该使用什么类型的值。
请帮我... 谢谢...
I have the registration id and auth token for c2dm. And then I pass store these values in db. and using php, i could send one message to c2dm server. But my problem is I dont know how to receive the message in the application. I am not sure whether my way of getting the message is correct or not. Anyway i will give it below.
I have one activity which registers to the c2dm using registration intent. and one receiver to receive the reg_id and notification message. it is registering with c2dm and not to receive message.
manifest
<intent-filter>
<action android:name="com.google.android.c2dm.intent.REGISTRATION"></action>
<category android:name="my.android.c2dm"></category>
</intent-filter>
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE"></action>
<category android:name="my.android.c2dm"></category>
</intent-filter>
</receiver>
</application>
C2dmRegistration.class (activity)
Intent objRegIntnet=new Intent("com.google.android.c2dm.intent.REGISTER");
objRegIntnet.putExtra("app",PendingIntent.getBroadcast(this,0,new Intent(),0));
objRegIntnet.putExtra("sender","[email protected]");
startService(objRegIntnet);
c2dmReceiver
public class c2dmReceiver extends BroadcastReceiver
{
private static String KEY = "c2dmPref";
private static String REGISTRATION_KEY = "registrationKey";
private Context context;
@Override
public void onReceive(Context context, Intent intent)
{
this.context = context;
if (intent.getAction().equals("com.google.android.c2dm.intent.REGISTRATION"))
{
handleRegistration(context, intent);
}
else if (intent.getAction().equals("com.google.android.c2dm.intent.RECEIVE"))
{
handleMessage(context, intent);
}
}
private void handleRegistration(Context context, Intent intent)
{
//handles registeration
}
private void handleMessage(Context context, Intent intent)
{
String title= intent.getStringExtra("title");
String message= intent.getStringExtra("msg");
Toast.makeText(context,"title : "+title+"\n message : "+message,1).show();
//Do whatever you want with the message
}
please tell what is the mistake i have done...
UPDATE
Hi all, the same code is woring for me today. The mistake i have done is with php code. instaed of passing the values as POST, i sent it was as GET. When I changed it to POST, the toast message is showing. but yet some problems are there.
The title, and msg values are null here.
my php code is :
function sendMessageToPhone($authCode, $deviceRegistrationId, $msgType, $messageText)
{
//$messageText="have a nice day";
//$msgtype="important";
$headers = array('Authorization: GoogleLogin auth=' . $authCode);
$data = array(
'registration_id' => $deviceRegistrationId,
'collapse_key' => $msgType,
'data.message' => $messageText
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://android.apis.google.com/c2dm/send");
if ($headers)
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
Actually i am not sure what type of values should use for collapse_key, and data.message variables.
Please help me...
Thank you...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
最后我找到了提供塌陷键和数据的方法..
crash_key 应该是一个字符串,它是一组消息或特定类型消息的名称。如果我们使用相同的collapse_key发送多条消息,最新的消息将从c2dm服务器发送到设备。
示例:$collapse_key = "重要";
还有数据。是重要的事情。这将包含我们要发送的消息。
例如:如果我们想发送一条消息“祝你有美好的一天”,那么我应该给它一个键名。
data.="祝你有美好的一天";
这里“愿望”是关键。在接收器中,我应该使用相同的密钥名称检索消息。
向大家抱歉..
Finally I found the way of giving collapse_key and and data..
collapse_key should be a string which is a name for a group of messages or a a parthicular type of messages. If we send more than one message with same collapse_key, the latest message will be sent to the device from c2dm server.
Example : $collapse_key = "important";
And the data. is the important thing. This will contain the message that we want to send.
Ex: if we want to send a message "Have a nice day", then i should give a key name to it.
data.="Have a nice day";
here 'wishes' is the key. And in receiver, i should retreive the message with the same key name.
Sorry to all..
这是我的代码,我用它来接收来自 C2DM 服务器的通知,它还在通知栏上显示通知。它正在运行,您可以将您的代码与我的代码进行比较,并纠正错误(如果有)。
我希望这是有帮助的。
/**
* C2D 消息接收器的基类。包括所使用字符串的常量
* 在协议中。
*/
This is my code I have use it for receiving notification form C2DM server, it also shows the notification on notification bar. It is running find you can compare your code with my code and correct the error if any .
I hope this is help.
/**
* Base class for C2D message receiver. Includes constants for the strings used
* in the protocol.
*/
我的消息只有在我开始使用时才通过:
My messages only made it through when i started using: