无法使用Google App Engine(GAE)连接到Google Cloud Messaging(GCM)服务器

问题描述 投票:7回答:3

我正在尝试为我的应用设置谷歌云消息,我正在为我的服务器使用Google App Engine。 我有我的API密钥,但我似乎无法连接到谷歌云消息服务器。 这是我的代码。

HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost("https://android.googleapis.com/gcm/send");
        try {

            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
            nameValuePairs.add(new BasicNameValuePair("registration_id", regId));
            nameValuePairs.add(new BasicNameValuePair("data.message", messageText));    

            post.setEntity(new UrlEncodedFormEntity(nameValuePairs));

            post.setHeader("Authorization", "key=*MY_API_KEY_HERE*");
            post.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");


            Header[] s=post.getAllHeaders();


            System.out.println("The header from the httpclient:");

            for(int i=0; i < s.length; i++){
            Header hd = s[i];

            System.out.println("Header Name: "+hd.getName()
                    +"       "+" Header Value: "+ hd.getValue());
            }


            HttpResponse response = client.execute(post);
            BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
            String line = "";
            while ((line = rd.readLine()) != null) {
            System.out.println(line);
            }

            } catch (IOException e) {
                e.printStackTrace();
        }

当我查看日志时,标题正在设置正确。 但是,我收到一个错误

org.apache.http.impl.client.DefaultRequestDirector tryConnect:连接到目标主机时捕获的I / O异常(java.net.SocketException):权限被拒绝:尝试在未经许可的情况下访问被阻止的收件人。 (映射-IPv4)的

我已经在Google API控制台中启用了Google云消息传递,并且我已经多次检查了我的API密钥。 我不知道为什么我会被拒绝。 我在战争中需要一个罐子或者我必须在清单中放一些东西吗?

感谢您阅读!! 标记

java google-app-engine google-cloud-messaging
3个回答
2
投票

我有同样的问题,我正在使用类似于你正在使用的东西。

  1. 我必须在我的GAE应用程序上启用计费(您可能已经拥有,但我不知道我必须这样做)
  2. 阅读https://developers.google.com/appengine/docs/java/sockets/和https://developers.google.com/appengine/docs/java/urlfetch/

因此,我之前看起来像你的代码如下所示:

String json ="{}"; 
URL url = new URL("https://android.googleapis.com/gcm/send");
HTTPRequest request = new HTTPRequest(url, HTTPMethod.POST);
request.addHeader(new HTTPHeader("Content-Type","application/json")); 
request.addHeader(new HTTPHeader("Authorization", "key=<>"));
request.setPayload(json.getBytes("UTF-8"));
HTTPResponse response = URLFetchServiceFactory.getURLFetchService().fetch(request);

0
投票

我也用GAE实现了GCM,我遇到了这样的错误:

com.google.apphosting.api.ApiProxy$FeatureNotEnabledException: The Socket API will be enabled for this application once billing has been enabled in the admin console.

Nikunj的回答也帮助了我。 在实施他建议的内容后,通知将被发送到设备,而无需为我的GAE应用程序启用计费。 以下是我的实现,以防万一,可能对有相同问题的人有用:

private void sendNotificationRequestToGcm(List<String> registrationIds) {
    LOG.info("In sendNotificationRequestToGcm method!");
    JSONObject json = new JSONObject();
    JSONArray jasonArray = new JSONArray(registrationIds);
    try {
        json.put("registration_ids", jasonArray);
    } catch (JSONException e2) {
        LOG.severe("JSONException: " + e2.getMessage());
    }
    String jsonString = json.toString();
    LOG.info("JSON payload: " + jsonString);

    com.google.appengine.api.urlfetch.HTTPResponse response;
    URL url;
    HTTPRequest httpRequest;
    try {
        //GCM_URL = https://android.googleapis.com/gcm/send
        url = new URL(GCM_URL);
        httpRequest = new HTTPRequest(url, HTTPMethod.POST);
        httpRequest.addHeader(new HTTPHeader("Content-Type","application/json"));
        httpRequest.addHeader(new HTTPHeader("Authorization", "key=" + API_KEY));
        httpRequest.setPayload(jsonString.getBytes("UTF-8"));
        LOG.info("Sending POST request to: " + GCM_URL);
        response = URLFetchServiceFactory.getURLFetchService().fetch(httpRequest);
        LOG.info("Status: " + response.getResponseCode());            
        List<HTTPHeader> hdrs = response.getHeaders();
        for(HTTPHeader header : hdrs) {
            LOG.info("Header: " + header.getName());
            LOG.info("Value:  " + header.getValue());
        }            
    } catch (UnsupportedEncodingException e1) {
        LOG.severe("UnsupportedEncodingException" + e1.getMessage());
    } catch (MalformedURLException e1) {
        LOG.severe("MalformedURLException" + e1.getMessage());
    } catch (IOException e) {
        LOG.severe("URLFETCH IOException" + e.getMessage());
    }
}

希望这会帮助别人......


-1
投票

最简单的方法是使用gcm-server.jar (你可以从这里获得)。

然后,您需要发送GCM消息的代码如下所示:

Sender sender = new Sender(apiKey);
Message message = new Message.Builder()
    .addData("message", "this is the message")
    .addData("other-parameter", "some value")
    .build();
Result result = sender.send(message, registrationId, numOfRetries);

这是gradle依赖: compile 'com.google.gcm:gcm-server:1.0.0'mvnrepository url

资源

© www.soinside.com 2019 - 2024. All rights reserved.