Android:C2DM无效注册错误

Android:C2DM无效注册错误,android,curl,android-c2dm,Android,Curl,Android C2dm,一切似乎都很好,直到我试图发出通知;应用程序获得注册id,服务器获得身份验证码,但显然注册id无效 当我从应用程序获得注册后运行PHP代码时,它返回Error=InvalidRegistration 我将发布C2DM实现和服务器端CURL请求的所有代码 内部OnCreate: Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER"); registrationIntent.putExtra(

一切似乎都很好,直到我试图发出通知;应用程序获得注册id,服务器获得身份验证码,但显然注册id无效

当我从应用程序获得注册后运行PHP代码时,它返回Error=InvalidRegistration

我将发布C2DM实现和服务器端CURL请求的所有代码

内部OnCreate:

Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER");
registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, 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的两行中使用FPUT,以确保格式正确。除了你做错了什么以外,我没有看到任何东西……/P>哇,第二个SHILLYEXEC在它中间有一个换行符,从那里我知道了Authcode。它正在工作: