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 diextend 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 private private private private private private private
Form form; Gauge gauge; Spacer spacer; ImageItem imageItem; TextField txtField; DateField dateField; StringItem stringItem; 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 diextend 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) public void drawSubstring(String str, int offset, int len, int x, int y,int anchor) public void drawChar(char character, int x, int y, int anchor) public void drawChars(char[] data, int offset, int length, int x, int y, int anchor)
Menggambar teks dalam str menggunakan warna dan huruf yang tersedia. (x,y) adalah koordinat titik anchor Sama seperti drawString, kecuali ini hanya akan menggambar substring dari offset (berbasis nol) dengan panjang length. Menggambar karakter dengan warna dan huruf yang tersedia 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) public void fillArc(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. 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 == x -= dx; } else if(gameAction == y -= dy; } else if(gameAction == y += dy; }
{ LEFT) { UP) { DOWN) {
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!