问题描述
|
一切似乎都正常,直到我尝试发出通知为止。该应用获得了注册ID,服务器获得了Auth代码,但显然注册ID无效。
从应用程序获取注册后运行PHP代码时,它将返回returns0ѭ
我将发布有关C2DM实现和服务器端CURL请求的所有代码。
在OnCreate内部:
Intent registrationIntent = new Intent(\"com.google.android.c2dm.intent.REGISTER\");
registrationIntent.putExtra(\"app\",PendingIntent.getbroadcast(this,new Intent(),0));
registrationIntent.putExtra(\"sender\",\"MYEMAIL\");
startService(registrationIntent);
C2DM类:
import java.net.URL;
import android.content.broadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.util.Log;
import android.widget.Toast;
public class C2DMReceiver extends broadcastReceiver
{
@Override
public void onReceive(Context context,Intent intent) {
String receiver = context.getPackageName() + \".C2DMReceiver\";
intent.setClassName(context,receiver);
context.startService(intent);
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) {
String registration = intent.getStringExtra(\"registration_id\");
if (intent.getStringExtra(\"error\") != null) {
// Registration Failed,should try again later.
} else if (intent.getStringExtra(\"unregistered\") != null) {
// unregistration done,new messages from the authorized sender will be rejected
} else if (registration != null) {
// Send the registration ID to the 3rd party site that is sending the messages.
// This should be done in a separate thread.
// When done,remember that all registration is done.
sendReg(registration,context);
Toast.makeText(context,registration,Toast.LENGTH_SHORT).show();
}
}
private void handleMessage(Context context,Intent intent)
{
}
public void sendReg(String key,Context context)
{
//Send key to server,this works fine
}
}
PHP代码:
<?PHP
// get Auth from Google ClientLogin
$new = shell_exec(\"curl -d accountType=HOSTED_OR_GOOGLE -d Email=MYEMAIL -d Passwd=MYPASSWORD -d service=ac2dm -d source=MYSOURCE -k https://www.google.com/accounts/ClientLogin | grep Auth=\");
$auth = substr($new,5); // \"DQAAAKY...\"
$fp = fopen(\'/home/me/Desktop/test.txt\',\'w\');
fputs($fp,$new.\"\\nAuth: \".$auth.\"\\n\");
// ID is from the app
$id = \"APA91b...\";
fputs($fp,\"ID: \".$id.\"\\n\\n\");
$msg = \"hello\";
// if I don\'t include ContentLength,Google tells me I need it
$len = strlen(\"registration_id=\".$id.\"&data.message=\".$msg.\"&collapse_key=something\");
fputs($fp,\"Len: \".$len.\"\\n\\n\");
$info = shell_exec(\"curl --header \\\"Content-Length: \".$len.\"\\\" --header \\\"Authorization: GoogleLogin auth=\".$auth.\"\\\" -d registration_id=\".$id.\" -d data.message=\".$msg.\" -d collapse_key=something -k https://android.apis.google.com/c2dm/send\");
fputs($fp,$info); // \"Error=InvalidRegistration\"
fclose($fp);
?>
解决方法
您确定整个数据包都正确发送了吗?尝试在使用shell_exec的两行中同时使用fputs,以确保其格式正确。除了您做错的事情,我看不到其他任何东西。