Java/J2ME/Audio Media
Содержание
Audio MIDlet
/*
Wireless Java 2nd edition
Jonathan Knudsen
Publisher: Apress
ISBN: 1590590775
*/
import java.io.*;
import javax.microedition.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import javax.microedition.media.*;
public class AudioMIDlet
extends MIDlet
implements CommandListener, Runnable {
private Display mDisplay;
private List mMainScreen;
public void startApp() {
mDisplay = Display.getDisplay(this);
if (mMainScreen == null) {
mMainScreen = new List("AudioMIDlet", List.IMPLICIT);
mMainScreen.append("Via HTTP", null);
mMainScreen.append("From resource", null);
mMainScreen.addCommand(new Command("Exit", Command.EXIT, 0));
mMainScreen.addCommand(new Command("Play", Command.SCREEN, 0));
mMainScreen.setCommandListener(this);
}
mDisplay.setCurrent(mMainScreen);
}
public void pauseApp() {}
public void destroyApp(boolean unconditional) {}
public void commandAction(Command c, Displayable s) {
if (c.getCommandType() == Command.EXIT) notifyDestroyed();
else {
Form waitForm = new Form("Loading...");
mDisplay.setCurrent(waitForm);
Thread t = new Thread(this);
t.start();
}
}
public void run() {
String selection = mMainScreen.getString(
mMainScreen.getSelectedIndex());
boolean viaHttp = selection.equals("Via HTTP");
if (viaHttp)
playViaHttp();
else
playFromResource();
}
private void playViaHttp() {
try {
String url = getAppProperty("AudioMIDlet-URL");
Player player = Manager.createPlayer(url);
player.start();
}
catch (Exception e) {
showException(e);
return;
}
mDisplay.setCurrent(mMainScreen);
}
private void playFromResource() {
try {
InputStream in = getClass().getResourceAsStream("/relax.wav");
Player player = Manager.createPlayer(in, "audio/x-wav");
player.start();
}
catch (Exception e) {
showException(e);
return;
}
mDisplay.setCurrent(mMainScreen);
}
private void showException(Exception e) {
Alert a = new Alert("Exception", e.toString(), null, null);
a.setTimeout(Alert.FOREVER);
mDisplay.setCurrent(a, mMainScreen);
}
}
demonstrate the functionality supported by javax.microedition.lcdui package.
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
/*
MIDlet to demonstrate the functionality supported by javax.microedition.lcdui package.
Make changes inside the constructor (SimpleMIDlet() method) and inside the startApp()
method to see all the different functionality in this package.
*** High-level APIs
---------------
1. testForm() method demonstrates a variety of formElements which are individually
instantiated from inside the addItemsToForm() method
2. testAlert() method throws up an Alert on top of an existing form when the SCREEN
button on the form is clicked
3. testList() and testBox() methods demonstrate the use of IMPLICIT List and TextBox
respectively
*** Low-level APIs
--------------
testCanvas()method demonstrates the use of low-level APIs
*/
public class SimpleMIDlet extends MIDlet implements CommandListener, ItemStateListener
{
Form simpleForm;
List simpleList;
TextBox simpleTextBox;
Alert simpleAlert;
SimpleCanvas simpleCanvas;
Ticker t;
Command c1 = new Command("Back", Command.BACK, 1);
Command c2 = new Command("Screen", Command.SCREEN, 1);
Command c3 = new Command("OK", Command.OK, 1);
public SimpleMIDlet (){
// High-level API examples
// 1. Form and form elements:
// a. Uncomment corresponding line in startApp() also
// b. Uncomment following line and comment out all other lines
testForm();
// 2. Alert example; click on the SCREEN button to see the Alert
// a. Uncomment corresponding line in startApp() also
// b. Uncomment following line and comment out all other lines
// testAlert();
// 3. IMPLICIT List example
// a. Uncomment corresponding line in startApp() also
// b. Uncomment following line and comment out all other lines
// testList();
// 4. TextBox example
// a. Uncomment corresponding line in startApp() also
// b. Uncomment following line and comment out all other lines
// testTextBox();
// Low-level API examples
// a. Uncomment corresponding line in startApp() also
// b. Uncomment following line and comment out all other lines
// testCanvas();
}
protected void destroyApp(boolean unconditional) {
}
protected void pauseApp() {
}
private void testForm() {
simpleForm = new Form("Simple Form");
// Create and add a new ticker to the Form
t = new Ticker("Tick tock tick tock");
simpleForm.setTicker(t);
// Add a few Commands to the Form
simpleForm.addCommand(c1);
simpleForm.addCommand(c2);
simpleForm.addCommand(c3);
addItemsToForm();
}
private void addItemsToForm() {
addChoiceGroup();
addDateField();
addGauge();
addImageItem();
addTextField();
}
private void addChoiceGroup() {
Image icon = null;
// Load image
try {
icon = Image.createImage("/midp/simpleMIDlet/Icon.png");
}
catch (java.io.IOException e) {
System.out.println("Could not load image. Exception: " + e);
}
// Image choices
Image[] imageArray = new Image[]{ icon, icon, icon };
String[] stringArray = { "Choice 1",
"Choice 2",
"Choice 3" };
// Set up an exclusive choice group
ChoiceGroup cGroup1 = new ChoiceGroup("Exclusive",
ChoiceGroup.EXCLUSIVE,
stringArray,
imageArray);
// Set up a multiple choice choice group
ChoiceGroup cGroup2 = new ChoiceGroup("Multiple",
ChoiceGroup.MULTIPLE,
stringArray,
imageArray);
simpleForm.append( cGroup1 );
simpleForm.append( cGroup2 );
simpleForm.setItemStateListener(this);
}
public void itemStateChanged (Item item) {
if( item.getLabel().equals("Exclusive")) {
int choice = ((ChoiceGroup)item).getSelectedIndex();
switch (choice) {
case 0:
simpleForm.append("\nSelection: 0\n");
break;
case 1:
simpleForm.append("\nSelection: 1\n");
break;
case 2:
simpleForm.append("\nSelection: 2\n");
break;
}
}
}
private void addDateField() {
simpleForm.append(new DateField("Date", DateField.DATE));
simpleForm.append(new DateField("Date & Time", DateField.DATE_TIME));
}
private void addGauge() {
// Add an interactive gauge with the maximum value of 100
// and an initial value of 50
simpleForm.append(new Gauge("Interactive", true, 100, 50));
// Add a non-interactive gauge
simpleForm.append(new Gauge("Non-interactive", false, 100, 50));
}
private void addImageItem() {
Image image = null;
try {
image = Image.createImage("/midp/SimpleMIDlet/JavaPowered-8.png");
}
catch(java.io.IOException e) {
System.out.println("Could not load image. Exception: " + e);
}
simpleForm.append(
new ImageItem("Default layout",
image,
ImageItem.LAYOUT_LEFT + ImageItem.LAYOUT_NEWLINE_BEFORE,
"Image not visible"));
}
private void addTextField() {
simpleForm.append(new TextField("Any character", "", 15, TextField.ANY));
simpleForm.append(new TextField("Email address", "", 20, TextField.EMAILADDR));
simpleForm.append(new TextField("Numeric", "", 10, TextField.NUMERIC));
simpleForm.append(new TextField("Phone", "", 12, TextField.PHONENUMBER));
simpleForm.append(new TextField("Password", "", 6, TextField.PASSWORD));
simpleForm.append(new TextField("URL", "", 30, TextField.URL));
}
private void testList() {
String[] listElems = {
"Element 1",
"Element 2",
"Element 3",
"Element 4",
"Element 5",
"Element 6",
"Element 7",
"Element 8",
"Element 9"
};
simpleList = new List("List", List.IMPLICIT, listElems, null);
}
private void testTextBox() {
simpleTextBox = new TextBox("Textbox", "4154", 10, TextField.PASSWORD);
}
private void testAlert() {
testForm();
simpleAlert = new Alert("Alert");
simpleAlert.setTimeout(Alert.FOREVER);
simpleAlert.setString("This is a test Alert");
simpleAlert.setType(AlertType.INFO);
}
private void testCanvas() {
simpleCanvas = new SimpleCanvas();
}
public void commandAction(Command c, Displayable d) {
if ( c.getCommandType() == Command.BACK ) {
// Go back
}
if ( c.getCommandType() == Command.SCREEN ) {
Display.getDisplay(this).setCurrent(simpleAlert, simpleForm);
}
}
protected void startApp() {
SimpleMIDlet simpleMIDlet = new SimpleMIDlet();
// High-level API examples
// 1. Uncomment the following two lines for Form and Alert examples and comment all others
Display.getDisplay(this).setCurrent(simpleMIDlet.simpleForm);
simpleMIDlet.simpleForm.setCommandListener(this);
// 2. Uncomment following line for IMPLICIT List example and comment all others
// Display.getDisplay(this).setCurrent(simpleMIDlet.simpleList);
// 3. Uncomment following line for TextBox examples and comment all others
// Display.getDisplay(this).setCurrent(simpleMIDlet.simpleTextBox);
// Low-level API examples
// Uncomment following line and comment all others
// Display.getDisplay(this).setCurrent(simpleMIDlet.simpleCanvas);
}
}
class SimpleCanvas extends Canvas {
int width, height;
int widthShift, heightShift;
String displayString;
public SimpleCanvas( ){
super();
width = getWidth() - 1;
height = getHeight() - 1;
widthShift = 0;
heightShift = 0;
displayString = "Hello World";
}
protected void paint( Graphics g ){
g.setColor( 0xffffff );
g.fillRect( 0, 0, width, height );
g.setColor( 0 );
g.drawString( displayString, width/2 + widthShift, height/2 + heightShift,
g.TOP | g.HCENTER );
}
public void keyPressed( int keyCode) {
int action = getGameAction(keyCode);
switch (action) {
case LEFT:
widthShift -= 2;
break;
case RIGHT:
widthShift += 2;
break;
case UP:
heightShift -= 2;
break;
case DOWN:
heightShift += 2;
break;
case FIRE:
displayString = "Boom!";
break;
}
repaint();
}
}
Media Information MIDlet
/*
Wireless Java 2nd edition
Jonathan Knudsen
Publisher: Apress
ISBN: 1590590775
*/
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import javax.microedition.media.*;
public class MediaInformationMIDlet extends MIDlet implements CommandListener {
private Form mInformationForm;
public void startApp() {
if (mInformationForm == null) {
mInformationForm =
new Form("Content types and protocols");
String[] contentTypes =
Manager.getSupportedContentTypes(null);
for (int i = 0; i < contentTypes.length; i++) {
String[] protocols =
Manager.getSupportedProtocols(contentTypes[i]);
for (int j = 0; j < protocols.length; j++) {
StringItem si = new StringItem(contentTypes[i] + ": ",
protocols[j]);
//si.setLayout(Item.LAYOUT_NEWLINE_AFTER);
mInformationForm.append(si);
}
}
Command exitCommand = new Command("Exit", Command.EXIT, 0);
mInformationForm.addCommand(exitCommand);
mInformationForm.setCommandListener(this);
}
Display.getDisplay(this).setCurrent(mInformationForm);
}
public void pauseApp() {}
public void destroyApp(boolean unconditional) {}
public void commandAction(Command c, Displayable s) {
notifyDestroyed();
}
}
Piano MIDlet
/*
Wireless Java 2nd edition
Jonathan Knudsen
Publisher: Apress
ISBN: 1590590775
*/
import javax.microedition.media.*;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class PianoMIDlet
extends MIDlet {
public void startApp() {
Displayable d = new PianoCanvas();
d.addCommand(new Command("Exit", Command.EXIT, 0));
d.setCommandListener(new CommandListener() {
public void commandAction(Command c, Displayable s) {
notifyDestroyed();
}
});
Display.getDisplay(this).setCurrent(d);
}
public void pauseApp() {}
public void destroyApp(boolean unconditional) {}
}
class PianoCanvas extends Canvas {
private static final int[] kNoteX = {
0, 11, 16, 29, 32, 48, 59, 64, 76, 80, 93, 96
};
private static final int[] kNoteWidth = {
16, 8, 16, 8, 16, 16, 8, 16, 8, 16, 8, 16
};
private static final int[] kNoteHeight = {
96, 64, 96, 64, 96, 96, 64, 96, 64, 96, 64, 96
};
private static final boolean[] kBlack = {
false, true, false, true, false,
false, true, false, true, false, true, false
};
private int mMiddleCX, mMiddleCY;
private int mCurrentNote;
public PianoCanvas() {
int w = getWidth();
int h = getHeight();
int fullWidth = kNoteWidth[0] * 8;
mMiddleCX = (w - fullWidth) / 2;
mMiddleCY = (h - kNoteHeight[0]) / 2;
mCurrentNote = 60;
}
public void paint(Graphics g) {
int w = getWidth();
int h = getHeight();
g.setColor(0xffffff);
g.fillRect(0, 0, w, h);
g.setColor(0x000000);
for (int i = 60; i <= 72; i++)
drawNote(g, i);
drawSelection(g, mCurrentNote);
}
private void drawNote(Graphics g, int note) {
int n = note % 12;
int octaveOffset = ((note - n) / 12 - 5) * 7 * kNoteWidth[0];
int x = mMiddleCX + octaveOffset + kNoteX[n];
int y = mMiddleCY;
int w = kNoteWidth[n];
int h = kNoteHeight[n];
if (isBlack(n))
g.fillRect(x, y, w, h);
else
g.drawRect(x, y, w, h);
}
private void drawSelection(Graphics g, int note) {
int n = note % 12;
int octaveOffset = ((note - n) / 12 - 5) * 7 * kNoteWidth[0];
int x = mMiddleCX + octaveOffset + kNoteX[n];
int y = mMiddleCY;
int w = kNoteWidth[n];
int h = kNoteHeight[n];
int sw = 6;
int sx = x + (w - sw) / 2;
int sy = y + h - 8;
g.setColor(0xffffff);
g.fillRect(sx, sy, sw, sw);
g.setColor(0x000000);
g.drawRect(sx, sy, sw, sw);
g.drawLine(sx, sy, sx + sw, sy + sw);
g.drawLine(sx, sy + sw, sx + sw, sy);
}
private boolean isBlack(int note) {
return kBlack[note];
}
public void keyPressed(int keyCode) {
int action = getGameAction(keyCode);
switch (action) {
case LEFT:
mCurrentNote--;
if (mCurrentNote < 60)
mCurrentNote = 60;
repaint();
break;
case RIGHT:
mCurrentNote++;
if (mCurrentNote > 72)
mCurrentNote = 72;
repaint();
break;
case FIRE:
try { Manager.playTone(mCurrentNote, 1000, 100); }
catch (MediaException me) {}
break;
default:
break;
}
}
}
Sound Alert
/*--------------------------------------------------
* SoundAlert.java
*
* Example from the book: Core J2ME Technology
* Copyright John W. Muchow http://www.CoreJ2ME.ru
* You may use/modify for any non-commercial purpose
*-------------------------------------------------*/
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class SoundAlert extends MIDlet implements ItemStateListener, CommandListener
{
private Display display; // Reference to display object
private Form fmMain; // Main form
private Command cmExit; // Command to exit the MIDlet
private ChoiceGroup cgSound; // Choice group
public SoundAlert()
{
display = Display.getDisplay(this);
// Create an exclusive (radio) choice group
cgSound = new ChoiceGroup("Choose a sound", Choice.EXCLUSIVE);
// Append options, with no associated images
cgSound.append("Info", null);
cgSound.append("Confirmation", null);
cgSound.append("Warning", null);
cgSound.append("Alarm", null);
cgSound.append("Error", null);
cmExit = new Command("Exit", Command.EXIT, 1);
// Create Form, add components, listen for events
fmMain = new Form("");
fmMain.append(cgSound);
fmMain.addCommand(cmExit);
fmMain.setCommandListener(this);
fmMain.setItemStateListener(this);
}
public void startApp()
{
display.setCurrent(fmMain);
}
public void pauseApp()
{ }
public void destroyApp(boolean unconditional)
{ }
public void commandAction(Command c, Displayable s)
{
if (c == cmExit)
{
destroyApp(false);
notifyDestroyed();
}
}
public void itemStateChanged(Item item)
{
switch (cgSound.getSelectedIndex())
{
case 0:
AlertType.INFO.playSound(display);
break;
case 1:
AlertType.CONFIRMATION.playSound(display);
break;
case 2:
AlertType.WARNING.playSound(display);
break;
case 3:
AlertType.ALARM.playSound(display);
break;
case 4:
AlertType.ERROR.playSound(display);
break;
}
}
}
Tone MIDlet
/*
Wireless Java 2nd edition
Jonathan Knudsen
Publisher: Apress
ISBN: 1590590775
*/
import java.io.*;
import javax.microedition.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import javax.microedition.media.*;
import javax.microedition.media.control.*;
public class ToneMIDlet extends MIDlet implements CommandListener {
private final static String kSoundOfMusic = "Sound of Music";
private final static String kQuandoMenVo = "Quando men vo";
private final static String kTwinkle = "Twinkle number VII";
private Display mDisplay;
private List mMainScreen;
public void startApp() {
mDisplay = Display.getDisplay(this);
if (mMainScreen == null) {
mMainScreen = new List("AudioMIDlet", List.IMPLICIT);
mMainScreen.append(kSoundOfMusic, null);
mMainScreen.append(kQuandoMenVo, null);
mMainScreen.append(kTwinkle, null);
mMainScreen.addCommand(new Command("Exit", Command.EXIT, 0));
mMainScreen.addCommand(new Command("Play", Command.SCREEN, 0));
mMainScreen.setCommandListener(this);
}
mDisplay.setCurrent(mMainScreen);
}
public void pauseApp() {}
public void destroyApp(boolean unconditional) {}
public void commandAction(Command c, Displayable s) {
if (c.getCommandType() == Command.EXIT) notifyDestroyed();
else run();
}
public void run() {
String selection = mMainScreen.getString(
mMainScreen.getSelectedIndex());
byte[] sequence = null;
if (selection.equals(kSoundOfMusic)) {
sequence = new byte[] {
ToneControl.VERSION, 1,
67, 16, // The
69, 16, // hills
67, 8, // are
65, 8, // a -
64, 48, // live
62, 8, // with
60, 8, // the
59, 16, // sound
57, 16, // of
59, 32, // mu -
59, 32 // sic
};
}
else if (selection.equals(kQuandoMenVo)) {
sequence = new byte[] {
ToneControl.VERSION, 1,
ToneControl.TEMPO, 22,
ToneControl.RESOLUTION, 96,
64, 48, ToneControl.SILENCE, 8, 52, 4, 56, 4, 59, 4, 64, 4,
63, 48, ToneControl.SILENCE, 8, 52, 4, 56, 4, 59, 4, 63, 4,
61, 72,
ToneControl.SILENCE, 12, 61, 12,
63, 12, 66, 2, 64, 10, 63, 12, 61, 12,
64, 12, 57, 12, 57, 48,
ToneControl.SILENCE, 12, 59, 12,
61, 12, 64, 2, 63, 10, 61, 12, 59, 12,
63, 12, 56, 12, 56, 48,
};
}
else if (selection.equals(kTwinkle)) {
sequence = new byte[] {
ToneControl.VERSION, 1,
ToneControl.TEMPO, 22,
ToneControl.BLOCK_START, 0,
60, 8, 62, 4, 64, 4, 65, 4, 67, 4, 69, 4, 71, 4,
72, 4, 74, 4, 76, 4, 77, 4, 79, 4, 81, 4, 83, 4, 84, 4,
83, 4, 81, 4, 80, 4, 81, 4, 86, 4, 84, 4, 83, 4, 81, 4,
81, 4, 79, 4, 78, 4, 79, 4, 60, 4, 79, 4, 88, 4, 79, 4,
57, 4, 77, 4, 88, 4, 77, 4, 59, 4, 77, 4, 86, 4, 77, 4,
56, 4, 76, 4, 86, 4, 76, 4, 57, 4, 76, 4, 84, 4, 76, 4,
53, 4, 74, 4, 84, 4, 74, 4, 55, 4, 74, 4, 83, 4, 74, 4,
84, 16, ToneControl.SILENCE, 16,
ToneControl.BLOCK_END, 0,
ToneControl.BLOCK_START, 1,
79, 4, 84, 4, 88, 4, 86, 4, 84, 4, 83, 4, 81, 4, 79, 4,
77, 4, 76, 4, 74, 4, 72, 4, 71, 4, 69, 4, 67, 4, 65, 4,
64, 8, 76, 8, 77, 8, 78, 8,
79, 12, 76, 4, 74, 8, ToneControl.SILENCE, 8,
ToneControl.BLOCK_END, 1,
ToneControl.SET_VOLUME, 100, ToneControl.PLAY_BLOCK, 0,
ToneControl.SET_VOLUME, 50, ToneControl.PLAY_BLOCK, 0,
ToneControl.SET_VOLUME, 100, ToneControl.PLAY_BLOCK, 1,
ToneControl.SET_VOLUME, 50, ToneControl.PLAY_BLOCK, 1,
ToneControl.SET_VOLUME, 100, ToneControl.PLAY_BLOCK, 0,
};
}
try {
Player player = Manager.createPlayer(Manager.TONE_DEVICE_LOCATOR);
player.realize();
ToneControl tc = (ToneControl)player.getControl("ToneControl");
tc.setSequence(sequence);
player.start();
}
catch (Exception e) {
Alert a = new Alert("Exception", e.toString(), null, null);
a.setTimeout(Alert.FOREVER);
mDisplay.setCurrent(a, mMainScreen);
}
}
}