/** * Copyright (c) 2012 Nokia Corporation. All rights reserved. * Nokia and Nokia Connecting People are registered trademarks of Nokia Corporation. * Oracle and Java are trademarks or registered trademarks of Oracle and/or its * affiliates. Other product and company names mentioned herein may be trademarks * or trade names of their respective owners. * See LICENSE.TXT for license information. */ package com.nokia.example.contenthandler.audiohandler; import java.io.IOException; import java.io.InputStream; import javax.microedition.content.ContentHandlerServer; import javax.microedition.content.Invocation; import javax.microedition.content.Registry; import javax.microedition.content.RequestListener; import javax.microedition.io.HttpConnection; import javax.microedition.lcdui.Alert; import javax.microedition.lcdui.AlertType; import javax.microedition.lcdui.Command; import javax.microedition.lcdui.CommandListener; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.Form; import javax.microedition.lcdui.Image; import javax.microedition.lcdui.ImageItem; import javax.microedition.lcdui.Item; import javax.microedition.lcdui.Ticker; import javax.microedition.media.Manager; import javax.microedition.media.Player; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; /** * * Class has functionality how to fetch content from the server and play it * using Player. RequestListenr will work to notify incoming invocation. It will * start new thread to handle it. * */ public class AudioHandler extends MIDlet implements CommandListener, RequestListener { // Audio Player Form Title private static final String FORM_TITLE = "Audio Player"; // Audio Player ticker title private static final String TICKER_TITLE = "Playing Audio File"; // Message constant private static final String MSG_CAN_NOT_READ_AUDIO = "Can not read Audio"; // Audio content type constant private static final String CONTENT_TYPE_AUDIO = "audio/x-wav"; // Current class name private static final String CLASS_NAME = "com.nokia.example.contenthandler.audiohandler.AudioHandler"; // Display instance private Display display = null; // Form to display audio UI private Form audioForm = null; // Stop audio playing private Command stopCommand = new Command("Back", Command.STOP, 1); // Exit the application and go back to the invoker private Command exitCommand = new Command("Exit", Command.EXIT, 1); // Instance of the player private Player player; // Current invocation, null if no Invocation. private Invocation invocation; // ContentHandlerServer from which to get requests. private ContentHandlerServer handler; // Access to Registry functions and responses. private Registry registry; // Audio Input Stream stores audio data comes from the server. private InputStream audioStream; // Stores the type of the Invocation content. private String reveivedType; /** * Constructor initializes the display instance as well as creates the * instance of ContentHandlerServer using Registry class. It also sets the * RequestListener for any incoming Invocation. */ public AudioHandler() { display = Display.getDisplay(this); try { registry = Registry.getRegistry(AudioHandler.CLASS_NAME); handler = registry.register(AudioHandler.CLASS_NAME, new String[]{AudioHandler.CONTENT_TYPE_AUDIO}, null, null, null, null, null); if (handler != null) { handler.setListener(this); } } catch (Exception che) { //che.printStackTrace(); } } /** * It displays audioForm and removes extra commands and items. */ private void displayAudioPlayForm() { // Remove previous items and command audioForm = new Form(AudioHandler.FORM_TITLE); audioForm.removeCommand(exitCommand); String name = invocation.getURL(); name = name.substring(name.lastIndexOf('/') + 1); audioForm.addCommand(stopCommand); audioForm.setCommandListener(this); audioForm.setTicker(new Ticker(AudioHandler.TICKER_TITLE)); try { ImageItem imageItem = new ImageItem(null, null, Item.LAYOUT_CENTER, "-no image-"); imageItem.setImage(Image.createImage("/note.png")); audioForm.append(imageItem); } catch (Exception e) { //e.printStackTrace(); } display.setCurrent(audioForm); } protected void startApp() throws MIDletStateChangeException { } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { } protected void pauseApp() { } /** * Handlers Audio commands * * playCommand Start playing audio. Invoke the URL in a new Thread to * prevent blocking the user interface. * * stopCommand Stop playing and go back to the main screen. * * exitCommand exit from the current app and go back to the invoker app * * @throws MIDletStateChangeException */ public void commandAction(Command command, Displayable disp) { if (command.getLabel().equals("Back") || command == exitCommand) { try { doFinish(Invocation.OK); destroyApp(true); notifyDestroyed(); } catch (MIDletStateChangeException e) { //e.printStackTrace(); } } } /** * Handles incoming invocation request using the ContentHandlerServer * instance. If there is a current Invocation finish it so the next Contact * can be displayed. Get the requested invocation in invoc instance and call * method handleAudio(invoc) to handle audio. */ public void invocationRequestNotify(ContentHandlerServer server) { if (invocation != null) { handler.finish(invocation, Invocation.OK); } invocation = handler.getRequest(false); if (invocation != null) { handleAudio(invocation); } } /** * Creates Http connection with the server and get located content in * InputStream audioIN. It starts thread to play audio. * * @param _invoc */ private void handleAudio(Invocation _invoc) { HttpConnection conn = null; try { conn = (HttpConnection) _invoc.open(false); // Check the status and read the content int status = conn.getResponseCode(); if (status != HttpConnection.HTTP_OK) { Alert alert = new Alert(AudioHandler.MSG_CAN_NOT_READ_AUDIO, "Audio not available at " + _invoc.getURL(), null, AlertType.ERROR); display.setCurrent(alert); doFinish(Invocation.CANCELLED); return; } reveivedType = conn.getType(); /** * If invocation content type does not match with the app content * type then display main screen without handling the content. */ if (!reveivedType.equals(AudioHandler.CONTENT_TYPE_AUDIO)) { //inputAudioUrlFrom(); } // Get the image from the connection audioStream = conn.openInputStream(); new Thread(new Runnable() { public void run() { try { displayAudioPlayForm(); player = Manager.createPlayer(audioStream, AudioHandler.CONTENT_TYPE_AUDIO); player.start(); } catch (Exception e) { Alert alert = new Alert(AudioHandler.MSG_CAN_NOT_READ_AUDIO, "Unable to play Audio", null, AlertType.ERROR); display.setCurrent(alert); doFinish(Invocation.CANCELLED); } } }).start(); } catch (Exception e) { Alert alert = new Alert(AudioHandler.MSG_CAN_NOT_READ_AUDIO, "Audio not available", null, AlertType.ERROR); display.setCurrent(alert); doFinish(Invocation.CANCELLED); } finally { try { if (conn != null) { conn.close(); } } catch (IOException ioe) { } } } /** * Finishes the Invocation. */ boolean doFinish(int status) { if (invocation != null) { boolean mustExit = handler.finish(invocation, status); invocation = null; if (mustExit) { try { destroyApp(true); } catch (MIDletStateChangeException e) { //e.printStackTrace(); } notifyDestroyed(); return true; } else { // Application does not need to exit } } return false; } }