doujugu1722 2011-09-01 17:50
浏览 72
已采纳

Android C2DM无法正常运行错误InvalidRegistration

I am trying to Implement C2DM on Android device. I am getting token on device but each time I run the device the registration_id on device changed which Im not sure if it should behave like that. The problem is I am unable to send messages to the device using a php curl script. I am getting InvalidRegistration Error message which means tokenId is invalid according to c2dm documentation which Im not passing manualy it is generated and passed throug script. I have done quite a lot of research on all the sites before asking this question and its not a repeated question. I have a registered c2dm email Id. I am using android code from this site here The --curl and android code is as follow:

ANDROID MANIFEST FILE

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mks.android.test" android:versionCode="1"
    android:versionName="1.0">
    <permission android:name="com.mks.android.test.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />
    <uses-permission android:name="com.mks.android.test.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.WAKE_LOCK" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <application android:label="@string/app_name" android:icon="@drawable/icon">
        <activity android:name=".Alert" android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name="com.mks.android.test.C2DMReceiver"
            android:permission="com.google.android.c2dm.permission.SEND">
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <category android:name="com.mks.android.test" />
            </intent-filter>
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
                <category android:name="com.mks.android.test" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

PHP CURL SERVERSIDE SCRIPT

<?php
$registrationId = "789ukisdtfuuskdfh678s98d9f78s9d79f-registrationId from device";
$email = "registeredemailwithc2dm@gmail.com";
$password = "abcdef";
$headers = array('Content-Type: application/x-www-form-urlencoded');
$postFields = "Passwd=".$password."&accountType=HOSTED_OR_GOOGLE&source=MKS-TEST-1&service=ac2dm&Email=".$email;
if(!$curl = curl_init()){
die('curl not found');
}
            curl_setopt ($curl, CURLOPT_URL, "https://www.google.com/accounts/ClientLogin");
            curl_setopt($curl, CURLOPT_POST, TRUE);
            curl_setopt($curl,CURLOPT_HEADER, TRUE);
            curl_setopt ($curl, CURLOPT_HTTPHEADER, $headers);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $postFields);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, TRUE);
            $response = curl_exec ($curl);
            echo $response;
            curl_close ($curl);
            $split = explode('Auth=', $response);
            $Auth = $split[1];
            var_dump($split);
            echo "<br/><br/><br/>Auth:".$Auth."<br/>";
            $postFields = "registration_id=".$registrationId."&data.message=MessageSentFromServer&collapse_key=storedmessages";
            echo '<br/><br>'.$postFields.'<br/></br>';
            $headers = array('Content-Type: application/x-www-form-urlencoded', "Content-Length: ".strlen($postFields), "Authorization: GoogleLogin auth=".$Auth);
            if(!$curl = curl_init()){
                die('curl not found');
            }
            curl_setopt($curl, CURLOPT_URL, "https://android.apis.google.com/c2dm/send");
            curl_setopt($curl, CURLOPT_POST, TRUE);
            curl_setopt($curl,CURLOPT_HEADER, TRUE);
            curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $postFields);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, TRUE);

            $response2 = curl_exec ($curl);
            curl_close ($curl); 
            //var_dump($split);
            var_dump($response2); 
?>

RESPONSE HEADER RECEIVED FROM PHP CURL SCRIPT

I am using xampp with curl extension installed.

string(318) "HTTP/1.1 200 OK Content-Type: text/plain Date: Thu, 01 Sep 2011 17:04:18 GMT Expires: Thu, 01 Sep 2011 17:04:18 GMT Cache-Control: private, max-age=0 X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1; mode=block Server: GSE Transfer-Encoding: chunked Error=InvalidRegistration"

I have registered different email addresses for different android packages/projects and but none of the application retreive messages though I am getting the registration_id. In my manifest I have declared uses permission on top but nothing changes even if i add them at bottom.

  • 写回答

1条回答 默认 最新

  • doufuxing8562 2011-09-07 12:40
    关注

    If you are getting an Id back then that means message has been sent to the device and the problem is on device side. If you phone is using wifi network instead of 3G then make sure that the your firewall is not bloking the port 5228 on which the device will send request for updates.

    I working code for sending message is as follow:

    PHP CODE FOR SENDING MESSAGES USING C2DM

    <?php
    $url = "https://www.google.com/accounts/ClientLogin";
    $accountType = 'GOOGLE'; //Doesn't change for this
    $email = 'myemail@gmail.com'; //Enter your Google Account email
    $password = 'yourpasswrodforaboveemail';  //Enter your Google Account password
    $registrationId = "your-registration-Id- get it from device";
    $source = 'companyName-ApplicationName-VersionCode'; //Enter a name for this source of the login
    $service = 'ac2dm'; //Select which service you want to log into
    
    //Once that is all done it’s time to use some cURL to send our request and retrieve the auth token:
    $ch = curl_init();
    $URL = $url."?accountType=".$accountType."&Email=".$email."&Passwd=".$password."&source=".$source."&service=".$service;
    
    
    // set URL and other appropriate options
    curl_setopt($ch, CURLOPT_URL, $URL);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    
    //Divide the response into an array as to find the auth token
    $line = explode("
    ", $response);
    
    
    // close cURL resource, and free up system resources
    curl_close($ch);
    unset($ch);
    unset($response);
    
    $auth_token = str_replace("Auth=", "", $line[2]); //auth token from Google Account Sign In
    
    $messageUrl = "https://android.apis.google.com/c2dm/send";
    $collapseKey = "storedmessages";
    $data = array('data.message'=>'This is a message'); //The content of the message
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $messageUrl);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
    
    $header = array("Authorization: GoogleLogin auth=".$auth_token); //Set the header with the Google Auth Token
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    
    $postFields = array("registration_id" => $registrationId, "collapse_key" => $collapseKey);
    $postData = array_merge($postFields, $data);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
    
    $response = curl_exec($ch);
    //Print response from C2DM service//
    print_r($response);
    
    // close cURL resource, and free up system resources
    curl_close($ch);
    ?>
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 comsol稳态求解器 找不到解,奇异矩阵有1个空方程返回的解不收敛。没有返回所有参数步长;pid控制
  • ¥15 怎么让wx群机器人发送音乐
  • ¥15 fesafe材料库问题
  • ¥35 beats蓝牙耳机怎么查看日志
  • ¥15 Fluent齿轮搅油
  • ¥15 八爪鱼爬数据为什么自己停了
  • ¥15 交替优化波束形成和ris反射角使保密速率最大化
  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功