Servicio de GCM para android muestra java.net.UnknownHostException: android.googleapis.com

Código para el servicio GCMS:

package com.avilyne.gcm; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.google.android.gcm.server.Message; import com.google.android.gcm.server.MulticastResult; import com.google.android.gcm.server.Sender; /** * Servlet implementation class GCMBroadcast */ @WebServlet("/GCMBroadcast") public class GCMBroadcast extends HttpServlet { private static final long serialVersionUID = 1L; // The SENDER_ID here is the "Browser Key" that was generated when I // created the API keys for my Google APIs project. private static final String SENDER_ID = "AIzaSyCOLAYwS2P3ELqnTiPs3VPHGquQy1UoEIQ"; // This is a *cheat* It is a hard-coded registration ID from an Android device // that registered itself with GCM using the same project id shown above. private static final String ANDROID_DEVICE = "APA91bEF-_Y7t3Vc59OGuK9gnBWDegE4g2KyVgNeVIZbjGWe-4b9FMHrL82oOEYRPVz7_GaCOHbq3PatsuU_pk8jhvGng3Xp-CAv48iPqamer8Y2aajyTvUho9hsy39uNudA8XI4ML09eUsPNH87zcuGc_v2uJj65g"; // This array will hold all the registration ids used to broadcast a message. // for this demo, it will only have the ANDROID_DEVICE id that was captured // when we ran the Android client app through Eclipse. private List<String> androidTargets = new ArrayList<String>(); /** * @see HttpServlet#HttpServlet() */ public GCMBroadcast() { super(); // we'll only add the hard-coded *cheat* target device registration id // for this demo. androidTargets.add(ANDROID_DEVICE); } // This doPost() method is called from the form in our index.jsp file. // It will broadcast the passed "Message" value. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // We'll collect the "CollapseKey" and "Message" values from our JSP page String collapseKey = ""; String userMessage = ""; try { userMessage = request.getParameter("Message"); collapseKey = request.getParameter("CollapseKey"); } catch (Exception e) { e.printStackTrace(); return; } // Instance of com.android.gcm.server.Sender, that does the // transmission of a Message to the Google Cloud Messaging service. Sender sender = new Sender(SENDER_ID); // This Message object will hold the data that is being transmitted // to the Android client devices. For this demo, it is a simple text // string, but could certainly be a JSON object. Message message = new Message.Builder() // If multiple messages are sent using the same .collapseKey() // the android target device, if it was offline during earlier message // transmissions, will only receive the latest message for that key when // it goes back on-line. .collapseKey(collapseKey) .timeToLive(30) .delayWhileIdle(true) .addData("message", userMessage) .build(); try { // use this for multicast messages. The second parameter // of sender.send() will need to be an array of register ids. MulticastResult result = sender.send(message, androidTargets, 1); if (result.getResults() != null) { int canonicalRegId = result.getCanonicalIds(); if (canonicalRegId != 0) { } } else { int error = result.getFailure(); System.out.println("Broadcast failure: " + error); } } catch (Exception e) { e.printStackTrace(); } // We'll pass the CollapseKey and Message values back to index.jsp, only so // we can display it in our form again. request.setAttribute("CollapseKey", collapseKey); request.setAttribute("Message", userMessage); request.getRequestDispatcher("index.jsp").forward(request, response); } } 
  1. Ya que es un servicio web, no tiene android_manifest.xml. Así que el permiso para Internet no se puede agregar.
  2. Si quiero cambiar el host (android.googleapis.com), entonces ¿cómo debo hacerlo. (parece roto).

¿Has intentado apagar tu firewall? Tienes que habilitar los puertos gcm.

Si su organización tiene un cortafuegos que restringe el tráfico hacia o desde Internet, debe configurarlo para permitir la conectividad con GCM. Los puertos que se abren son: 5228, 5229 y 5230. Normalmente GCM sólo usa 5228, pero a veces utiliza 5229 y 5230. GCM no proporciona IPs específicas, por lo que debe permitir que su servidor acepte conexiones entrantes de todas las direcciones IP contenidas en los bloques de IP enumerados en el ASN de Google de 15169.

BTW solicitud de mensaje GCM es un simple post http, sin Builder Mensaje que tiene que publicar un mensaje en formato json.

Sitio de desarrollador de Android Más información sobre campos de mensaje

  • ID de registro GCM de Android longitud máxima
  • GCM, ID de registro y manejo de inicio de sesión / cierre de sesión de usuario
  • Google Cloud Messaging en Delphi XE5?
  • Google Cloud Messaging - Dispositivo múltiple de varias cuentas
  • GCM de Android enviado correctamente pero no recibido en algunos dispositivos
  • Actividad refrescante al recibir la notificación de gcm push
  • ¿Cómo los servidores de la conexión GCM envían mensajes a un dispositivo Android?
  • Error de generación de token Google Cloud Messaging (GCM) después de la actualización de Google Play Services relacionada con Firebase
  • ¿Permiso de notificaciones push (GCM) en tiempo de ejecución?
  • Utilizando GCM para enviar notificaciones en la aplicación, devuelve InvalidRegistration error
  • Google Cloud Messaging no funciona en dispositivos 4.1.2 en una red corporativa
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.