Question

Since GCM (previously: C2DM) is not supported on Kindle Fire devices, I'm now searching the other best notification service available. Which is the best notification service for Kindle Fire?

Was it helpful?

Solution

Try the Amazon Device Messaging API (beta) :

Amazon Device Messaging (ADM) lets you send push notifications from the cloud to Kindle Fire devices that run your app.

ADM is a transport mechanism, optimized to queue your messages and deliver them to a targeted instance of your app. What you do with those messages is up to you. For example, upon receiving a message, your app might post a notification, display a custom user interface, or sync data.

In addition to providing a best-in-class payload size of up to 6KB per message, ADM is available at no cost to developers.

And here's a code sample for sending a notification :

/**
 * Request that ADM deliver your message to a specific instance of your app.
 */
public void sendMessageToDevice(String registrationId, String accessToken) throws Exception
{                                        
    // JSON payload representation of the message.
    JSONObject payload = new JSONObject();

    // Define the key/value pairs for your message content and add them to the
    // message payload.
    JSONObject data = new JSONObject();
    data.put("firstKey", "firstValue");
    data.put("secondKey", "secondValue");
    payload.put("data", data);  

    // Add a consolidation key. If multiple messages are pending delivery for a particular
    // app instance with the same consolidation key, ADM will attempt to delivery the most
    // recently added item.
    payload.put("consolidationKey", "ADM_Enqueue_Sample");

    // Add an expires-after value to the message of 1 day. If the targeted app instance does not
    // come online within the expires-after window, the message will not be delivered.
    payload.put("expiresAfter", 86400);      

    // Convert the message from a JSON object to a string.
    String payloadString = payload.toString();

    // Establish the base URL, including the section to be replaced by the registration
    // ID for the desired app instance. Because we are using String.format to create
    // the URL, the %1$s characters specify the section to be replaced.
    String admUrlTemplate = "https://api.amazon.com/messaging/registrations/%1$s/messages";

    URL admUrl = new URL(String.format(admUrlTemplate,registrationId));

    // Generate the HTTPS connection for the POST request. You cannot make a connection
    // over HTTP.
    HttpsURLConnection conn = (HttpsURLConnection) admUrl.openConnection();
    conn.setRequestMethod("POST");
    conn.setDoOutput(true);

    // Set the content type and accept headers.
    conn.setRequestProperty("content-type", "application/json");
    conn.setRequestProperty("accept", "application/json");
    conn.setRequestProperty("X-Amzn-Type-Version ", "com.amazon.device.messaging.ADMMessage@1.0");
    conn.setRequestProperty("X-Amzn-Accept-Type", "com.amazon.device.messaging.ADMSendResult@1.0");

    // Add the authorization token as a header.
    conn.setRequestProperty("Authorization", "Bearer " + accessToken);

    // Obtain the output stream for the connection and write the message payload to it.
    OutputStream os = conn.getOutputStream();
    os.write(payloadString.getBytes(), 0, payloadString.getBytes().length);
    os.flush();
    conn.connect();

    // Obtain the response code from the connection.
    int responseCode = conn.getResponseCode();

    // Check if we received a failure response, and if so, get the reason for the failure.
    if( responseCode != 200)
    {  
        if( responseCode == 401 )
        {
            // If a 401 response code was received, the access token has expired. The token should be refreshed
            // and this request may be retried.
        }

        String errorContent = parseResponse(conn.getErrorStream());             
        throw new RuntimeException(String.format("ERROR: The enqueue request failed with a " +
                                         "%d response code, with the following message: %s",
                                         responseCode, errorContent));
    }
    else
    {
        // The request was successful. The response contains the canonical Registration ID for the specific instance of your
        // app, which may be different that the one used for the request.

        String responseContent = parseResponse(conn.getInputStream());          
        JSONObject parsedObject = new JSONObject(responseContent);

        String canonicalRegistrationId = parsedObject.getString("registrationID");

        // Check if the two Registration IDs are different.
        if(!canonicalRegistrationId.equals(registrationId))
        {              
            // At this point the data structure that stores the Registration ID values should be updated
            // with the correct Registration ID for this particular app instance.
        }
    }

}

private String parseResponse(InputStream in) throws Exception
{
    // Read from the input stream and convert into a String.
    InputStreamReader inputStream = new InputStreamReader(in);
    BufferedReader buff = new BufferedReader(inputStream);

    StringBuilder sb = new StringBuilder();
    String line = buff.readLine();
    while(line != null)
   {         
      sb.append(line);
      line = buff.readLine();
    }

    return sb.toString();
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top