问题描述
我正在为新的 FCM 苦苦挣扎...我以前使用过 FCM,现在我正在尝试 FCM...
I am struggling with the new FCM... I used FCM before, now I am trying FCM...
我正在尝试将我的应用服务器的推送通知发送到 android 设备.
I am trying to send push notification for my app server to android device.
我想用标准的Java包,尽量不要用Vert.x,apache的httpClient等……
I wanna use the standard Java package, try not to use others such as Vert.x, apache's httpClient etc...
这是我的代码:
public void sendNotification(String messageBody) { try { URL url = new URL("https://fcm.googleapis.com/fcm/send"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setDoInput(true); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/json"); String apiKey = "AI...wE"; String credentials = "key=" + apiKey; //String basicAuth = "Basic " + Base64.getEncoder().encodeToString(credentials.getBytes()); String basicAuth = "Basic " + new String(Base64.encodeBase64(credentials.getBytes())); conn.setRequestProperty ("Authorization", basicAuth); String notfnStr = "{"body": "this is my body", "title": "this is my title"}"; String dataStr = "{"key1": "value1", "key2": "value2"}"; String bodyStr = "{"priority": "high", "to": "dFC8GW0N1Q8:APA91bHePPmC7QVV16LGnR6rqxwreHSv1GgawijZ_dZL9T70ZkiXIV8TW_ymAWkvFfXRiWJmtR_UGBXBv2iV2UhS8M-Tndw8sf8ZW6zIqfaiiVJao3G5HFbhqgA18ukNNtW_J7JaWkz8", " + ""notification": " + notfnStr + ", "data": " + dataStr + "}"; System.out.println("### input: " + bodyStr); OutputStream os = conn.getOutputStream(); os.write(bodyStr.getBytes()); os.flush(); if (conn.getResponseCode() != HttpURLConnection.HTTP_CREATED) { throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode()); } BufferedReader br = new BufferedReader(new InputStreamReader( (conn.getInputStream()))); String output; System.out.println("Output from Server .... "); while ((output = br.readLine()) != null) { System.out.println(output); } conn.disconnect(); } catch (Exception e) { e.printStackTrace(); } }
我得到的响应码是401,意思是未经授权...我猜是凭证格式不对...
the response code i got is 401, which means unauthorized... i guess the format of credential is wrong...
json 字符串是有效的 json 格式,所以我不用费心使用 JSONObject.
The json string is in valid json format, so i don't bother to use JSONObject.
对于字符串凭据,我尝试过 "key:" + apiKey;但仍然得到相同的结果.
For the string credentials, i have tried "key:" + apiKey; but still got the same result.
apiKey 字符串是从我从 Google 的 Firebase 控制台下载的 google-services.json 复制的.
The apiKey String is copied from the google-services.json I downloaded from Firebase console in google.
谷歌没有给出一个很好的例子......只是给了我这个:https://firebase.google.com/docs/cloud-messaging/downstream
google didn't give a good example... just gave me this: https://firebase.google.com/docs/cloud-messaging/downstream
如果有人知道怎么做,请回复.谢谢!!
If any one knows how to do it, please reply. Thanks!!
推荐答案
在 JAVA 中使用 FCM 发送通知的完整示例
public class FCMNotification { // Method to send Notifications from server to client end. public final static String AUTH_KEY_FCM = "API_KEY_HERE"; public final static String API_URL_FCM = "https://fcm.googleapis.com/fcm/send"; public static void pushFCMNotification(String DeviceIdKey) 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 data = new JSONObject(); data.put("to", DeviceIdKey.trim()); JSONObject info = new JSONObject(); info.put("title", "FCM Notificatoin Title"); // Notification title info.put("text", "Hello First Test notification"); // Notification body data.put("notification", info); OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); wr.write(data.toString()); wr.flush(); wr.close(); int responseCode = conn.getResponseCode(); System.out.println("Response Code : " + responseCode); BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); } @SuppressWarnings("static-access") public static void main(String[] args) throws Exception { FCMNotification.pushFCMNotification("USER_DEVICE_TOKEN"); } }