Android:C2DM无效注册错误

问题描述

| 一切似乎都正常,直到我尝试发出通知为止。该应用获得了注册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,以确保其格式正确。除了您做错的事情,我看不到其他任何东西。