Search code examples
push-notificationkindle-fire

Nofication sample - kindle fire


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?


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 ", "[email protected]");
        conn.setRequestProperty("X-Amzn-Accept-Type", "[email protected]");
    
        // 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();
    }