Estoy desarrollando el servicio de API de descanso de Java y necesito hacer notificaciones push a los dispositivos Android. No estoy realmente seguro de cómo hacerlo correctamente, mi código es

public class FcmNotif {

    public final static String AUTH_KEY_FCM = "My key";
    public final static String API_URL_FCM = "https://fcm.googleapis.com/fcm/send";

// userDeviceIdKey is the device id you will query from your database
    public void pushFCMNotification(String userDeviceIdKey, String title, String message) throws Exception {

        String authKey = AUTH_KEY_FCM;   // You FCM AUTH key
        String FMCurl = API_URL_FCM;

        URL url = new URL(FMCurl);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        conn.setUseCaches(false);
        conn.setDoInput(true);
        conn.setDoOutput(true);

        conn.setRequestMethod("POST");
        conn.setRequestProperty("Authorization", "key=" + authKey);
        conn.setRequestProperty("Content-Type", "application/json");

        JsonObject json = new JsonObject();
        json.addProperty("to", userDeviceIdKey.trim());
        JsonObject info = new JsonObject();
        info.addProperty("title", title); // Notification title
        info.addProperty("body", message); // Notification body
        info.addProperty("image", "https://lh6.googleusercontent.com/-sYITU_cFMVg/AAAAAAAAAAI/AAAAAAAAABM/JmQNdKRPSBg/photo.jpg");
        info.addProperty("type", "message");
        json.add("data", info);
        System.out.println(json.toString());

        OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
        wr.write(json.toString());
        wr.flush();
        conn.getInputStream();
       // System.out.println(url.getH);
    }

    public static void main(String[] args) throws Exception {
        FcmNotif fcmN=new FcmNotif();
        fcmN.pushFCMNotification("user id ", "myFirstMessage", "hello");
        System.out.println("Done");
    }
}

AUTH_KEY_FCM que obtengo de https://developers.google.com/mobile/add "API del servidor Key "y userDeviceIdKey su id. Que obtengo al ejecutar este código en Android Studio

String android_id = Settings.Secure.getString(getApplicationContext().getContentResolver(),
                Settings.Secure.ANDROID_ID);

Tal vez no entiendo algo claramente, ¿qué estoy haciendo mal? Error de respuesta

java.io.IOException: Server returned HTTP response code: 401 for URL: https://fcm.googleapis.com/fcm/send
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1840)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1441)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
    at com.gmoika.FcmNotif.makeRequest(FcmNotif.java:88)
    at com.gmoika.FcmNotif.main(FcmNotif.java:111)
0
Almas Abdrazak 28 jun. 2017 a las 08:52

2 respuestas

La mejor respuesta

Puede usar Pushraven para enviar notificaciones push a dispositivos Android a través de fcm.

https://github.com/Raudius/Pushraven

Agrega el frasco y haz:

Pushraven.setKey(my_key);

Notification raven = new Notification();
raven.title("MyTitle")
  .text("Hello World!")
  .color("#ff0000")
  .to(client_key);

Pushraven.push(raven);

raven.clear();

Para obtener más detalles sobre la documentación y el archivo jar, vaya al enlace proporcionado. El jar implementa todo lo que hay que hacer para enviar notificaciones push de fcm.

4
sumit chakraborty 28 jun. 2017 a las 07:18

Actualmente, solo se supone que debe generar una clave de servidor válida creando un proyecto de Firebase, desde allí, vaya a Configuración del proyecto> pestaña Mensajería en la nube. Se espera que las nuevas claves de API de servidor generadas a través de la Consola de desarrollo de Google no funcionen para GCM / FCM; si lo hace, el comportamiento es no garantizado ; es posible que reciba un error 401.

Se supone que el valor de userDeviceIdKey se genera en el lado del cliente (generalmente) llamando a getToken(). Consulte Token de registro.

1
AL. 28 jun. 2017 a las 06:02