Android中的GCM推送通知

时间:2013-01-10 12:41:29

标签: android

我正在使用Google示例项目推送通知,我已成功构建和部署客户端和服务器应用程序,并且我能够在服务器端注册设备,当我尝试发送通知时,它显示该消息已被推送但是我没有在设备或模拟器上得到通知。

使用IDE eclipse编译和部署客户端应用程序,并且样本服务器应用程序由ANT构建器构建并部署在Tomcat 7中。

我使用的是Android 4.2 Google API模拟器和带有gmail配置的设备。

3 个答案:

答案 0 :(得分:2)

在本文中,我将尝试解释如何使用ASP.NET和C#集成Android推送通知服务。众所周知,移动应用正在蓬勃发展的市场趋势。某些自定义移动应用程序使用推送通知服务为应用程序用户提供更新。在这里,我将解释如何使用Google的GCM推送通知服务。

类文件“AndroidGCMPushNotification.cs”

   using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Net;
    using System.Text;
    using System.IO;
    using System.Security.Cryptography.X509Certificates;
    using System.Net.Security;
    using System.Collections.Specialized;


public class AndroidGCMPushNotification
{
    public AndroidGCMPushNotification()
    {
        //
        // TODO: Add constructor logic here
        //
    }
    public string SendNotification(string deviceId, string message)
    {
        string GoogleAppID = "google application id";        
        var SENDER_ID = "9999999999";
        var value = message;
        WebRequest tRequest;
        tRequest = WebRequest.Create("https://android.googleapis.com/gcm/send");
        tRequest.Method = "post";
        tRequest.ContentType = " application/x-www-form-urlencoded;charset=UTF-8";
        tRequest.Headers.Add(string.Format("Authorization: key={0}", GoogleAppID));

        tRequest.Headers.Add(string.Format("Sender: id={0}", SENDER_ID));

        string postData = "collapse_key=score_update&time_to_live=108&delay_while_idle=1&data.message=" + value + "&data.time=" + System.DateTime.Now.ToString() + "®istration_id=" + deviceId + "";
        Console.WriteLine(postData);
        Byte[] byteArray = Encoding.UTF8.GetBytes(postData);
        tRequest.ContentLength = byteArray.Length;

        Stream dataStream = tRequest.GetRequestStream();
        dataStream.Write(byteArray, 0, byteArray.Length);
        dataStream.Close();

        WebResponse tResponse = tRequest.GetResponse();

        dataStream = tResponse.GetResponseStream();

        StreamReader tReader = new StreamReader(dataStream);

        String sResponseFromServer = tReader.ReadToEnd();


        tReader.Close();
        dataStream.Close();
        tResponse.Close();
        return sResponseFromServer;
    }
}

您可以通过传递设备ID和消息来调用SendNotification函数。

AndroidGCMPushNotification apnGCM = new AndroidGCMPushNotification();

string strResponse =
apnGCM.SendNotification("123123xxxxxxxxxxxxxxxxxxxxxxxx",
"Test Push Notification message ");

答案 1 :(得分:0)

要发送GCM推送,您真的不需要在berween中拥有第三方服务器。 这是GCM优于C2DM的最佳部分。

     HttpClient httpclient = new DefaultHttpClient();

     HttpPost httppost = new HttpPost("https://android.googleapis.com/gcm/send");
     httppost.setHeader("Authorization", "key=" + GCM_AUTH_KEY);
     httppost.setHeader("Content-Type", "application/json");

     try {

        String reqBody = DATA_YOU_WANNA_SEND_INJSON_FORMAT;

        BasicHttpEntity e = new BasicHttpEntity();

        ByteArrayInputStream is = new ByteArrayInputStream(reqBody.getBytes());
        e.setContent(is);
        httppost.setEntity(e);
        Log.d("@@ Data being sent via push : " + reqBody);

        return httpclient.execute(httppost);
     } catch (ClientProtocolException e) {
        Log.e(e.getMessage());
     } catch (IOException e) {
        Log.e(e.getMessage());
     }

通过这种方法,您可以发送推送消息。

如果你谈论为什么演示应用程序没有发送推送,那么我在实施时也尝试过我遇到了同样的问题。

但是使用这种方法你总是可以发送GCM,只有你的设备必须注册。

此外,结果可以通过以下方式看到:

int statusCode = response.getStatusLine()。getStatusCode();             Log.d(“@@ response status code ::”+ statusCode);

        if (statusCode == 200) {
           callback.onSuccess();
        } else {
           String reason = response.getStatusLine().getReasonPhrase();
           Log.d("@@ response reason phrase :: " + reason);
           callback.onFailure(reason);
        }
        Log.d("@@ complete response object : " + EntityUtils.toString(response.getEntity()));

答案 2 :(得分:-1)

检查您的Android模拟器是否使用了Google API,并且您已安装额外的Google Play服务。

安装Google Play服务 enter image description here

为Android模拟器目标选择Google API: enter image description here