Here's how to do it using SERVER_API_KEY (not the best practice, but the best I've come up with):
First enter the application instance id:
InstanceID instanceID = InstanceID.getInstance(this); String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId), GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
Next, get the messaging identifier token:
String account = ACCOUNT_NAME; // Eg " johndoe@google.com " String scope = "audience:server:client_id:" + WEB_APPLICATION_CLIENT_ID; String idToken = GoogleAuthUtil.getToken(context, account, scope); // Variable "idToken" now hods the messaging id token. :-)
Now to the magic part. Create a new device group with an instance ID as a member:
URL url = new URL("https://gcm-http.googleapis.com/gcm/notification"); // <-- Use this URL! HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setDoOutput(true); connection.setDoInput(true); connection.setRequestProperty("Authorization", "key=" + SERVER_API_KEY); // <--- Auth! connection.setRequestProperty("project_id", NUMERICAL_PROJECT_ID); connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestProperty("Accept", "application/json"); connection.connect(); JSONObject requestBody = new JSONObject(); requestBody.put("operation", "create"); // <--- Not "add" requestBody.put("notification_key_name", "foobar"); requestBody.put("registration_ids", new JSONArray(Arrays.asList(new String[]{token}))); // <--- Instance Id token here! requestBody.put("id_token", idToken); OutputStream os = connection.getOutputStream(); os.write(requestBody.toString().getBytes("UTF-8")); os.close(); InputStream is = connection.getInputStream(); String responseString = new Scanner(is, "UTF-8").useDelimiter("\\A").next(); is.close(); JSONObject response = new JSONObject(responseString); Log.d(TAG, "Server response:\n" + response.toString(4)); String notificationKey = response.getString("notification_key");
At this point, the "notificationKey" variable contains the notification key, which is the recipient that should be used when sending messages to this device group.
Send a message like this (use the value of "notificationKey" as the recipient parameter at the top):
private void sendMessage(String recipient) throws IOException, JSONException { Log.i(TAG, "Sending message to: " + recipient); URL url = new URL("https://gcm-http.googleapis.com/gcm/send"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setDoOutput(true); connection.setDoInput(true); Log.d(TAG, "Opening connection to " + url.toString()); connection.setRequestProperty("Authorization", "key=" + SERVER_API_KEY); connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestProperty("Accept", "application/json"); connection.connect(); JSONObject requestBody = new JSONObject(); requestBody.put("to", recipient); JSONObject requestData = new JSONObject(); requestData.put("hello", "Hello World!"); requestData.put("hellodata", "42"); requestBody.put("data", requestData); Log.d(TAG, "Request body:\n" + requestBody.toString(4)); OutputStream os = connection.getOutputStream(); os.write(requestBody.toString().getBytes("UTF-8")); os.close(); Log.d(TAG, "Response code: " + connection.getResponseCode()); InputStream is = connection.getInputStream(); String responseString = new Scanner(is, "UTF-8").useDelimiter("\\A").next(); is.close(); }
I could not do this without using the server API key. It might be worth exploring with different authorization header values ββon the endpoint https://http.googleapis.com/gcm/googlenotification .
Hope this makes sense. Have some fun. :-)