MODUL PRAKTIKUM PEMROGRAMAN APLIKASI BERGERAK Disusun Oleh: Viktor Handrianus Pranatawijaya, ST., MT. JURUSAN/PROGRAM STUDI TEKNISI KOMPUTER DAN JARINGAN FAKULTAS TEKNIK UNIVERSITAS PALANGKA RAYA 2009
MODUL PRAKTIKUM
PEMROGRAMAN APLIKASI BERGERAK
Disusun Oleh:
Viktor Handrianus Pranatawijaya, ST., MT.
JURUSAN/PROGRAM STUDI TEKNISI KOMPUTER DAN JARINGAN
FAKULTAS TEKNIK
UNIVERSITAS PALANGKA RAYA
2009
MODUL I
PEMBUATAN MIDlet
A. TUJUAN
Setelah menyelesaikan modul ini, mahasiswa diharapkan mampu:
Membuat MIDlet sederhana
Membuat sebuah project di NetBeans
Membuat sebuah MIDlet menggunakan NetBeans Mobility Pack
Menjalankan MIDlet di emulator
B. LANDASAN TEORI
J2ME adalah satu set spesifikasi dan teknologi yang fokus kepada perangkat konsumen.
Perangkat ini memiliki jumlah memori yang terbatas, menghabiskan sedikit daya dari baterei,
layar yang kecil dan bandwith jaringan yang rendah.
The Mobile Information Device Profile (MIDP) berada di atas dari The Connected
Limited Device Configuration (CLDC). Anda tidak bisa menulis aplikasi mobile hanya dengan
menggunakan CLDC API. Anda harus tetap memanfaatkan MIDP yang mendefinisikan UI.
Spesifikasi MIDP, kebanyakan seperti CLDC dan API lainnya sudah digambarkan
melalui Java Community Process (JCP). JCP melibatkan sebuah kelompok ahli berasal dari lebih
dari 50 perusahaan, yang terdiri atas pabrik perangkat mobile, pengembang software. MIDP
terus berkembang, dengan versi-versi masa depan yang telah lulus dari proses ketat JCP.
Spesifikasi MIDP menggambarkan suatu perangkat MID yang memiliki karakteristik-karateristik
ini sebagai batas minimum:
Tampilan:
Ukuran Layar: 96x54
kedalaman tampilan: 1-bit
Ketajaman pixel: sekitar 1:1
Masukan:
Satu atau lebih mekanisme user-input: satu keybboard, dua keyboard, atau touch
screen
Memory:
256 kilobytes of non-volatile memory untuk implementasi MIDP.
8 kilobytes of non-volatile memory for application-created persistent data
128 kilobytes of volatile memory for the Java runtime (e.g., the Java heap
Jaringan:
dua jalur, wireless, bandwidth terbatas
Sound:
Kemampuan untuk memainkan nada-nada
Suatu aplikasi MIDP disebut MIDlet. Perangkat application management software
(AMS) berinteraksi langsung dengan MIDlet dengan method MIDlet create, start, pause, dan
destroy.
MIDlet adalah bagian dari package javax.microedition.midlet. Sebuah MIDlet harus di-
extend dengan class MIDlet. Dan dapat meminta parameter dari AMS seperti dirumuskan dalam
application descriptor (JAD).
Suatu MIDlet tidak harus memiliki (dan memang harus tidak mempunyai) sebuah method
public static void main(String[] argv).Method tersebut tidak akan dikenal lagi oleh AMS sebagai
titik awal sebuah program.
Aplikasi-aplikasi MIDlet dibungkus dan dikirim kedalam perangkat sebagai MIDlet
suites. Sebuah MIDlet suite terdiri dari Java Archive (JAR) dan sebuah tambahan Java
Application Descriptor (JAD). File JAD adalah suatu file teks yang berisi satu set atribut-atribut,
beberapa dibutuhkan.
C. TUGAS
1. Buatlah program TKJMidlet.java seperti di bawah ini! /*
* TKJMidlet.java
*/
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class TKJMidlet extends MIDlet implements CommandListener {
Display display;
Command exitCommand = new Command("Exit", Command.EXIT, 1);
Alert TPLAlert;
public TKJMidlet(){
TKJAlert = new Alert(
"TKJ MIDlet", "Teknisi Jaringan dan Komputer",null, AlertType.INFO);
TKJAlert.setTimeout(Alert.FOREVER);
TKJAlert.addCommand(exitCommand);
TKJAlert.setCommandListener(this);
}
public void startApp() {
if (display == null){
display = Display.getDisplay(this);
}
display.setCurrent(TKJAlert);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
public void commandAction(Command c, Displayable d){
if (c == exitCommand){
destroyApp(true);
notifyDestroyed(); // Exit
}
}
}
a. Menggunakan Sun Wireless Toolkit
Sekarang kita menggunakan Sun Wireless Toolkit untuk mengcompile dan memaketkan
aplikasi MIDlet / MIDlet suite (mengandung satu MIDlet).
Langkah 1: Buka toolbar (dari Wireless Toolkit distribution)
Langkah 2: Buat sebuah project
Langkah 3: Pada Setting window, anda dapat mengubah banyak pilihan-pilihan dari beberapa
opsi konfigurasi untuk project Anda. Anda dapat memilih konfigurasi yang akan
bekerja, package/API yang diperlukan, konfigurasi Push Registry dan yang lain.
Untuk tujuan kita kali ini, kita akan menggunakan konfigurasi default project. Click
"OK" untuk selesai membuat project.
Langkah 4: Copy TKJMidlet.java kedalam direktori "src": Pada jendela ini berada di direktori:
C:\WTK22\apps\TKJMidlet\src (dimana C:\WTK22 adalah lokasi Anda menginstall
wireless toolkit). Click "Build" dan "Run":
b. Menggunakan NetBeans Mobility Pack
Langkah 1: Membuat project baru
Langkah 2: Memilih kategori "Mobile"
Langkah 3: Memilih "Mobile Application"
Langkah 4: Beri nama project dan tentukan lokasinya (Hilangkan tanda pada "Create Hello
MIDlet", kita akan membuat MIDlet kita sendiri nantinya)
Langkah 5: Memilih Platform (optional)
Langkah 6: Membuat sebuah MIDlet baru
Langkah 7: Memilih MIDP "Category" dan MIDlet "File Type"
Langkah 8: Memberi nama MIDlet
Langkah 9: Mengganti code yang dibuat secara otomatis dengan code program kita.
Langkah 10: Mengcompile dan Menjalankan (Run) MIDlet di Emulator
Langkah 11: Menjalankan MIDlet kita di Emulator
2. Buatlah program untuk menampilkan informasi mahasiswa! Informasi yang ditampilkan
adalah nama, nim, tempat dan tanggal lahir, alamat, dan no telepon/HP.
MODUL II
HIGH LEVEL USER INTERFACE
A. TUJUAN
Setelah menyelesaikan modul ini, mahasiswa diharapkan mampu membuat MIDlets
menggunakan komponen high-level UI.
B. LANDASAN TEORI
MDIP user interface didesain untuk peralatan mobile. Aplikasi MDIP ditunjukan pada
area limited screen. Peralatan memory juga menjadi faktor penting jika perlengkapan mobile
hanya memiliki kapasitas memory yang kecil.
Dengan berbagai macam peralatan mobile, dari berbagai model mobile phones sampai
PDAs, MIDP user interface telah didesain untuk lebih fleksibel dan mudah digunakan dalam
berbagai macam peralatan ini.
MIDP mempunyai class yang dapat menangani fungsi high-level dan low-level user
interface. High-level UI interfaces didesain secara fleksibel. Penampilan dari komponen ini tidak
didefinisikan secara spesifik. Penampilan screen yang sebenarnya dari berbagai macam
komponen ini digunakan dari satu peralatan ke peralatan yang lain. Tetapi para programmer telah
teryakinkan oleh kegunaan dari high-level komponen UI interfaces memiliki persamaan dalam
berbagai spesifikasi-pengimplementasi secara keseluruhan.
Kapan menggunakan High-Level UI
Saat membangun aplikasi text-based yang mudah
Saat Anda ingin aplikasi Anda dapat dengan mudah dipertukarkan dengan berbagai macam
peralatan (Portabilitas)
Saat Anda ingin aplikasi Anda memiliki tampilan yang sama dengan komponen UI yang lain
dari berbagai peralatan
Saat Anda ingin kode Anda dapat menjadi sesedikit mungkin, ketika sebuah interaksi
ditangani oleh API
B.1 Display
Inti dari MIDP user interfaces adalah display. Yang merupakan satu-satunya kemudahan
dari Display per MIDlet. MIDlet dapat mendapatkan referensi Display object dengan
menggunakan method static Display.getDisplay(), melewatkan referensi tersebut ke MIDlet
instance. MIDlet dijamin dengan display object tidak akan bengubah dengan adanya eksistensi
instance MIDlet. Hal ini berarti bahwa variabel dikembalikan (returned) ketika Anda memanggil
getDisplay() dan tidak akan berpengaruh jika anda memenggilnya dengan startApp() atau
destroyApp(). Sebuah displayable dapat memiliki nama (title), beberapa perintah(command),
commandListener dan Ticker.
B.2 Screen
Screen merupakan inti abstrak class yang digunakan untuk high-level UI. Berikut ini
empat subclasses dari abstract class screen : Form, TextBox, List dan Alert.
B.3 Item
Items merupakan komponen yang dapat diletakan kedalam container, seperti Form atau
Alert. Sebuah item dapat memiliki property seperti dibawah ini:
Spesifikasi layout dari item dengan Form. Direktif layout dapat dikombinasikan menggunkan
bitwise atau operasi (|). Bagaimanapun juga, beberapa direktif bersifat mutually exclusive.
Berikut ini direktif horizontal alignment yang mutually exclusive:
LAYOUT_LEFT
LAYOUT_RIGHT
LAYOUT_CENTER
Berikut ini direktif vertical alignment yang juga mutually exclusive:
LAYOUT_TOP
LAYOUT_BOTTOM
LAYOUT_VCENTER
Berikut ini layout yang lain dari direktif (tidak mutually exclusive):
LAYOUT_NEWLINE_BEFORE
LAYOUT_NEWLINE_AFTER
LAYOUT_SHRINK
LAYOUT_VSHRINK
LAYOUT_EXPAND
LAYOUT_VEXPAND
LAYOUT_2
C. TUGAS
1. Buatlah program ContohForm.java seperti di bawah ini! Gambar duke.gif dapat diganti.
(Catatan: Gambar duke.gif harus ada pada folder res di aplikasi MIDlet ini).
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class ContohForm extends MIDlet {
private Form form;
private Gauge gauge;
private Spacer spacer;
private ImageItem imageItem;
private TextField txtField;
private DateField dateField;
private StringItem stringItem;
private ChoiceGroup choiceGroup;
public ContohForm() {
form = new Form("Biodata");
stringItem = new StringItem("NIM: ", "DBC003001");
form.append(stringItem);
dateField = new DateField("Tanggal Lahir: ", DateField.DATE);
form.append(dateField);
txtField = new TextField(
"Nama: ", "", 50, TextField.ANY);
form.append(txtField);
choiceGroup = new ChoiceGroup(
"Jenis Kelamin: ",
Choice.EXCLUSIVE,
new String[] {"Laki-laki", "Perempuan"},
null);
form.append(choiceGroup);
spacer = new Spacer(20, 20);
form.append(spacer);
gauge = new Gauge("Langkah 1 dari 3", false, 3, 1);
form.append(gauge);
try {
imageItem = new ImageItem(
"Dibuat Oleh: ",
Image.createImage("/duke.gif"),
ImageItem.LAYOUT_DEFAULT,
"DuKe");
form.append(imageItem);
} catch(Exception e) {}
}
public void startApp() {
Display display = Display.getDisplay(this);
display.setCurrent(form);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
Tambahkan Ticker pada aplikasi ini dengan menggunakan perintah:
form.setTicker(new Ticker("Selamat Datang Di Informasi Mahasiswa TPL!!!")).
Tambahkan command pada aplikasi ini dengan menggunakan perintah: form.addCommand(new Command("EXIT", Command.EXIT, 2));
form.addCommand(new Command("HELP", Command.HELP, 2));
form.addCommand(new Command("OK", Command.OK, 1));
form.setCommandListener(this);
}
public void commandAction(
Command com, Displayable dis) {
String label = com.getLabel();
if("EXIT".equals(label))
notifyDestroyed();
else if("HELP"Equals(label))
displayHelp();
else if("OK"Equals(label))
processForm();
}
public void displayHelp() {
}
public void processForm() {
}
2. Buatlah program ContohList.java seperti di bawah ini!
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class ContohList extends MIDlet implements CommandListener {
Display display;
List list;
Command exitCommand = new Command("Exit", Command.EXIT, 1);
Command newCommand = new Command("New Item", Command.OK, 1);
Command renameCommand = new Command("Rename Item", Command.OK, 1);
Command deleteCommand = new Command("Delete Item", Command.OK, 1);
Ticker ticker = new Ticker("Contoh List");
public ListExample(){
list = new List("JEDI: List Example", List.IMPLICIT);
list.append("List Item #1", null);
list.append("List Item #2", null);
list.append("List Item #3", null);
list.setTicker(ticker);
list.addCommand(exitCommand);
list.addCommand(newCommand);
list.addCommand(renameCommand);
list.addCommand(deleteCommand);
list.setCommandListener(this);
}
public void startApp() {
if (display == null){
display = Display.getDisplay(this);
display.setCurrent(list);
}
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
public void commandAction(Command c, Displayable d){
if (c == exitCommand){
destroyApp(true);
notifyDestroyed(); // Exit
}
if (c == List.SELECT_COMMAND){
int index = list.getSelectedIndex();
String currentItem = list.getString(index);
}
}
}
MODUL III
LOW LEVEL USER INTERFACE
A. TUJUAN
Setelah menyelesaikan modul ini, mahasiswa diharapkan mampu membuat MIDlets
menggunakan komponen low-level UI.
B. LANDASAN TEORI
Satu kelemahan ketika hanya menggunakan komponen user interface level tinggi adalah
program tidak memiliki kendali penuh sebuah layar. Ada saat dimana kita ingin menggambar
sebuah garis, gambar beranimasi dan mempunyai kendali untuk mengatur pixel pada layar.
Kapan menggunakan Low-Level UI
Saat Anda memerlukan sebuah high-level untuk mengkontrol tampilan dari suatu aplikasi
Saat aplikasi Anda membutuhkan tempat yang tepat dari elemen-elemen yang ada pada
screen
Saat membuat game secara grafik; meskipun Anda tetap dapat menggunakan highlevel UI
pada menu game, hal tersebut lebih disarankan untuk membuat menu UI
Saat sebuah aplikasi membutuhkan akses ke low-level yang memiliki inputan seperti key
presses
Jika aplikasi Anda akan diimplementasikan pada layar navigasi Anda sendiri
Pada modul ini, kita akan berhadapan langsung dengan layar. Kita akan mempelajari
class Canvas, dimana akan menjadi pendukung dari proses menggambar kita. Kita juga akan
menyelidiki ke dalam class Graphic, dimana memiliki metode untuk menggambar garis, kotak,
sudut, dan teks. Kita juga akan membahas huruf, warna dan gambar.
Canvas adalah subclass dari Displayable. Itu adalah sebuah class abstrak yang harus di-
extend sebelum sebuah aplikasi dapat menggunakan fungsi-fungsi yang ada. Canvas dapat
digabungkan dengan subclass Displayable level tinggi yaitu Screen. Program dapat pindah ke
dan dari Canvas dan Screen. Canvas menggambarkan metode-metode event handling kosong.
Aplikasi harus mengesampingkan mereka untuk handle event. Class Canvas menggambarkan
sebuah metode abstrak yang disebut paint(). Aplikasi menggunakan class Canvas harus
menyediakan sebuah implementasi untuk metode paint().
Sistem koordinat dari Canvas adalah berbasis nol. Koordinat x dan y dimulai dengan nol.
Pojok kiri atas dari Canvas berkoordinat (0,0). Koordinat x bertambah dari kiri ke kanan.
Sedangkan koordinat y bertambah dari atas ke bawah. Metode getWidth() dan getHeight()
mengembalikan nilai lebar dan tinggi berturut-turut. Pojok kanan bawah pada layar memiliki
koordinat (getWidth()-1,getWidth()-1).
Class Graphic adalah class utama untuk menulis teks, menggambar, garis, kotak dan
sudut. Dia memiliki metode untuk menentukan warna, huruf, dan coretan. Class Display
memiliki metode untuk menentukan apakah sebuah perangkat memiliki fasilitas yang
mendukung layar berwarna atau layar monochrome pada sebuah perangkat. Sebuah huruf
memiliki tiga atribut yaitu bentuk, type, dan ukuran.
Huruf adalah sebuah class yang terpisah. Seperti yang dinyatakan di atas, aplikasi tidak
menciptakan objek huruf. Sebagai gantinya, metode-metode statis getFont() dan
getDefaultFont() digunakan untuk meminta sebuah huruf dari sistem.
Teks digambar sesuai dengan sebuah anchor points. Metode drawString() mengharap
sebuah koordinat (x,y) sesuai dengan anchor points.
public void drawString(String str, int x, int y, int anchor)
Metode untuk menggambar teks dan karakter adalah :
public void drawString(String str,int
x, int y, int anchor)
Menggambar teks dalam str menggunakan
warna dan huruf yang tersedia. (x,y)
adalah koordinat titik anchor
public void drawSubstring(String str,
int offset, int len, int x, int y,int
anchor)
Sama seperti drawString, kecuali ini
hanya akan menggambar substring dari
offset (berbasis nol) dengan panjang
length.
public void drawChar(char character,
int x, int y, int anchor)
Menggambar karakter dengan warna dan
huruf yang tersedia
public void drawChars(char[] data, int
offset, int length, int x, int y, int
anchor)
Menggambar karakter dalam data array
karakter, dimulai dari indeks offset
dengan panjang length
Satu-satunya metode grafik untuk menggambar garis didefinisikan sebagai :
public void drawLine(int x1, int y1, int x2, int y2)
Metode ini menggambar sebuah garis menggunakan warna yang tersedia dan
coretan antara koordinat (x1,y1) dan (x2,y2).
Metode grafik untuk menggambar kotak adalah :
public void drawRect(int x, int y, int width, int height)
public void drawRoundRect(int x, int y, int width, int height, int arcWidth,
int arcHeight)
public void fillRect(int x, int y, int width, int height)
public void fillRoundRect(int x, int y, int width, int height, int arcWidth,
int arcHeight)
Metode drawRect() menggambar sebuah kotak dengan pojok kiri atas pada koordinat
(x,y) dan luas area (width+1 x height+1). Parameter yang sama ada bersama drawRoundRect().
Parameter tambahan arcWidth dan arcHeight adalah diameter horisontal dan vertikal dari busur
dari keempat sudut.
Jika Anda akan mengenali, definisi drawRect dan drawRoundRect menetapkan lebar
dari kotak yang digambar pada layar adalah dengan width+1 dan tingginya dengan height+1. Hal
ini sangat tidak intuitif, tetapi seperti itulah spesifikasi MIDP menggambarkan metode ini. Untuk
meng-agravate tidak konsistensi dari “off-byone” ini, metode fillRect dan fillRoundRect hanya
mengisi sebuah area kotak (width x height). Anda akan melihat ketidakcocokan ini jika anda
memasukkan parameter yang sama untuk drawRect dan fillRect (dan drawRoundRect vs
fillRoundRect). Sisi kanan dan bawah dari kotak digambar oleh kepalsuan drawRect di luar area
yang diisi oleh fillRect.
Metode untuk menggambar bundar atau eclips adalah :
public void drawArc(int x, int y,int
width, int height, int startAngle, int
arcAngle)
Menggambar arc dengan pusat pada (x,y)
dan dimensi (width+1 x height+1). Arc
digambar mulai dari startAngle dan
extend untuk derajat arcAngle. 0
derajat terletak pada jarum jam 3.
public void fillArc(int x, int y, int
width, int height, int startAngle, int
arcAngle)
Mewarnai bidang bundar dan eclips yang
telah dibuat dengan warna yang
tersedia.
Gambar digambar dengan metode drawImage()
public void drawImage(Image img, int x, int y, int anchor)
C. TUGAS
1. Buatlah program seperti di bawah ini!
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class TKJCanvasMIDlet extends MIDlet {
private Display display;
TKJCanvas canvas;
Command exitCommand = new Command("Exit", Command.EXIT, 0);
public void startApp() {
if (display == null){
canvas = new TKJCanvas(this, "TPL!!!");
display = Display.getDisplay(this);
}
display.setCurrent(canvas);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
protected void Quit(){
destroyApp(true);
notifyDestroyed();
}
}
class TKJCanvas extends Canvas implements CommandListener {
private Command exitCommand = new Command("Exit", Command.EXIT, 0);
private TKJCanvasMIDlet midlet;
private String text;
public TKJCanvas(TKJCanvasMIDlet midlet, String text) {
this.midlet = midlet;
this.text = text;
addCommand(exitCommand);
setCommandListener(this);
}
protected void paint(Graphics g) {
g.setColor(255, 255, 255 );
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(0, 0, 0);
g.drawString(text,getWidth()/2, getHeight()/2,
Graphics.TOP | Graphics.HCENTER);
}
public void commandAction(Command c, Displayable d) {
if (c == exitCommand){
midlet.Quit();
}
}
}
2. Buatlah program seperti di bawah ini!
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class CanvasExample extends MIDlet {
Canvas Canvasku;
public ContohCanvas() {
Canvasku = new CanvasKu();
}
public void startApp() {
Display display = Display.getDisplay(this);
display.setCurrent(Canvasku);
Canvasku.repaint();
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
class CanvasKu extends Canvas {
public void paint(Graphics g) {
g.setColor(0xffffff);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(0x000000); // make sure it is black
g.fillRect(x, y, 20, 20);
}
public void keyPressed(int keyCode) {
int gameAction = getGameAction(keyCode);
if(gameAction == RIGHT) {
x += dx;
} else if(gameAction == LEFT) {
x -= dx;
} else if(gameAction == UP) {
y -= dy;
} else if(gameAction == DOWN) {
y += dy;
}
repaint();
}
private int x = getWidth()/2 - 10;
private int y = getHeight()/2 - 10;
private int dx = 2;
private int dy = 2;
}
MODUL IV
AUDIO
A. TUJUAN
Modul ini bertujuan agar mahasiswa dapat menggunakan Mobile Media API 1.1
(MMAPI) untuk memanggil dan memainkan audio pada perangkat MIDP.
B. LANDASAN TEORI
Mobile Media API (MMAPI) memfasilitasi pembuatan nada, memaInkan serta merekam
audio dan video pada device yang cocok. Memainkan atau merekam sebuah media ditangani
oleh dua object : DataSource dan Player.
DataSource menangani detail cara mendapatkan data dari source yang tersedia. Source
dapat berasal dari file JAR atau jaringan (melalui protokol HTTP), record dari RMS, streaming
connection dari sebuah server atau sumber properietary lain. Player tidak perlu terlalu
mempermasalahkan darimana data berasal atau bagaimana cara mendapatkannya. Player hanya
perlu membaca data yang berasal dari DataSource, memproses, menampilkan dan memainkan
playback media pada output device.
Pihak ketiga dalam skenario ini adalah Manager. Manager membuat Player dari
DataSource. Manager memiliki method untuk membuat Player dari lokasi sumber media (URL),
DataSource dan InputStreams.
Anda dapat menjalankan query terhadap properties MMAPI melalui String
System.getProperty(String key).
Method Manager.createPlayer(String URI) memudahkan pembuatan sebuah Player yang
akan memainkan data dari URI. Anda juga dapat memainkan media yang berasal dari file JAR
dengan membuat Stream dari resource file dan meneruskannya pada method
Manager.createPlayer()
Memainkan sebuah nada cukup dilakukan dengan memanggil static method
Manager.playTone(int tone, int duration, int volume). Nilai yang valid untuk nada adalah antara
0 hingga 127. Durasi dalam memainkan nada diatur dalam ukuran millisecond. Parameter
volume memiliki jangkauan antara 0 hingga 100.
C. TUGAS
1. Buatlah program seperti di bawah ini!
import javax.microedition.lcdui.*;
import javax.microedition.media.*;
import javax.microedition.midlet.*;
public class J2MEAllTonesPlayer extends MIDlet implements CommandListener {
Form displayForm = new Form("Playing all tones");
StringItem info = new StringItem("", "");
Command exit = new Command("Exit", Command.EXIT, 1);
Thread runner;
boolean stop = false;
public void startApp() {
displayForm.append(info);
Display.getDisplay(this).setCurrent(displayForm);
displayForm.addCommand(exit);
displayForm.setCommandListener(this);
runner = new Thread(new TonePlayer(info, this));
runner.start();
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
if (runner != null)
stop = true;
}
public void commandAction(Command cmd, Displayable disp) {
destroyApp(true);
notifyDestroyed();
}
}
class TonePlayer implements Runnable {
StringItem info;
AllTonesPlayer midlet;
public TonePlayer(StringItem info, AllTonesPlayer midlet) {
this.info = info;
this.midlet = midlet;
}
public void run() {
try {
for (int i = 0; i < 128; i++) {
Thread.sleep(1000);
info.setText("Playing: " + i);
Manager.playTone(i, 500, 100);
if (midlet.stop)
break;
}
} catch (Exception me) {
System.err.println(me);
}
}
}
2. Buatlah program seperti di bawah ini!
import java.util.*;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import javax.microedition.media.*;
public class MediaMIDlet extends MIDlet
implements CommandListener, PlayerListener {
private Display display;
private List itemList;
private Form form;
private Command stopCommand;
private Command pauseCommand;
private Command startCommand;
private Hashtable items;
private Hashtable itemsInfo;
private Player player;
public MediaMIDlet() {
display = Display.getDisplay(this);
itemList = new List("Select an item to play", List.IMPLICIT);
stopCommand = new Command("Stop", Command.STOP, 1);
pauseCommand = new Command("Pause", Command.ITEM, 1);
startCommand = new Command("Start", Command.ITEM, 1);
form = new Form("Playing media");
form.addCommand(stopCommand);
form.addCommand(pauseCommand);
form.setCommandListener(this);
items = new Hashtable();
itemsInfo = new Hashtable();
//file *.wav dapat diubah
items.put("Siren from jar", "file://siren.wav");
itemsInfo.put("Siren from jar", "audio/x-wav");
}
public void startApp() {
for(Enumeration en = items.keys(); en.hasMoreElements();) {
itemList.append((String)en.nextElement(), null);
}
itemList.setCommandListener(this);
display.setCurrent(itemList);
}
public void pauseApp() {
try {
if(player != null) player.stop();
} catch(Exception e) {}
}
public void destroyApp(boolean unconditional) {
if(player != null) player.close(); // close the player
}
public void commandAction(Command command, Displayable disp) {
if(disp instanceof List) {
List list = ((List)disp);
String key = list.getString(list.getSelectedIndex());
try {
playMedia((String)items.get(key), key);
} catch (Exception e) {
System.err.println("Unable to play: " + e);
e.printStackTrace();
}
} else if(disp instanceof Form) {
try {
if(command == stopCommand) {
player.close();
display.setCurrent(itemList);
form.removeCommand(startCommand);
form.addCommand(pauseCommand);
} else if(command == pauseCommand) {
player.stop();
form.removeCommand(pauseCommand);
form.addCommand(startCommand);
} else if(command == startCommand) {
player.start();
form.removeCommand(startCommand);
form.addCommand(pauseCommand);
}
} catch(Exception e) {
System.err.println(e);
}
}
}
String file = locator.substring(
locator.indexOf("file://") + 6,
locator.length());
player = Manager.createPlayer(
getClass().getResourceAsStream(file), (String)itemsInfo.get(key));
player.addPlayerListener(this);
player.setLoopCount(-1);
player.prefetch();
player.realize();
player.start();
}
if(event.equals(PlayerListener.STARTED) &&
new Long(0L).equals((Long)eventData)) {
display.setCurrent(form);
} else if(event.equals(PlayerListener.CLOSED)) {
form.deleteAll();
}
}
}
Tambahkan list lagu pada aplikasi ini!
MODUL V
VIDEO
A. TUJUAN
Modul ini bertujuan agar mahasiswa dapat menggunakan Mobile Media API 1.1
(MMAPI) untuk memanggil dan memainkan video pada perangkat MIDP.
B. LANDASAN TEORI
Selain audio, video merupakan media primer yang harus dimainkan. Agar MediaMIDlet
dapat memainkan video, perubahan yang diperlukan yang harus dibuat adalah pada method
playerUpdate(), untuk membuat layar video.
Perubahan yang memungkinkan file video dimainkan dengan MediaMIDlet juga. Jika
method ditentukan memiliki VideoControl, hal tersebut ditunjukkan dengan membuat GUI untuk
itu. GUI tersebut kemudian ditambahkan padaform. Dan tentu saja, diperlukan file video
ditambahkan pada list shingga dapat dites.
Hal yang harus diingat adalah tidak semua mobile phones dapat memainkan semua file
video. Untuk melihat list video yang didukung oleh alat tersebut adalahdengan menggunakan
method Manager.getSupportedContentTypes(null).
C. TUGAS
1. Buatlah program seperti di bawah ini!
import java.io.InputStream;
import javax.microedition.lcdui.*;
import javax.microedition.media.*;
import javax.microedition.midlet.*;
public class VideoMIDlet extends MIDlet implements CommandListener, Runnable
{
private Display mDisplay;
private Form mMainScreen;
private Item mVideoItem;
private VideoControl mVidc;
private Command mPlayCommand;
private Player mPlayer = null;
public void startApp() {
mDisplay = Display.getDisplay(this);
if (mMainScreen == null) {
mMainScreen = new Form("Video MIDlet");
mMainScreen.addCommand(new Command("Exit", Command.EXIT, 0));
mPlayCommand = new Command("Play", Command.SCREEN, 0);
mMainScreen.addCommand(mPlayCommand);
mMainScreen.setCommandListener(this);
}
mDisplay.setCurrent(mMainScreen);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
if (mPlayer != null) {
mPlayer.close();
}
}
public void commandAction(Command c, Displayable s) {
if (c.getCommandType() == Command.EXIT) {
destroyApp(true);
notifyDestroyed();
} else {
Form waitForm = new Form("Loading...");
mDisplay.setCurrent(waitForm);
Thread t = new Thread(this);
t.start();
}
}
public void run() {
playFromResource();
}
private void playFromResource() {
try {
InputStream in = getClass().getResourceAsStream("/f.mpg");
mPlayer = Manager.createPlayer(in, "c");
// player.start();
mPlayer.realize();
if ((mVidc = (VideoControl) mPlayer.getControl("VideoControl")) != null
) {
mVideoItem = (Item) mVidc.initDisplayMode(VideoControl.USE_GUI_PRIMIT
IVE, null);
mMainScreen.append(mVideoItem);
}
mPlayer.start();
mMainScreen.removeCommand(mPlayCommand);
mDisplay.setCurrent(mMainScreen);
} catch (Exception e) {
showException(e);
return;
}
}
private void showException(Exception e) {
Alert a = new Alert("Exception", e.toString(), null, null);
a.setTimeout(Alert.FOREVER);
mDisplay.setCurrent(a, mMainScreen);
}
} Tambahkan list video pada aplikasi ini!