Intereting Posts
Как установить режим OpenFileOutput в MODE_PRIVATE и MODE_APPEND? Предотвращение отклонения ProgressDialog при нажатии кнопки поиска (Android) Как удалить границу из диалогового окна? Android: open failed: ENOENT (Нет такого файла или каталога) Как приостановить запись голоса в Android? Как создать пользовательский горизонтальный индикатор выполнения Есть ли способ в Android узнать, имеет ли пользовательское устройство фактическую клавиатуру или нет? Как использовать экран блокировки пароля по умолчанию в нашем приложении для Android? Различное поведение для FillType.EVEN_ODD при добавлении CornerPathEffect? Как добавить AdSense в свои приложения Хорошая схема для удаления файла базы данных в SQLiteOpenHelper.onDowngrade () Что именно влияет на URLConnection.setDoOutput ()? MapFragment API Карт Google v2 Ошибка памяти / утечка памяти Уведомление конструктора устарело Нельзя издеваться над финальным классом Kotlin, используя Mockito 2

Firebase Java Server для отправки push-уведомлений всем устройствам

Я пытаюсь отправить уведомление Push на мое устройство Android с помощью новой службы Firebase. Я зарегистрировал и установил приложение, также я поместил весь код, необходимый для получения уведомления в приложении Android. Через консоль Firebase я могу отправить уведомление в свое приложение, и оно будет получено и показано. Теперь я хочу написать автономный сервер java, чтобы отправить уведомление обо всем устройствам. Это мой текущий код:

final String apiKey = "I added my key here"; URL url = new URL("https://fcm.googleapis.com/fcm/send"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/json"); conn.setRequestProperty("Authorization", "key=" + apiKey); conn.setDoOutput(true); String input = "{\"notification\" : {\"title\" : \"Test\"}, \"to\":\"test\"}"; OutputStream os = conn.getOutputStream(); os.write(input.getBytes()); os.flush(); os.close(); int responseCode = conn.getResponseCode(); System.out.println("\nSending 'POST' request to URL : " + url); System.out.println("Post parameters : " + input); 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(); // print result System.out.println(response.toString()); 

И это результат того, что я возвращаюсь со своих серверов:

 {"multicast_id":6602141464107786356,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"InvalidRegistration"}]} 

К сожалению, простое удаление тега «to» не работает, я получаю обратно код 400. Я прочитал, что мне нужно зарегистрировать устройство, отправить идентификатор устройства на сервер и сохранить его там, а затем перебрать все зарегистрированные устройства на сервере для отправки сообщения. Нет ли более простого способа, просто отправить сообщение всем устройствам, как в консоли?

Ваша помощь очень ценится, так как я пытался заставить ее работать весь день = (

С уважением, Дастин

Я не считаю, что это возможно. Вместо этого я бы посоветовал зарегистрировать все устройства в одной и той же теме, а затем вы можете сразу сообщить обо всех устройствах. Вот справочная документация по этому вопросу:

Отправить тему Сообщения с сервера

https://firebase.google.com/docs/cloud-messaging/topic-messaging

Это решение отправляет Push-уведомление Firebase с использованием Apache HttpClient:

 HttpClient client = HttpClientBuilder.create().build(); HttpPost post = new HttpPost("https://fcm.googleapis.com/fcm/send"); post.setHeader("Content-type", "application/json"); post.setHeader("Authorization", "key=AIzaSyBSxxxxsXevRq0trDbA9mhnY_2jqMoeChA"); JSONObject message = new JSONObject(); message.put("to", "dBbB2BFT-VY:APA91bHrvgfXbZa-K5eg9vVdUkIsHbMxxxxxc8dBAvoH_3ZtaahVVeMXP7Bm0iera5s37ChHmAVh29P8aAVa8HF0I0goZKPYdGT6lNl4MXN0na7xbmvF25c4ZLl0JkCDm_saXb51Vrte"); message.put("priority", "high"); JSONObject notification = new JSONObject(); notification.put("title", "Java"); notification.put("body", "Notificação do Java"); message.put("notification", notification); post.setEntity(new StringEntity(message.toString(), "UTF-8")); HttpResponse response = client.execute(post); System.out.println(response); System.out.println(message); 

Ваш JSON будет таким:

  { "registration_ids": [ "fcm token 1", "fcm token 2", "fcm token 3" ], "data": { "message": "msg" }, "notification": { "title": "App name", "text": " your msg" } } 
 public void sendGroupPush(Context context, ArrayList tokenlist, String message) { String msg = message; String title = context.getString(R.string.app_name); JSONArray regId = null; JSONObject objData = null; JSONObject data = null; JSONObject notif = null; try { regId = new JSONArray(); for (int i = 0; i < tokenlist.size(); i++) { regId.put(tokenlist.get(i)); } data = new JSONObject(); data.put("message", message); notif = new JSONObject(); notif.put("title", title); notif.put("text", msg); objData = new JSONObject(); objData.put("registration_ids", regId); objData.put("data", data); objData.put("notification", notif); Log.e("!_@rj@_group_PASS:>", objData.toString()); } catch (JSONException e) { e.printStackTrace(); } JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST, Constants.FCM_PUSH_GROUP_URL, objData, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { Log.e("!_@rj@_@@_SUCESS", response + ""); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e("!_@rj@_@@_Errors--", error + ""); } }) { @Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> params = new HashMap<String, String>(); params.put("Authorization", "key=" + Constants.FCM_API_KEY); params.put("Content-Type", "application/json"); Log.e("!_@rj@_@@PUSH_headrers", "::> " + params); return params; } }; RequestQueue requestQueue = Volley.newRequestQueue(context); int socketTimeout = 1000 * 60;// 60 seconds RetryPolicy policy = new DefaultRetryPolicy(socketTimeout, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT); jsObjRequest.setRetryPolicy(policy); requestQueue.add(jsObjRequest); } 

Public static String FCM_PUSH_URL = " https://fcm.googleapis.com/fcm/send ";

Используйте нижеприведенный код для отправки push-уведомлений на несколько устройств:

 import java.io.IOException; import java.util.ArrayList; import java.util.List; import com.google.android.gcm.server.Message; import com.google.android.gcm.server.MulticastResult; import com.google.android.gcm.server.Result; import com.google.android.gcm.server.Sender; public class PushNotifactionHelper { public final static String AUTH_KEY_FCM = "your key "; public final static String API_URL_FCM = "https://fcm.googleapis.com/fcm/send"; public static void sendPushNotification(List<String> deviceTokenList) { Sender sender = new Sender(AUTH_KEY_FCM); Message msg = new Message.Builder().addData("message", "Message body") .build(); try { MulticastResult result = sender.send(msg, deviceTokenList, 5); for (Result r : result.getResults()) { if (r.getMessageId() != null) System.out.println("Push Notification Sent Successfully"); else System.out.println("ErrorCode " + r.getErrorCodeName()); } } catch (IOException e) { System.out.println("Error " + e.getLocalizedMessage()); } } } 

Примечание: используйте gcm.server.jar

Ваш код является идеальным, просто перепроверьте идентификатор регистрации пользователя, которому вы отправляете уведомление. Вместо того, to использовать пользовательское устройство regid. Он работал идеально для меня.

Клиентский код на стороне клиента должен быть:

 //subscribe_topic with name "ALL" FirebaseMessaging.getInstance().subscribeToTopic("ALL"); 

Серверная сторона:

 string json = "{\"to\": \"/topics/ALL\",\"data\": {\"message\": \"This is a Cloud Messaging Topic Message\",}}"; 
  @Autowired AndroidPushNotificationsService androidPushNotificationsService; @RequestMapping(value = "/send", method = RequestMethod.GET, produces = "application/json") public ResponseEntity<String> send() { JSONObject body = new JSONObject(); // JsonArray registration_ids = new JsonArray(); // body.put("registration_ids", registration_ids); body.put("to", "xxxxxxxxxxxxxxxxxxxjPwZpLgLpji_"); body.put("priority", "high"); // body.put("dry_run", true); JSONObject notification = new JSONObject(); notification.put("body", "body string here"); notification.put("title", "title string here"); // notification.put("icon", "myicon"); JSONObject data = new JSONObject(); data.put("key1", "value1"); data.put("key2", "value2"); body.put("notification", notification); body.put("data", data); HttpEntity<String> request = new HttpEntity<>(body.toString()); CompletableFuture<FirebaseResponse> pushNotification = androidPushNotificationsService.send(request); CompletableFuture.allOf(pushNotification).join(); try { FirebaseResponse firebaseResponse = pushNotification.get(); if (firebaseResponse.getSuccess() == 1) { log.info("push notification sent ok!"); } else { log.error("error sending push notifications: " + firebaseResponse.toString()); } return new ResponseEntity<>(firebaseResponse.toString(), HttpStatus.OK); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } return new ResponseEntity<>("the push notification cannot be send.", HttpStatus.BAD_REQUEST); } 

Вы можете получить классы отсюда: https://github.com/AndreiD/testingpushnotifications

Здесь у меня очень простое решение для отправки группы push-сообщений, а также отдельных

 public class FCM { final static private String FCM_URL = "https://fcm.googleapis.com/fcm/send"; /** * * Method to send push notification to Android FireBased Cloud messaging Server. * @param tokenId Generated and provided from Android Client Developer * @param server_key Key which is Generated in FCM Server @param message which contains actual information. * */ static void send_FCM_Notification(String tokenId, String server_key, String message){ try{ // Create URL instance. URL url = new URL(FCM_URL); // create connection. HttpURLConnection conn; conn = (HttpURLConnection) url.openConnection(); conn.setUseCaches(false); conn.setDoInput(true); conn.setDoOutput(true); //set method as POST or GET conn.setRequestMethod("POST"); //pass FCM server key conn.setRequestProperty("Authorization","key="+server_key); //Specify Message Format conn.setRequestProperty("Content-Type","application/json"); //Create JSON Object & pass value JSONObject infoJson = new JSONObject(); infoJson.put("title","Alankit"); infoJson.put("body", message); JSONObject json = new JSONObject(); json.put("to",tokenId.trim()); json.put("notification", infoJson); System.out.println("json :" +json.toString()); System.out.println("infoJson :" +infoJson.toString()); OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); wr.write(json.toString()); wr.flush(); int status = 0; if( null != conn ){ status = conn.getResponseCode(); } if( status != 0){ if( status == 200 ){ //SUCCESS message BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); System.out.println("Android Notification Response : " + reader.readLine()); }else if(status == 401){ //client side error System.out.println("Notification Response : TokenId : " + tokenId + " Error occurred :"); }else if(status == 501){ //server side error System.out.println("Notification Response : [ errorCode=ServerError ] TokenId : " + tokenId); }else if( status == 503){ //server side error System.out.println("Notification Response : FCM Service is Unavailable TokenId : " + tokenId); } } }catch(MalformedURLException mlfexception){ // Prototcal Error System.out.println("Error occurred while sending push Notification!.." + mlfexception.getMessage()); }catch(Exception mlfexception){ //URL problem System.out.println("Reading URL, Error occurred while sending push Notification!.." + mlfexception.getMessage()); } } static void send_FCM_NotificationMulti(List<String> putIds2, String tokenId, String server_key, String message){ try{ // Create URL instance. URL url = new URL(FCM_URL); // create connection. HttpURLConnection conn; conn = (HttpURLConnection) url.openConnection(); conn.setUseCaches(false); conn.setDoInput(true); conn.setDoOutput(true); //set method as POST or GET conn.setRequestMethod("POST"); //pass FCM server key conn.setRequestProperty("Authorization","key="+server_key); //Specify Message Format conn.setRequestProperty("Content-Type","application/json"); //Create JSON Object & pass value JSONArray regId = null; JSONObject objData = null; JSONObject data = null; JSONObject notif = null; regId = new JSONArray(); for (int i = 0; i < putIds2.size(); i++) { regId.put(putIds2.get(i)); } data = new JSONObject(); data.put("message", message); notif = new JSONObject(); notif.put("title", "Alankit Universe"); notif.put("text", message); objData = new JSONObject(); objData.put("registration_ids", regId); objData.put("data", data); objData.put("notification", notif); System.out.println("!_@rj@_group_PASS:>"+ objData.toString()); System.out.println("json :" +objData.toString()); OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); wr.write(objData.toString()); wr.flush(); int status = 0; if( null != conn ){ status = conn.getResponseCode(); } if( status != 0){ if( status == 200 ){ //SUCCESS message BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); System.out.println("Android Notification Response : " + reader.readLine()); }else if(status == 401){ //client side error System.out.println("Notification Response : TokenId : " + tokenId + " Error occurred :"); }else if(status == 501){ //server side error System.out.println("Notification Response : [ errorCode=ServerError ] TokenId : " + tokenId); }else if( status == 503){ //server side error System.out.println("Notification Response : FCM Service is Unavailable TokenId : " + tokenId); } } }catch(MalformedURLException mlfexception){ // Prototcal Error System.out.println("Error occurred while sending push Notification!.." + mlfexception.getMessage()); }catch(IOException mlfexception){ //URL problem System.out.println("Reading URL, Error occurred while sending push Notification!.." + mlfexception.getMessage()); }catch (Exception exception) { //General Error or exception. System.out.println("Error occurred while sending push Notification!.." + exception.getMessage()); } } 

}

  Calling should be like that : public class TestFCM { static List<String> putIds; public static void main(String[] args) { //Just I am passed dummy information // DeviceID's String tokenId1 = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; String tokenId = "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"; String server_key ="<Server Key>" ; String message = "Welcome alankit Push Service."; putIds= new ArrayList<>(); putIds.add(tokenId1); putIds.add(tokenId); /* for Group*/ FCM.send_FCM_NotificationMulti(putIds,tokenId,server_key,message); /*for indevidual*/ FCM.send_FCM_Notification( tokenId,server_key,message); } }