如何在android中实现C2DM

时间:2011-06-20 09:52:41

标签: android android-c2dm

我尝试在Android中实现C2DM。我可以在注册C2DM Server后获得注册码。但是当我从第三方服务器发送消息时,它会在Log中显示消息“message sent”和错误代码200,这意味着第三方服务器已成功发送消息。问题是,我无法在设备中接收消息。

4 个答案:

答案 0 :(得分:0)

此博客http://www.tomasmalmsten.com/tag/c2dm/非常适合启动并运行android c2dm。

答案 1 :(得分:0)

function googleAuthenticate($username, $password, $source="Company-AppName-Version", $service="ac2dm"){  

       $ch = curl_init();
       if(!$ch){
           return false;
       }
        curl_setopt($ch, CURLOPT_URL, "https://www.google.com/accounts/ClientLogin");
        $post_fields = "accountType=" . urlencode('HOSTED_OR_GOOGLE')
        . "&Email=" . urlencode($username)
        . "&Passwd=" . urlencode($password)
        . "&source=" . urlencode($source)
        . "&service=" . urlencode($service);
        curl_setopt($ch, CURLOPT_HEADER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);    
        curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        $response = curl_exec($ch);
        curl_close($ch);
        if (strpos($response, '200 OK') === false) {
        return false;
        }
        // find the auth code
        preg_match("/(Auth=)([\w|-]+)/", $response, $matches);

        if (!$matches[2]) {
        return false;
        }
        return $matches[2];
   }

   // send message to android,  The message size limit is 1024 bytes in android

  function c2dmSendMessageToPhone($authCode, $deviceRegistrationId, $msgType, $messageText,$extraArr) {
            $headers = array('Authorization: GoogleLogin auth=' . $authCode);
            $data1 = array(
                    'registration_id' => $deviceRegistrationId,
                    'collapse_key' => $msgType,
                    'data.msg' => $messageText         
                    );
            $data2 = array();
            // append 'data' string in key of the array
            if(!empty($extraArr)){
                    foreach($extraArr as $k => $v){
                        $data2['data.'.$k] = $v;
                        unset($extraArr[$k]);
                    }
            }

            $data = array_merge($data1,$data2);
            $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; 
    }  

答案 2 :(得分:0)

查看此帖子C2DM Implementation Checklist Step by Step

编码前包括1件事; 2 Android App(客户端); 3服务器端:get ClientLogin等; 4注意事项

答案 3 :(得分:0)

调整此主题的每个人都应该了解Google的变化:

C2DM已弃用,已被Google Cloud Messaging for Android (GCM)取代。 谷歌的声明:

Important: C2DM has been officially deprecated as of June 26, 2012.
This means that C2DM has stopped accepting new users and quota requests. 
No new features will be added to C2DM. However, apps using C2DM will continue to work. 
Existing C2DM developers are encouraged to migrate to the new version of C2DM, 
called Google Cloud Messaging for Android (GCM).
See the C2DM-to-GCM Migration document for more information.
Developers must use GCM for new development.

C2DM有demo app tutorial for GCMmigration