Anda di halaman 1dari 100

PRAKTIKUM 1

PENGENALAN J2ME

A. TUJUAN
- Mengetahui dan memahami cara indentifikasi karakteristik dari mobile dan dapar
mendeskripsikan arsitektur dari J2ME
- Mengetahui ruang lingkup aplikasi mobile dengan J2ME

B. PERANGKAT LUNAK (SOFTWARE)


- JCreator
- Notepad
- Wireless Toolkit 2.5.2

C. DASAR TEORI

Java merupakan bahasa pemrograman yang diciptakan oleh James Gosling pada tahun
1996 dan mengklaim dirinya mengimplementasikan konsep PBO. Sampai saat ini pengembangan
Java berada dibawah Sun Microsystems walaupun akhirakhir ini Java mulai di opensourcekan.
Java dapat diimplementasikan pada berbagai aspek kehidupan mulai dari komputer mainframe,
PC, telepon genggam/HP, PDA, smart card sampai dengan perlengkapan rumah tangga seperti
mesin cuci dan TiVo. Java menjanjikan sifat platform independent yang berarti program cukup
ditulis satu kali dan decompile satu kali maka akan dapat dijalankan di mesin lain tanpa
memerlukan pengubahan kode.
Sampai saat ini Java terbagi menjadi empat kategori yaitu Java 2 Platform Standard
Edition (J2SE) untuk aplikasi desktop, Java 2 Platform Enterprise Edition (J2EE) untuk aplikasi
server kelas enterprise yang biasanya berskala besar, Java 2 Platform Micro Edition (J2ME)
untuk aplikasi pada perangkat yang memiliki tingkat komputasi tidak setinggi komputer,
misalnya telepon genggam, PDA dan TiVo, dan yang terakhir adalah Java Card yang digunakan
untuk pemrograman smart card berbasis Java.

Gambar I-1. Overview Teknologi Java

Sistem Nirkabel STMIK Potensi Utama 1


Java 2 Platform Micro Edition (J2ME) dibuat pertama kali oleh Sun Microsystems pada
tahun 1998. Tujuan awalnya adalah untuk menyelidiki kemungkinankemungkinan dijalankannya
Java pada perangkat dengan sumber daya terbatas. J2ME meningkatkan kapabilitas perangkat
mobile dari yang hanya berkemampuan melakukan komunikasi suara menjadi perangkat yang
mampu mengakses internet dan memiliki fungsionalitas lebih dinamis.

Gambar I-2. Arsitektur Umum Perangkat Pendukung J2ME

J2ME dibagi menjadi dua kategori berdasarkan kapabilitas dari produkproduk tempat
diimplementasikannya J2ME. Pembagian kategori ini dilakukan oleh Java Community Process
(JCP). Kategori pertama disebut HighEnd consumer devices. Kategori ini memiliki sumber daya
yang cukup besar hampir menyamai komputer dalam hal sumber daya listrik, memori maupun
bandwidth. Kategori ini diberi label Connected Device Configuration (CDC). Contoh produknya
adalah Internet TV.
Kategori kedua disebut LowEnd consumer devices. Kategori ini memiliki sumber daya
yang sangat kecil. Kategori ini diberi nama Connected, Limited Device Configuration (CLDC).
Contoh produknya adalah telepon genggam / HP dan twoway pager. Pada modul ini kategori
yang dibahas hanya CLDC pada perangkat telepon genggam/HP.
CLDC melingkupi perangkatperangkat dengan sumber daya terbatas. Sumber daya yang
dimaksud disini adalah memori, antarmuka pengguna, daya listrik dan kemampuan prosesor.
Karakteristik perangkat CLDC yaitu memori min. 192KB, 1632 bit prosesor, daya listrik yang
rendah dan koneksivitas jaringan yang tidak stabil.
Ada dua versi CLDC yaitu CLDC 1.0 dan 1.1. Vendor perangkat mobile yang
menentukan versi mana yang ingin diimplementasikan. Pada CLDC 1.1 dilakukan beberapa
upgrade dari versi sebelumnya 1.0 antara lain:
a. Fitur floating point
b. Persyaratan memori min. 192 KB
c. Fitur untuk weak reference
d. Fitur detil pada code verifier
e. Errorhandling yang lebih baik
f. Thread naming dan
g. InterruptionStandard
CLDC yang diperuntukkan untuk beberapa perangkat membuatnya kesulitan
mengeksploitasi kemampuan lebih yang dimiliki. Perangkat yang kurang begitu terfasilitasi
dengan standard CLDC ini antara lain telepon genggam/HP. Untuk memberikan kemampuan
mengeksploitasi kemampuan terpendam dari perangkat ini, HP, maka Sun Microsystems
mengeluarkan satu standard lagi yang diberi nama Mobile Information Device Profile (MIDP).
MIDP memungkinkan eksploitasi kemampuan pada perangkatperangkat CLDC yang
berbedabeda misalnya pada HP. Sampai saat ini ada tiga versi MIDP yang beredar luas dipasaran
yaitu versi 1.0, 2.0 dan versi 2.1. Upgrade pada MIDP 2.0 antara lain Advanced networking,

Sistem Nirkabel STMIK Potensi Utama 2


Form Enhancement, GAME API, RGB Images, Code signing dan Permission. MIDP 2.1 relatif
baru dan belum banyak dipergunakan.
Meskipun perangkat MIDP masuk dalam kategori CLDC tetapi MIDP mempunyai
karakteristik sendiri dibanding perangkat CLDC lainnya yaitu:
a. Memori (256 KB nonvolatile, 128KB volatile, 8 KB persistent data)
b. Layar tampilan/Display (96x54 pix, Display depth 1 bit, Pixel shape ratio = 1:1)
c. Input (One/Two handed keyboard, touch screen/stylus)
d. Networking (Twoway, nirkabel, bandwidth terbatas/intermittent)
e. Multimedia (memiliki kemampuan untuk menjalankan tones)

Gambar I-3. Arsitektur Umum Configuration dan Profile J2ME

Gambar I4 Arsitektur Implementasi J2ME pada Perangkat Mobile

Aplikasi yang dibuat dengan menggunakan J2ME dengan standar MIDP disebut MIDlet.
Kumpulan dari beberapa MIDlet disebut MIDlet Suite. Untuk membuat MIDlet diperlukan satu
kelas yang menjadi turunan dari kelas java.microedition.midlet.MIDlet. MIDlet mempunyai
siklus hidup/life cycle. Suatu MIDlet setelah diciptakan akan berada di salah satu status (active,
paused, destroyed). Begitu obyek suatu MIDlet diciptakan akan memasuki status paused
menunggu perintah berikutnya. MIDlet memasuki status active ketika setelah method startApp()
dipanggil. MIDlet akan kembali ke status pause jika method pauseApp() dipanggil. Setelah
semua proses di dalam MIDlet selesai dilakukan dan MIDlet dimatikan maka MIDlet berada
dalam status destroyed. Status destroyed ini dimasuki MIDlet pada pemanggilan method
destroyApp(boolean).

Sistem Nirkabel STMIK Potensi Utama 3


Gambar I5 Siklus Hidup (Life Cycle) MIDlet

D. PRAKTIKUM
Membuat Project Baru
Project merupakan kerangka dasar aplikasi yang sangat menentukan jenis aplikasi yang akan
dibuat. Untuk memulai pembuatan project, ikuti langkah-langkah berikut:
1. Jalankan aplikasi Wireless Toolkit 2.5.2.

2. Klik menu File > New Project, atau melalui ikon New Project, atau melalui kombinasi
tombol Ctrl+N.

3. Pada kotak dialog New Project, di Project Name ketikkan nama project, dan pada MIDlet
Class Name juga ketikkan MIDlet Classnya, kemudian klik Create Project.
4. Jalankan JCreator atau Notepad. Ketikkan coding di bawah ini :

Sistem Nirkabel STMIK Potensi Utama 4


Sistem Nirkabel STMIK Potensi Utama 5
5. Jalankan pada emulator pada Wireless Toolkit 2.5.2.

Sistem Nirkabel STMIK Potensi Utama 6


PRAKTIKUM 2
LINGKUNGAN PEMROGRAMAN J2ME

A. TUJUAN
- Mengetahui dan mampu menciptakan MIDlet sederhana dan menjalankan MIDlet di
emulator
- Mampu menciptakan MIDlet sederhana dan menciptakan project di netbeans serta
menjalankan MIDlet di Emulator

B. PERANGKAT LUNAK (SOFTWARE)


- JCreator
- Notepad
- Wireless Toolkit 2.5.2
- Netbeans Mobility Pack

C. DASAR TEORI

Pada subbab ini akan kita tunjukkan salah satu aplikasi J2ME yang sangat sederhana.
Meneruskan tradisi belajar bahasa pemrograman, kita akan membuat program yang menampilkan
tulisan Hello World dengan J2ME. Berikut akan ditampilkan kode dari aplikasi Hello World
beserta tampilannya dalam emulator WTK. Selanjutnya akan diberikan penjelasan mengenai
kode program Hello World.
Pada aplikasi diatas kita gunakan perangkat pengembangan WTK dari Sun
Microsystems. Aplikasi Hello World sangat sederhana sehingga dapat di install di berbagai
perangkat mobile tanpa ada masalah yang berarti dan tanpa penyesuaian. Hal ini kemungkinan
tidak berlaku jika aplikasi J2ME yang dibuat adalah aplikasi besar, kompleks dan menggunakan
fiturfitur tertentu.
Aplikasi Hello World terdiri dari satu kelas yang bernama HelloWorld. Karena kita
bertujuan membuat MIDlet maka kelas tersebut harus merupakan turunan dari
javax.microedition.midlet.MIDlet. HelloWorld harus mengimplementasikan tiga method dari
orang tuanya yaitu startApp(), pauseApp() dan destroyApp(). Untuk menangani interaksi dengan
pengguna aplikasi ini dilengkapi dengan satu obyek Command bernama exitCommand.
HelloWorld juga mengimplementasikan interface bernama ComandListener. CommandListener
ini berisi satu method bernama commandAction() yang berisi perintah respon jika suatu obyek
Command dieksekusi dalam hal ini obyek Command tersebut adalah exitCommand dan
responnya adalah untuk menutup aplikasi MIDlet Hello World.
Bila diperhatikan method startApp() yang merupakan entry point dari semua aplikasi
MIDlet tidak berisi kode. Hal ini dikarenakan secara otomatis konstruktor HelloWorld pasti
dipanggil pertama kali dan di dalamnya sudah terdapt kode untuk mengatur obyekobyek yang
diperlukan dan menampilkannya.

D. PRAKTIKUM

Menggunakan NetBeans Mobility Pack

Seperti yang telah dijelaskan pada awal bab ini tentang hal yang diperlukan, NetBeans 4.1 dan
NetBeans Mobility Pack harus sudah terinstall di komputer Anda.

Sistem Nirkabel STMIK Potensi Utama 7


Langkah 1: Membuat Project Baru

Gambar II-1. New Project

Langkah 2: Memilih Kategori "Mobile"

Gambar II-2. Memilih Kategori Mobile

Sistem Nirkabel STMIK Potensi Utama 8


Langkah 3: Memilih "Mobile Application"

Gambar II-3. Memilih Kategori Mobile

Langkah 4: Beri nama project dan tentukan lokasinya


(Hilangkan tanda pada "Create Hello MIDlet", kita akan membuat MIDlet kita sendiri nantinya)

Gambar II-4. Memilih Kategori Mobile

Langkah 5: Memilih Platform (optional)

Gambar II-5. Memilih Platform

Sistem Nirkabel STMIK Potensi Utama 9


Gambar II-6. Mobile Project Yang Baru Dibuat (Netbeans Mobility Pack)

Langkah 6: Membuat sebuah MIDlet baru

Gambar II-7. Membuat Midlet Baru

Sistem Nirkabel STMIK Potensi Utama 10


Langkah 7: Memilih MIDP "Category" dan MIDlet "File Type"

Gambar II-8. Memilih MIDP "Category" dan MIDlet "File Type"

Langkah 8: Memberi nama MIDlet

Gambar II-9. Memberi Nama MIDlet

Sistem Nirkabel STMIK Potensi Utama 11


Langkah 9:

Gambar II-10. Membuat Midlet Secara Otomatis Membuat Method Midlet yang Diperlukan

Langkah 10: Mengganti Code yang Dibuat Secara Otomatis dengan Code Program Kita.

Gambar II-11. Mengganti Code Yang Dibuat Secara Otomatis dengan Code Program Kita.

Sistem Nirkabel STMIK Potensi Utama 12


Langkah 11: Mengcompile dan Menjalankan (Run) MIDlet di Emulator

Langkah 12: Menjalankan Midlet Kita di Emulator

Sistem Nirkabel STMIK Potensi Utama 13


Gambar II-12. Menjalankan MIDlet kita di Emulator

Gambar II-13. Hello World MIDlet

Sistem Nirkabel STMIK Potensi Utama 14


PRAKTIKUM 3
PENDEFINISIAN CLASS DAN FUNGSI DALAM J2ME

A. TUJUAN
- Mengetahui penggunaan High Level dan Low Level User Interface classes
- Mengetahui keuntungan dan kerugian menggunakan High Level dan Low Level User
Interface

B. PERANGKAT LUNAK (SOFTWARE)


- JCreator
- Notepad
- Wireless Toolkit 2.5.2

C. DASAR TEORI

J2ME, dalam MIDP, seperti halnya kategori java lainnya (J2SE) mendefinisikan
serangkaian library untuk membuat tampilan antarmuka penguna/user interface. Pada MIDP
terdapat dua jenis library antarmuka pengguna yaitu:
a. Antarmuka tingkat atas/Highlevel User Interface
b. Antarmuka tingkat bawah/Lowlevel interface
Antarmuka tingkat atas terdiri dari komponenkomponen yang telah terdefinisi/well
defined dan siap langsung digunakan dalam MIDlet. Komponen ini mampu merespon input dari
pengguna langsung tanpa penambahan kode. Semua komponenkomponen yang berada pada
tingkat atas ini merupakan turunan dari sebuah kelas yang bernama Screen. Pada bab ini khusus
dibahas antarmuka tingkat atas ini.
Antarmuka tingkat bawah menyediakan kendali lebih dalam pembentukan komponen
baik tampilan maupun interaksinya. Antarmuka jenis ini biasanya digunakan untuk pembuatan
antarmuka pengguna grafis/graphical user interface pada aplikasi game maupun aplikasiaplikasi
lain yang memerlukan komponen antarmuka yang tidak terdapat pada antarmuka pengguna
tingkat atas. Antarmuka tingkat ini direpresentasikan oleh Canvas dan turunannya yaitu
GameCanvas.
Berikut kelas pada antarmuka tingkat atas :
1. Display, Displayable dan Ticker
Display adalah representasi dari layar tampilan perangkat bergerak. Display ini tidak dapat
diciptakan dan hanya ada satu (singleton). Obyek Displayable adalah sebuah obyek yang
dapat tampil pada obyek Display sendirian tanpa kehadiran obyek lagi. Turunan Displayable
ini ada dua yaitu Screen dan Canvas. Screen dan turunannya masuk ke dalam antarmuka
tingkat atas. Ticker adalah sebuah baris dari text yang dapat discrolling secara terus-menerus
pada display.
2. Item dan Form
Item adalah komponen antarmuka tingkat atas yang bukan merupakan turunan Displayable.
Item ini mempunyai sifat tidak dapat berdiri sendiri tanpa kehadiran komponen antarmuka
tingkat tinggi lain yaitu Form. Agar Item dapat digunakan, obyek Item harus berada di dalam
Form. Secara teknis yang dimasukkan ke dalam Form bukan obyek/instance dari Item tapi
obyek/instance dari kelas turunan Item. Kelaskelas turunan Item adalah StringItem,
ImageItem, TextField, Datefield, Gauge, ChoiceGroup, Spacer dan CustomItem. Masing
masing turunan Item ini memiliki atribut ukuran dan layout masingmasing.

Sistem Nirkabel STMIK Potensi Utama 15


Form adalah komponen turunan Screen yang berfungsi sebagai tempat untuk menampung
(container) bagi komponen lain. Fungsi Form pada J2ME sama seperti Form pada HTML.
Form selain memiliki obyek Item biasanya juga mempunyai obyek Command. Fungsi
Command pada Form ini juga sama dengan fungsi Button pada Form di HTML. Command
berfungsi sebagai trigger untuk memulai suatu proses. Form juga dapat memasukkan String
ataupun Image. Dalam hal ini obyekobyek tersebut dibungkus menjadi Obyek turunan Item
terlebih dahulu.
3. TextField
TextField adalah komponen turunan Item yang menampung teks dan mengedit teks tersebut.
TextField mempunyai ukuran maksimum, label dan format input. Beberapa vendor
mengimplementasikan TextField sehingga ukuran TextField dapat secara otomatis membesar
sesuai dengan input string yang dimasukkan. Berapa jumlah baris dan kolom yang
ditampilkan TextField menjadi tanggung jawab dari vendor perangkat bergerak dalam
pengimplementasiannya. Ada komponen lain selain TextField di antarmuka tingkat atas yang
mempunyai fungsi sama dengan TextField yaitu TextBox. TextBox merupakan turunan
Screen dan buka turunan Item. Perbedaan antara TextField dan TextBox terletak pada jumlah
maksimum karakter, multiline dan format input.
Masukan/input pada TextField dapat di format sesuai kebutuhan. Ada enam jenis format yang
dikenali oleh TextField yaitu ANY, EMAILADDR, NUMERIC, PHONENUMBER, URL
dan DECIMAL. Semua format input diatas merupakan konstanta static dari class TextField.
Untuk format EMAILADDR, PHONENUMBER dan URL dapat mendapatkan perlakuan
khusus tergantung implementasi vendor. Perlakukan khusus ini antara lain kelebihan untuk
melakukan lookup atau melihat ke dalam phonebook perangkat mobile untuk memasukkan
nomor telpon, email ataupun alamat URL.
4. StringItem
StringItem merupakan komponen untuk menampilkan tulisan pada layar. StringItem ini
membungkus obyek String supaya dapat diperlakukan sama dengan turunan obyek Item yang
lainnya. Obyek String sendiri dapat langsung dimasukkan ke dalam Form dengan method int
append(String) tapi yang terjadi sebenarnya adalah obyek tersebut dibungkus dengan
menggunakan StringItem. Jika beberapa obyek StringItem dimasukkan ke dalam Form secara
berurutan maka semua obyek tersebut akan di gabungkan/konkatenasi.
Ada tiga jenis tampilan dari StringItem yaitu PLAIN, BUTTON dan HYPERLINK. Secara
default suatu obyek StringItem memiliki penampilan PLAIN. Jika menggunakan jenis
BUTTON atau HYPERLINK maka perlu didefinisikan juga obyek Command yang akan
merespon user jika menekan StringItem tersebut. Perbedaan antara BUTTON dan
HYPERLINK terletak pada tampilannya. Dengan menggunakan BUTTON akan tiampilkan
StringItem dengan tampilan seperti tombol sedangkan HYPERLINK akan menampilkan
StringItem seperti link pada web. Obyek Command yang didefinisikan diatas dapat menjadi
aksesibel pada keseluruhan Form ataupun hanya pada StringItem yang memakainya.
5. ImageItem
ImageItem seperti halnya StringItem merupakan pembungkus untuk obyek lain. Dalam hal
ini adalah Image. Gambar dapat dimasukkan ke dalam Form dalam bentuk Image langsung
maupun dibungkus dengan menggunakan ImageItem. Konsep penambahan Image pada Form
juga sama seperti penambahan String pada Form. Secara default ImageItem akan
ditempatkan di sebelah StringItem atau ImageItem yang telah berada sebelumnya, Jika
tempat untuk ImageItem tersebut tidak cukup maka akan dimasukkan kedalam baris baru.

Sistem Nirkabel STMIK Potensi Utama 16


6. DateField
DateField merupakan komponen untuk memilih dan menampilkan tanggal atau waktu pada
antarmuka J2ME. Tampilan komponen ini berbedabeda untuk masingmasing perangkat.
DateField dapat diatur apakah digunakan untuk menampilkan informasi tanggal, waktu atau
keduanya dengan memilih tipe DATE, TIME atau DATE_TIME pada saat pembentukan
obyek DateField. Pembentukan tanggal atau waktu pada DateField dapat menggaunakan
obyek dari java.util.Date.
7. ChoiceGroup
ChoiceGroup menampilkan daftar elemen yang dapat dipilih di dalam Form seperti halnya
List. ChoiceGroup memungkinkan memilih satu atau lebih dari satu elemen yang terdapat
dalam daftarnya. Sama seperti List, ChoiceGroup juga memungkinkan setiap elemen yang
ditampilkan berasosiasi dengan gambar tertentu. Sering kali ChoiceGroup ini diasosiasikan
dengan RadioButton atau CheckBox.
8. CustomItem
CustomItem memungkinkan terbentuknya komponen baru yang dapat dimasukkan ke dalam
Form. CustomItem dapat menerima respon dari user menggunakan ItemStateListener.
CustomItem adalah kelas abstract karena itu untuk membuat komponen baru kita perlu
membentuk kelas yang merupakan turunan dari CustomItem. CustomItem mempunyai sifat
sifat yang mirip dengan Canvas, akan diterangkan di bab berikutnya, tetapi mempunyai
kelebihan dapat dimasukkan ke dalam Form.
9. List
List fungsinya adalah menampilkan daftar pilihan pada layar. Masingmasing elemen yang
ditampilkan direpresentasikan oleh String dan dapat pula ditambahkan dengan
gambar/Image. Setiap elemen yang ditampilkan dalam List dapat dipilih dan List akan
bereaksi terhadap pilihan user karena memiliki CommandListener.
10. TextBox
TextBox adalah turunan Screen yang memungkinkan user memasukkan atau mengedit teks.
TextBox minimal harus memiliki satu Command untuk menentukan cara memproses input
dari user. Ada suatu vendor perangkat mobile yang menyediakan secara otomatis satu
Command. Tetapi akan lebih baik jika pengembang perangkat lunak sendiri yang
menyediakannya. Cara input user ke dalam perangkat yang beraneka ragam mulai dari input
dari tombol sampai menggunakan connector pen baik memakai prediktif maupun non
prediktif mode.
11. Alert
Alert merupakan komponen yang mirip fungsinya seperti dialog box pada J2SE. Alert
digunakan untuk menampilkan informasi terkati suatu kondisi apakah itu error, konfirmasi
maupun kondisikondisi lain yang perlu diberitahukan kepada user.

D. PRAKTIKUM

Latihan 1

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class MyChoiceGroup extends MIDlet implements CommandListener{

private Display display = null;

Sistem Nirkabel STMIK Potensi Utama 17


private Form form = null;
private Command exit = new Command("Exit",Command.EXIT,1);
private ChoiceGroup cg_exclusive = null,cg_multiple = null,cg_popup = null;

public MyChoiceGroup()
{
form = new Form("My Choice Group");
String [] elements = {"Choice 1","Choice 2","Choice 3"};
cg_exclusive = new ChoiceGroup("Exclusive",ChoiceGroup.EXCLUSIVE,elements,null);
form.append(cg_exclusive);
cg_multiple = new ChoiceGroup("Multiple",ChoiceGroup.MULTIPLE,elements,null);
form.append(cg_multiple);
cg_popup = new ChoiceGroup("Popup",ChoiceGroup.POPUP,elements,null);
form.append(cg_popup);
form.addCommand(exit);
form.setCommandListener(this);
}

public void startApp() {


if(display == null)
{
display = Display.getDisplay(this);
display.setCurrent(form);
}
}

public void pauseApp() {


}

public void destroyApp(boolean unconditional) {


}

public void commandAction(Command c,Displayable d)


{
if(c == exit)
{
notifyDestroyed();
destroyApp(true);
}
}
}

Latihan 2

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

Sistem Nirkabel STMIK Potensi Utama 18


public class List extends MIDlet
implements CommandListener
{
private Display layar;
private List daftar;
private Command pilihan;
private Command kembali;

public List ()
{

layar = Display.getDisplay(this);
}
public void startApp()
{
daftar = new List("Jenis kartu SIM", Choice.EXCLUSIVE);
daftar.append("Kartu Simpati", null);
daftar.append("Kartu IM3",null);
daftar.append("Kartu XL", null);

pilihan = new Command("pilihan", Command.SCREEN,2);


kembali = new Command("kembali", Command.EXIT,1);
daftar.addCommand(pilihan);
daftar.addCommand(kembali);
daftar.setCommandListener(this);

layar.setCurrent(daftar);
}

public void pauseApp()


{

}
public void destroyApp(boolean unconditional)
{

}
public void commandAction(Command perintah, Displayable s)
{

if(perintah == kembali)
{
destroyApp(false);

notifyDestroyed();
}
if(perintah == pilihan)
{
int pilihanpengguna = daftar.getSelectedIndex();

Sistem Nirkabel STMIK Potensi Utama 19


Alert info = new Alert("Informasi Kartu Anda");
info.setString("kartu anda ternyata adalah " + daftar.getString(pilihanpengguna));
info.setTimeout(Alert.FOREVER);
layar.setCurrent(info, daftar);
}

}
}

Latihan 3

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class TickerDemo extends MIDlet
implements CommandListener{

Form satu, dua,tiga;


Display display;
ImageItem imageItem;
Image image1;
Command keluarCmd = new Command ("Keluar",Command.EXIT,1);
Command loginCmd = new Command ("Login",Command.OK,2);
Command ProsesCmd = new Command ("Proses",Command.OK,2);
Command kembaliCmd = new Command ("Kembali",Command.BACK,2);
TextField nama,pass;

public void startApp() {


Ticker t = new Ticker ("Belajar Ticker di J2ME");
satu = new Form( "Form Satu",new Item[] { getImageItem() } );
satu.addCommand(keluarCmd);
satu.addCommand(loginCmd);
satu.setCommandListener(this);
satu.setTicker(t);
Display.getDisplay(this).setCurrent( satu );
}
public void pauseApp() {
}
public void destroyApp( boolean unconditional ) {
}

public ImageItem getImageItem()


{
if (imageItem == null)
{
imageItem = new ImageItem("contoh gambar", getImage1(), ImageItem.LAYOUT_DEFAULT,
"<Missing Image>");
}
return imageItem;

Sistem Nirkabel STMIK Potensi Utama 20


}
public Image getImage1() {
if (image1 == null) {
try {
image1 = Image.createImage("/info.png");
} catch (java.io.IOException e) {
//e.printStackTrace();
}
} return image1;
}

public void awal() {Display.getDisplay(this).setCurrent( satu );


}
public void keluar() { notifyDestroyed();
}
public void login() {
nama = new TextField ("Nama : ","", 15, TextField.ANY);
pass = new TextField ("Password : ","", 15, TextField.PASSWORD);
dua = new Form ( "Form Login" );
dua.append (nama);
dua.append (pass);
dua.addCommand(kembaliCmd);
dua.addCommand(ProsesCmd);
dua.setCommandListener(this);
Display.getDisplay(this).setCurrent(dua);
}

public void proses() { String dtnama = nama.getString();


String dtpass = pass.getString();
tiga = new Form ( "Form Sukses");
tiga.append ("data yang dimasuki adalah\n");
tiga.append ("nama anda adalah : " + dtnama+"\n");
tiga.append ("password anda adalah : "+ dtpass);
tiga.addCommand(keluarCmd);
tiga.setCommandListener(this);
Display.getDisplay(this).setCurrent(tiga);
}
public void commandAction(Command c, Displayable s) {
String data = c.getLabel();
if (data == "Keluar") {
keluar();} else if (data == "Login") {
login();} else if (data == "Proses") {
proses();} else if (data == "Kembali") {
awal();}}
}

Sistem Nirkabel STMIK Potensi Utama 21


Latihan 4

FirstDateField.java

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class FirstDateField extends MIDlet {


Display display;
FirstDateFieldForm form;

public FirstDateField() {
display = Display.getDisplay(this);
}

public void startApp() {


form = new FirstDateFieldForm(this, display);
display.setCurrent(form);
}

public void pauseApp() {


}

public void destroyApp(boolean unconditional) {


}

public void exitMIDlet() {


destroyApp(false);
notifyDestroyed();
}
};

FirstDateFieldForm.java

import javax.microedition.lcdui.*;

class FirstDateFieldForm
extends Form
implements CommandListener
{
private Display display;
private Command cmExit;
private FirstDateField midlet;

Sistem Nirkabel STMIK Potensi Utama 22


private DateField dfDate, dfTime, dfDTime;

public FirstDateFieldForm(FirstDateField midlet, Display display) {


super("First DateField");
this.display = display;
this.midlet = midlet;

dfDate = new DateField("Tanggal", DateField.DATE);


append(dfDate);

dfTime = new DateField("Waktu", DateField.TIME);


append(dfTime);

dfDTime = new DateField("Tanggal dan Waktu", DateField.DATE_TIME);


append(dfDTime);

cmExit = new Command("Keluar", Command.EXIT, 1);


addCommand(cmExit);

setCommandListener(this);
}

public void commandAction(Command c, Displayable s){


if (c == cmExit) {
midlet.exitMIDlet();
}
}
}

Sistem Nirkabel STMIK Potensi Utama 23


PRAKTIKUM 4
INSTRUKSI INSTRUKSI DASAR J2ME

A. TUJUAN
- Mengetahui dan memahami even handling level rendah dalam MIDP
- Dapat menggambar dan menampilkan teks, gambar, garis, kotak, dan sudut

B. PERANGKAT LUNAK (SOFTWARE)


- JCreator
- Notepad
- Wireless Toolkit 2.5.2

C. DASAR TEORI
Untuk membuat sebuah tampilan dengan kreasi sendiri, pengembang membutuhkan
pengetahuan dasar tentang Canvas. Canvas menyediakan media untuk menciptakan tampilan
yang sesuai dengan keperluan aplikasi atau keinginan pengguna. Media ini mendukung
kapabilitas di dalam membuat beragam bentuk, teks, dan gambar (statis atau animasi), yang pada
dasarnya merupakan kemampuan obyek Graphics.
Canvas memiliki kemampuan berinteraksi dengan pengguna melalui mekanisme event
handling. Event handling ini dapat berupa antisipasi terhadap key event, game action dan pointer
event. Perangkat komunikasi, telepon seluler ataupun PDA, memiliki resolusi tampilan yang
sangat beragam. Untuk mengetahui dimensi Canvas terkait dengan tampilan perangkat mobile,
disediakan method getWidth() dan getHeight(). MIDP 2.0 menyediakan fungsionalitas full screen
mode. Tetapi tidak semua perangkat mobile mendukung hal ini. Setting mode ini dapat dilakukan
dengan memanggil setFullScreenMode(boolean).

D. PRAKTIKUM

Latihan 1
Buatlah project game dengan mengetikkan coding ini menjadi satu project, tempatkan seluruh
file pada folder src.

MyCanvas.java

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class MyCanvas extends MIDlet implements CommandListener {

private Display display=null;


private scrCanvas scrCanvasObj=null;
private Command exit=new Command("Exit",Command.EXIT,1);
private Command preview=new Command("Preview",Command.OK,1);

Sistem Nirkabel STMIK Potensi Utama 24


public MyCanvas()
{
scrCanvasObj = new scrCanvas();
scrCanvasObj.addCommand(exit);
scrCanvasObj.addCommand(preview);
scrCanvasObj.setCommandListener(this);
}
public void startApp() {
if(display == null)
{
display=Display.getDisplay(this);
display.setCurrent(scrCanvasObj);
}
}

public void pauseApp() {


}

public void destroyApp(boolean unconditional) {


}

public void commandAction(Command c, Displayable d) {


if(c == exit)
{
notifyDestroyed();
destroyApp(true);
}
else if(c == preview)
{
scrCanvasObj.setFullScreenMode(true);
}
}
}

scrCanvas.java

import javax.microedition.lcdui.*;

public class scrCanvas extends Canvas implements Runnable{


private int x=0,y=0;
private int ax=1,ay=1;

private scrCanvas()
{
Thread thread=new Thread(this);
thread.start();
}

Sistem Nirkabel STMIK Potensi Utama 25


private void backgroundHitam(Graphics g)
{
g.setColor(0x000000);
g.fillRect(0, 0, this.getWidth(),this.getHeight());
}
private void kotak(Graphics g)
{
g.setColor(0xff0000);
g.fillRect(x, y, 25, 25);
}
private void tulisString(Graphics g)
{
g.setColor(0x00ff00);
g.drawString("Contoh Canvas", 1, 1,Graphics.LEFT | Graphics.TOP);
}
private void rubahPosisiKotak()
{
x=x+ax;
y+=1;
if(x<=0 || x+25 >= this.getWidth())
ax=ax*-1;
if(y<=0 || y+25 >= this.getHeight())
ay*=-1;
}

protected void paint(Graphics g) {


backgroundHitam(g);
tulisString(g);
kotak(g);
}

public void run() {


while(true)
{
repaint();
rubahPosisiKotak();
try
{
Thread.sleep(5);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}

Sistem Nirkabel STMIK Potensi Utama 26


PRAKTIKUM 5
INSTRUKSI PEMILIHAN DAN PENGULANGAN J2ME

A. TUJUAN
- Mengetahui bagaimana menggunakan GAME API serta menggambar grafik berskala.
- Mengetahui & memahami bagaimana menggunakan GAME API serta menggambar grafik
berskala

B. PERANGKAT LUNAK (SOFTWARE)


- JCreator
- Notepad
- Wireless Toolkit 2.5.2

C. DASAR TEORI
Aplikasi games memiliki peranan utama pada aplikasi mobile. Sebagian besar aplikasi
dibuat pada pangsa pasar mobile adalah games. Action, strategy, board and card games dan
sebagainya, seluruhnya terdapat pada aplikasi mobile.
Sebagian besar produsen game telah membuat API tersendiri untuk berbagai fungsi
bermain game yang hanya akan bekerja pada handset yang dibuat oleh perusahaan tersebut. Hal
ini berarti bahwa sebuah game yang dibangun menggunakan API dari salah satu produsen tidak
akan berjalan pada device hasil produksi dari produsen lain.
Untuk menjembatani perbedaan ini, MIDP versi 2 telah memiliki fungsionalitas dasar
yang secara spesifik ditujukan aplikasi game. Class utama Game API dari MIDP adalah class
GameCanvas. Class GameCanvas merupakan perluasan dari class Canvas yang kita gunakan
dalam pembuatan low level user interface. Dua kelemahan utama dari class Canvas dalam
pemrograman game adalah tidak memadainya kemampuan untuk mengatur proses repaint dan
ketidakmampuan untuk mengatur bagaimana pointer events serta quick keys diteruskan pada
canvas.
Komponen user interface dari MIDP umumnya berupa event driven. Events berupa
antrian berurutan dan diteruskan terhadap aplikasi satu persatu, beserta tunda waktu antar waktu
dimana event dibuat (key press).
GameCanvas memungkinkan aplikasi mengumpulkan events yang terbuat dan melakukan
proses repaint pada canvas dengan cepat. Struktur program menjadi lebih bersih karena terdapat
rangkaian perulangan utama dimana proses painting dan pengumpulan events dilakukan.
GameCanvas menggunakan teknik double buffering. Seluruh proses pembuatan interface
dilakukan di off-screen buffer, kemudian di transfer dari area buffer tersebut menuju area yang
terlihat pada canvas. Aplikasi anda harus menggunakan instance method dari class Graphics
berupa method getGraphics(). Setiap pemanggilan terhadap method ini mengembalikan sebuah
instance baru dari offscreen buffer yang anda gunakan dalam proses pembuatan user interface.
Untuk memperbaharui screen tersebut, anda harus memanggil flushGraphics() untuk
melakukan proses repaint secara cepat dengan isi dari off-screen buffer. Perhatikan bahwa anda
hanya perlu memanggil method getGraphics() sekali saja, karena sebuah buffer teralokasi setiap
kali anda memanggil method ini.

Sistem Nirkabel STMIK Potensi Utama 27


D. PRAKTIKUM

MyCanvas.java :

GameMidlet.java:

Sistem Nirkabel STMIK Potensi Utama 28


PRAKTIKUM 6
PRE DEFINED CLASS DAN FUNGSI DALAM J2ME

A. TUJUAN
- Mengetahui mengenai konsep dari Record Store
- Mengetahui & memahami pemanggilan record satu persatu dengan menggunakan
RecordEnumerate dan membuat sebuah record comparator

B. PERANGKAT LUNAK (SOFTWARE)


- JCreator
- Notepad
- Wireless Toolkit 2.5.2

C. DASAR TEORI
1) RecordStore
Kelas RecordStore pada RMS berfungsi menyediakan fitur untuk menyimpan,
mengupdate, mengambil dan menghapus data pada perangkat mobile. Kelas RecordStore
merepresentasikan sebuah lokasi penyimpanan data permanen. Satu RecordStore dapat
digunakan oleh lebih dari satu MIDlet baik pada saat bersamaan maupun terpisah. Berdasarkan
spesifikasi MIDP, vendor perangkat mobile bertanggung jawab pada pemeliharaan integritas
obyek RecordStore.
Antar MIDlet dapat berbagi RecordStore. Pada versi MIDP lama, sebelum MIDP 2.0,
MIDlet hanya dapat mengakses obyek RecordStore selama MIDlet tersebut adalah pemilik obyek
RecordStore atau masih dalam satu MIDlet suite dengan MIDlet pemilik obyek RecordStore.
Pada MIDP 2.0 terdapat fitur baru di mana RecordStore dapat dibagi dengan MIDlet lain dari
MIDlet suite yang berbeda dengan MIDlet pemilik RecordStore. Gambar IV1 mengilustrasikan
dua MIDlet suite berbagi RecordStore.

Sistem Nirkabel STMIK Potensi Utama 29


Gambar VI-1. Hubungan antara MIDlet dengan suatu RecordStore

Dalam kelas RecordStore didefinisikan tiga static method untuk membuat dan membuka
obyek RecordStore. Methodmethod tersebut adalah sebagai berikut:
a. static RecordStore openRecordStore(String recordStoreName, boolean createIfNecessary)
b. static RecordStore openRecordStore(String recordStoreName, boolean createIfNecessary, int
authMode, boolean writable)
c. static RecordStore openRecordStore(String recordStoreName, String vendorName, String
suiteName)
Masingmasing method diatas memiliki kegunaan sendirisendiri. Method pertama
merupakan method untuk membuka dan membuat RecordStore yang dibuat oleh MIDlet itu
sendiri atau MIDlet lain yang masih dalam satu MIDlet suite. Method kedua merupakan method
untuk membuat dan mengakses RecordStore yang shared antar MIDlet suite. Method ketiga
khusus digunakan untuk mengakses RecordStore yang shared antar MIDlet suite. Pemanggilan
method openRecordStore() dapat menimbulkan exception dikarenakan beberapa hal seperti
kapasitas memori perangkat mobile yang sudah penuh (RecordStoreFullException) ataupun
internal error (RecordStoreException).
Mekanisme dari method pertama ketika dipanggil adalah mencari RecordStore dengan
nama sesuai dengan parameter recordStoreName yang dimasukkan. Jika RecordStore dengan
nama tersebut ditemukan maka RecordStore itu akan dibuka. Jika tidak terdapat RecordStore
dengan nama tersebut maka akan dilihat nilai dari parameter createIfNecessary yang diberikan.
Jika nilainya true maka akan dibuat sebuah RecordStore baru dengan nama seperti pada
parameter recordStoreName. Jika nilainya false maka tidak akan dibuat RecordStore baru.
Pemberian nama untuk RecordStore harus memenuhi persyaratan sebagai berikut:
a. Panjang sebuah nama 32 Unicode character
b. Nama harus memperhatikan huruf kapital dan huruf non kapital (case sensitive)
c. Nama harus unik di dalam sebuah MIDlet suite
Method kedua digunakan untuk membuka (mungkin juga menciptakan) RecordStore
yang dapat diakses oleh MIDlet baik dalam MIDlet suite yang sama ataupun MIDlet suite yang
berbeda. RecordStore yang tercipta dari pemanggilan method ini menjadi milik MIDlet suite
yang menciptakannya meskipun dapat diakses oleh MIDlet suite lain. Pada method kedua

Sistem Nirkabel STMIK Potensi Utama 30


didefinisikan mode akses RecordStore apada parameter authMode. Mode akses ada dua jenis
yaitu akses yang hanya mengijinkan pemilik RecordStore dan mode akses yang mengijinkan
MIDlet suite lain untuk menggunakan RecordStore. Parameter writeable ditujukan untuk MIDlet
suite lain yang mengakses RecordStore. Jika RecordStore hanya dapat diakses MIDlet suite
pemiliknya maka nilai parameter ini diabaikan. Pemilik RecordStore selalu dapat menulis pada
RecordStore, jadi parameter writeable hanya akan berpengaruh pada MIdlet suite lain apakah
diijinkan menulis pada RecordStore atau tidak. Berikut akan disajikan potongan kode program
yang menunjukkan cara pemanggilan method kedua.

2) RecordEnumeration
RecordStore menyediakan sebuah interface untuk melakukan iterasi pengambilan record
yang ada dalam suatu RecordStore. Interface itu adalah RecordEnumeration. Interface
RecordEnumeration menyediakan satu set API yang mirip dengan interface Enumeration pada
J2SE dalam paket java.util. Interface RecordEnumeration memfasilitasi proses pengulangan
dalam obyek RecordStore tanpa harus mengetahui nilai record ID. Namun, dalam penggunaan
RecordEnumeration perlu berhatihati karena interface ini dapat menyebabkan overhead/beban
kerja yang cukup besar pada perangkat mobile, khususnya dalam hal kinerja/processing dan
penggunaan memori.
Interface RecordEnumeration menggunakan method nextRecord() dan previousRecord()
untuk membaca record berikutnya (next) dan sebelumnya (previous) di dalam suatu enumerasi.
Kedua method tersebut adalah sebagai berikut.
a. byte[] nextRecord()
b. byte[] previousRecord()

D. PRAKTIKUM

Latihan 1
Buatlah project buku telepon dengan mengetikkan coding ini menjadi satu project, tempatkan
seluruh file pada folder src.

BukuTelepon.java

import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import javax.microedition.rms.*;
import java.io.*;

public class BukuTelepon extends MIDlet implements CommandListener


{
private Display tampil;
private Form form;
private TextField txtNama,txtEmail,txtNoTelp;
private Command comSimpan,comKembali,comTampil,comUpdate,comHapus;
private int i = 0;

public BukuTelepon()
{

Sistem Nirkabel STMIK Potensi Utama 31


}

public void startApp()


{
tampil = Display.getDisplay(this);
form = new Form("Aplikasi Buku Telepon Suka - Suka");
txtNama = new TextField("Nama : ","",20,TextField.ANY); //String label,String
text,int maxSize,Input Type
txtEmail = new TextField("Email : ","",30,TextField.ANY);
txtNoTelp = new TextField("No.Telp : ","",15,TextField.ANY);
comSimpan = new Command("Simpan",Command.OK,1);
comTampil = new Command("Tampil",Command.OK,2);
comUpdate = new Command("Update",Command.OK,3);
comHapus = new Command("Hapus",Command.OK,4);
comKembali = new Command("Kembali",Command.BACK,1);
form.append(txtNama); //Menambahkan textfield nama ke dalam form utama
form.append(txtEmail); //Menambahkan textfield email ke dalam form utama
form.append(txtNoTelp); //Menambahkan textfield no telepon ke dalam form utama
form.addCommand(comSimpan);
form.addCommand(comTampil);
form.addCommand(comUpdate);
form.addCommand(comHapus);
form.addCommand(comKembali);
form.setCommandListener(this);
tampil.setCurrent(form);

}
//Membuat method simpan
public void Simpan(String input1,String input2,String input3)
{
try
{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);
dos.writeUTF(input1);
dos.writeUTF(input2);
dos.writeUTF(input3);
dos.flush();
RecordStore rs = RecordStore.openRecordStore("bukutelepon",true);
//bukutelepon sebagai nama database dalam konsep RMS
rs.addRecord(bos.toByteArray(),0,bos.toByteArray().length);
//Menutup koneksi
rs.closeRecordStore();
bos.close();
dos.close();
tampil.setCurrent(new Alert("Informasi","Data berhasil
disimpan",null,AlertType.INFO));
}

Sistem Nirkabel STMIK Potensi Utama 32


catch(Exception ex)
{
ex.printStackTrace();
tampil.setCurrent(new Alert("Error","Data gagal
disimpan",null,AlertType.ERROR));
}
}

//Membuat method update


public void Update(String input1,String input2,String input3,int i)
{
try
{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);
dos.writeUTF(input1);
dos.writeUTF(input2);
dos.writeUTF(input3);
dos.flush();
RecordStore rs = RecordStore.openRecordStore("bukutelepon",true);
rs.setRecord(i,bos.toByteArray(),0,bos.toByteArray().length);
rs.closeRecordStore();
bos.close();
dos.close();
tampil.setCurrent(new Alert("Informasi","Data berhasil
diupdate",null,AlertType.INFO));
}
catch(Exception ex)
{
ex.printStackTrace();
tampil.setCurrent(new Alert("Informasi","Data gagal
disimpan",null,AlertType.ERROR));
}

}
//Membuat method Hapus
public void Hapus(int i)
{
try
{
RecordStore rs = RecordStore.openRecordStore("bukutelepon",true);
rs.deleteRecord(i);
rs.closeRecordStore();
tampil.setCurrent(new Alert("Informasi","Data berhasil
dihapus",null,AlertType.INFO));
}
catch(Exception ex)
{

Sistem Nirkabel STMIK Potensi Utama 33


ex.printStackTrace();
tampil.setCurrent(new Alert("Error","Data gagal
dihapus",null,AlertType.ERROR));
}
}

public void pauseApp()


{
}

public void destroyApp(boolean unconditional)


{
notifyDestroyed();
}

public void commandAction(Command cmd,Displayable display)


{
if(cmd == comKembali)
{
destroyApp(true);
}
else if(cmd == comSimpan)
{
//Method simpan
Simpan(txtNama.getString(),txtEmail.getString(),txtNoTelp.getString());
txtNama.setString("");
txtEmail.setString("");
txtNoTelp.setString("");
}
//Menampilkan data
else if(cmd == comTampil)
{
try
{
RecordStore rs = RecordStore.openRecordStore("bukutelepon",true);
int a;
for(a=1;a<=rs.getNumRecords();a++)
{
ByteArrayInputStream bis = new
ByteArrayInputStream(rs.getRecord(a));
DataInputStream dis = new DataInputStream(bis);
String nama = dis.readUTF();
String email = dis.readUTF();
String telp = dis.readUTF();
bis.close();
dis.close();
System.out.println(nama + "\t" + email + "\t" + telp + "\t" +
txtNama.getString().equals(nama));
if(txtNama.getString().equals(nama))

Sistem Nirkabel STMIK Potensi Utama 34


{
txtEmail.setString(email);
txtNoTelp.setString(telp);
i = a;
break;
}
}
rs.closeRecordStore();
}
catch(Exception ex)
{
ex.printStackTrace();
tampil.setCurrent(new
Alert("Error",ex.getMessage(),null,AlertType.ERROR));
}
}
else if(cmd == comUpdate)
{
if(i>0)
{
//Method Update

Update(txtNama.getString(),txtEmail.getString(),txtNoTelp.getString(),i);
txtNama.setString("");
txtEmail.setString("");
txtNoTelp.setString("");
}
else
{
tampil.setCurrent(new Alert("Error","Data belum
dipilih",null,AlertType.ERROR));
}
}
else if(cmd == comHapus)
{
if(i>0)
{
//Method Hapus
Hapus(i);
txtNama.setString("");
txtEmail.setString("");
txtNoTelp.setString("");
}
else
{
tampil.setCurrent(new Alert("Error","Data belum
dipilih",null,AlertType.ERROR));
}

Sistem Nirkabel STMIK Potensi Utama 35


}
}
}

Praktikum 7
Pembuatan Aplikasi Mobile J2ME Dalam Symbian Platform

A. TUJUAN
- Mengetahui dan memahami fungsi yang disediakan oleh Mobile Media API
- Mengetahui fungsionalitas yang disediakan oleh Mobile Media API (MMAPI)

B. PERANGKAT LUNAK (SOFTWARE)


- JCreator
- Notepad
- Wireless Toolkit 2.5.2

C. DASAR TEORI
Perkembangan perangkat bergerak saat ini mengarah kepada komunikasi multimedia.
Pengguna dapat mengirim atau menerima informasi yang tidak hanya berbasis pada teks atau
audio saja, melainkan video. Beberapa perangkat bergerak saat ini sudah diperkaya dengan fitur
kamera dan kemampuan multimedia player, seperti MP3 dan video.
Di J2ME, profil MMAPI (Mobile Media API) memperluas cakupan ke arah
pengembangan mobile mutimedia. MMAPI yang didefinisikan dalam JSR135 menyediakan
sekumpulan interface dan kelas yang mendukung pemutaran berbagai tipe media. Di dalam
MIDP 2.0 terdapat subset spesifikasi MMAPI yang dibatasi. MMAPI mendefinisikan kelas dan
interface dalam package javax.microedition.media dan javax.microedition.media.player.
Packagepackage ini menyediakan bagian yang lebih kecil dari API yang didefinisikan dalam
JSR135. Manfaat dari subset yang terbatas dari API ini adalah aplikasi yang dibangun pada
MIDP 2.0 dapat dijalankan pada perangkat yang mendukung MMAPI sehingga memperbanyak
jumlah perangkat yang mendukung aplikasi MIDP 2.0.

Sistem Nirkabel STMIK Potensi Utama 36


Manfaat lainnya dari paket media dalam MIDP 2.0 adalah bahwa media tersebut dapat
dikirim atau diperoleh melalui suatu jaringan atau sumber lokal. Fitur ini memungkinkan untuk
menciptakan aplikasi yang menarik seperti game sound, musik, dan video clip. Mesikpun tidak
semua fitur media didukung oleh MIDP 2.0, namun untuk menjaga kompatibilitas, fitur yang
didukung haruslah memiliki panduan yang sama seperti yang ditentukan dalam JSR135.
Perangkat bergerak saat ini sudah dapat mendukung berbagai tipe media. Namun, MIDP
2.0 menspesifikasikan bahwa tipe media setidaknya harus mendukung minimal hal berikut:
a. Suara
b. Modulasi pulsecode 8bit (PCM) .wav dan .files

D. PRAKTIKUM

Latihan 1
Buatlah project dengan mengetikkan coding ini menjadi satu project, tempatkan file pada
folder src.

/* Program MultiMedia Mainkan Musik */


/* Nama File MainkanMusik.java */

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.media.*;
import javax.microedition.media.control.*;

public class MainkanMusik extends MIDlet implements PlayerListener, CommandListener


{
private Display disp1;
private static Player player1;
private VolumeControl vc1;
private List list1;
private Command CmdExit, CmdStop;

public MainkanMusik()
{
disp1 = Display.getDisplay(this);
}

public void startApp()


{
CmdExit = new Command("Exit", Command.EXIT, 1);
CmdStop = new Command("Stop", Command.OK, 1);
list1 = new List("Menu", List.IMPLICIT);
list1.append("APPLAUSE.wav", null);
list1.append("flourish.mid", null);
list1.addCommand(CmdExit);
list1.setCommandListener(this);
disp1.setCurrent(list1);

Sistem Nirkabel STMIK Potensi Utama 37


}

public void pauseApp()


{
}

public void destroyApp(boolean unconditional)


{
if(player1 != null)
{
player1.close();
}
}

public void commandAction(Command Cmd, Displayable s)


{
if (Cmd == List.SELECT_COMMAND)
{
switch (list1.getSelectedIndex())
{
case 0:
list1.addCommand(CmdStop);
try
{
playMedia("APPLAUSE.wav", "wav");
}
catch (Exception e)
{
e.printStackTrace();
}
break;
case 1:
list1.addCommand(CmdStop);
try
{
playMedia("flourish.mid", "mid");
}
catch (Exception e)
{
e.printStackTrace();
}
break;
}
}
else if(Cmd == CmdExit)
{
exitMIDlet();
}

Sistem Nirkabel STMIK Potensi Utama 38


else if(Cmd == CmdStop)
{
try
{
player1.stop();
if(player1 != null)
{
player1.close();
}
}
catch(Exception e)
{
}
list1.removeCommand(CmdStop);
}
}

public void exitMIDlet()


{
destroyApp(false);
notifyDestroyed();
player1 = null;
}

private void playMedia(String file, String p)


throws Exception
{
if(p.equals("wav"))
{
player1 = Manager.createPlayer(getClass().getResourceAsStream(file), "audio/x-wav");
}
else if(p.equals("mid"))
{
player1 = Manager.createPlayer(getClass().getResourceAsStream(file), "audio/midi");
}
else if(p.equals("jts"))
{
player1 = Manager.createPlayer(getClass().getResourceAsStream(file), "audio/x-tone-seq");
}
player1.addPlayerListener(this);
player1.setLoopCount(-1);
player1.prefetch();
player1.realize();
vc1 = (VolumeControl)player1.getControl("VolumeControl");
if (vc1 != null)
vc1.setLevel(100);
player1.start();
}

Sistem Nirkabel STMIK Potensi Utama 39


public void playerUpdate(Player player1, String event, Object eventData)
{
if(event.equals(PlayerListener.STARTED) &&
new Long(0L).equals((Long)eventData))
{
}
else if(event.equals(PlayerListener.CLOSED))
{
}
}
};

PRAKTIKUM 8
Pembuatan Aplikasi Mobile J2ME Dalam Microsoft Windows CE
Platform

A. TUJUAN
- Mengetahui dan memahami fungsi yang disediakan oleh Mobile Media API
- Mengetahui fungsionalitas yang disediakan oleh Mobile Media API (MMAPI)

B. PERANGKAT LUNAK (SOFTWARE)


- JCreator
- Notepad
- Wireless Toolkit 2.5.2

C. DASAR TEORI
Perkembangan perangkat bergerak saat ini mengarah kepada komunikasi multimedia.
Pengguna dapat mengirim atau menerima informasi yang tidak hanya berbasis pada teks atau
audio saja, melainkan video. Beberapa perangkat bergerak saat ini sudah diperkaya dengan fitur
kamera dan kemampuan multimedia player, seperti MP3 dan video.
Di J2ME, profil MMAPI (Mobile Media API) memperluas cakupan ke arah
pengembangan mobile mutimedia. MMAPI yang didefinisikan dalam JSR135 menyediakan
sekumpulan interface dan kelas yang mendukung pemutaran berbagai tipe media. Di dalam
MIDP 2.0 terdapat subset spesifikasi MMAPI yang dibatasi. MMAPI mendefinisikan kelas dan

Sistem Nirkabel STMIK Potensi Utama 40


interface dalam package javax.microedition.media dan javax.microedition.media.player.
Packagepackage ini menyediakan bagian yang lebih kecil dari API yang didefinisikan dalam
JSR135. Manfaat dari subset yang terbatas dari API ini adalah aplikasi yang dibangun pada
MIDP 2.0 dapat dijalankan pada perangkat yang mendukung MMAPI sehingga memperbanyak
jumlah perangkat yang mendukung aplikasi MIDP 2.0.
Manfaat lainnya dari paket media dalam MIDP 2.0 adalah bahwa media tersebut dapat
dikirim atau diperoleh melalui suatu jaringan atau sumber lokal. Fitur ini memungkinkan untuk
menciptakan aplikasi yang menarik seperti game sound, musik, dan video clip. Mesikpun tidak
semua fitur media didukung oleh MIDP 2.0, namun untuk menjaga kompatibilitas, fitur yang
didukung haruslah memiliki panduan yang sama seperti yang ditentukan dalam JSR135.
Perangkat bergerak saat ini sudah dapat mendukung berbagai tipe media. Namun, MIDP
2.0 menspesifikasikan bahwa tipe media setidaknya harus mendukung minimal hal berikut:
a. Suara
b. Modulasi pulsecode 8bit (PCM) .wav dan .files
Memainkan video hampir sama dengan audio. Namun, perlu ditentukan tempat
menampilkannya, di sebuah Form atau Canvas. MMAPI menyediakan dukungan untuk
menangkap klip audio atau video dari hardware tertentu seperti michrophone atau kamera dengan
memanfaatkan sintaks capture. Capture digunakan, sebagai contoh, untuk menampilkan input
kamera ke layar. Jika perangkat mobile mendukung suatu RecordControl, maka implementasi
tersebut dapat digunakan untuk merekam suatu input media.

D. PRAKTIKUM

Latihan 1
Buatlah project dengan mengetikkan coding ini menjadi satu project, tempatkan file pada
folder src.

/* Program Memainkan Video


Nama File MainkanVideo.java */

import java.util.Hashtable;
import java.util.Enumeration;

import javax.microedition.lcdui.Item;
import javax.microedition.lcdui.List;
import javax.microedition.lcdui.Form;
import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.CommandListener;

import javax.microedition.media.Player;
import javax.microedition.media.Control;

Sistem Nirkabel STMIK Potensi Utama 41


import javax.microedition.media.Manager;
import javax.microedition.media.PlayerListener;
import javax.microedition.media.control.VideoControl;

public class MainkanVideo 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 MainkanVideo() {

display = Display.getDisplay(this);

itemList = new List("Video", List.IMPLICIT);

stopCommand = new Command("Stop", Command.STOP, 1);


pauseCommand = new Command("Pause", Command.ITEM, 1);
startCommand = new Command("Mulai", Command.ITEM, 1);

form = new Form("Play Video");

form.addCommand(stopCommand);
form.addCommand(pauseCommand);
form.setCommandListener(this);

items = new Hashtable();

itemsInfo = new Hashtable();

items.put("Movie.mpeg", "file://Movie.mpeg");
itemsInfo.put("Movie.mpeg", "video/mpeg");
}

public void startApp() {

for(Enumeration en = items.keys(); en.hasMoreElements();) {


itemList.append((String)en.nextElement(), null);

Sistem Nirkabel STMIK Potensi Utama 42


}

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();
}

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) {
}
} 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);
}

Sistem Nirkabel STMIK Potensi Utama 43


} catch(Exception e) {
}
}

private void playMedia(String locator, String key) throws Exception {

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();

public void playerUpdate(Player player, String event, Object eventData) {

if(event.equals(PlayerListener.STARTED) &&
new Long(0L).equals((Long)eventData)) {

VideoControl vc = null;
if((vc = (VideoControl)player.getControl("VideoControl")) != null) {
Item videoDisp =
(Item)vc.initDisplayMode(vc.USE_GUI_PRIMITIVE, null);
form.append(videoDisp);
}

display.setCurrent(form);
} else if(event.equals(PlayerListener.CLOSED)) {

form.deleteAll();
}
}

Sistem Nirkabel STMIK Potensi Utama 44


PRAKTIKUM 9
Pembuatan Aplikasi Sms Dan Sms Gateway dengan J2ME

A. TUJUAN
- Mengetahui cara mengirim dan menerima pesan / SMS.
- Dapat mengirim dan menerima pesan SMS

B. PERANGKAT LUNAK (SOFTWARE)


- JCreator
- Notepad
- Wireless Toolkit 2.5.2

C. DASAR TEORI
Kebanyakan perangkat saat ini telah mendukung penggunaan teks. Hampir semua telepon
seluler yang beredar saat ini telah mendukung penggunaan SMS Kebutuhan memori yang relatif
kecil memuat konten berbasis teks lebih mudah diimplementasikan. Namun keterbatasan jumlah
karakter yan dapat ditampilkan harus menjadi pertimbangan dalam menampilkan konten
pembelajaran sehingga perlu strategi khusus agar konten pembelajaran dapat disampaikan secara
tepat dan efektif meskipun dengan keterbatasan ini. Salah satu contoh aplikasi pembelajaran

Sistem Nirkabel STMIK Potensi Utama 45


berbasis teks/SMS adalah StudyTXT yang dikembangkan di salah satu Universitas di Selandia
baru.
Skenario StudyTXT adalah pengguna StudyTXT yang memanfaatkan layanan ini
mengirimkan teks singkat berisi kode tertentu menggunakan pesan SMS ke server StudyTXT.
Server kemudian merespon permintaan ini dengan mengirimkan SMS berisi informasi singkat
tentang obyek yang dipilih. Pesan SMS ini kemudian disimpan dalam perangkat seluler siswa
dan dapat direview kapan saja dan dimana saja, ini merupakan catatan tradisional dalam
pembelajaran yang menyenangkan yang dapat didapat dalam waktu singkat dalam bentuk SMS.

D. PRAKTIKUM

Latihan 1
Buatlah project dengan mengetikkan coding ini menjadi satu project, tempatkan file pada
folder src, beri nama project ReceiveSMS, pada kotak user defined di property tambahkan
smsPort dengan value 800.

ReceiveSMS.java

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

import javax.microedition.media.*;
import javax.microedition.media.control.*;

public class ReceiveSMS


extends MIDlet {
Display display;

public ReceiveSMS() {
display = Display.getDisplay(this);
}

public void startApp() {


String smsPort = getAppProperty("SMS-Port");
SMSFormReceive form = new SMSFormReceive(this, display, smsPort);
display.setCurrent(form);
}

public void pauseApp() {}

public void destroyApp(boolean unconditional) {


}

public void exitMIDlet() {


destroyApp(false);
notifyDestroyed();
}

Sistem Nirkabel STMIK Potensi Utama 46


};

import java.io.IOException;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
import javax.wireless.messaging.*;

SMSFormReceive.java

public class SMSFormReceive


extends Form
implements CommandListener, Runnable, MessageListener {
private ReceiveSMS midlet;
private Display display;
private Command cmExit;
private Thread thread;
private String address, senderAddress;
private String[] connections;
private MessageConnection smsconn = null;

public SMSFormReceive(ReceiveSMS midlet, Display display, String smsPort) {


super("Receive SMS");
this.midlet = midlet;
this.display = display;

cmExit = new Command("Keluar", Command.EXIT, 1);


setCommandListener(this);
addCommand(cmExit);

address = "sms://:" + smsPort;


connections = PushRegistry.listConnections(true);

if (connections == null || connections.length == 0) {


append("Menunggu SMS...");
}

try {
smsconn = (MessageConnection) Connector.open(address);
smsconn.setMessageListener(this);
} catch (Exception e) {
}

thread = new Thread(this);


thread.start();
}

Sistem Nirkabel STMIK Potensi Utama 47


public void commandAction(Command c, Displayable s) {
if (c == cmExit){
if (smsconn != null) {
try {
smsconn.close();
} catch (IOException ioe) {
}
}
midlet.exitMIDlet();
}
}

public void notifyIncomingMessage(MessageConnection conn) {


if(thread == null){
thread = new Thread(this);
thread.start();
}
}

public void run(){


ReceiveSMS();
}

public void ReceiveSMS() {


try {
Message msg = smsconn.receive();
if (msg != null) {
senderAddress = msg.getAddress();
setTitle("Dari: " + senderAddress);
if (msg instanceof TextMessage) {
StringItem stringItem = new StringItem("Isi : ",
((TextMessage)msg).getPayloadText());
append(stringItem);
} else {
StringBuffer buf = new StringBuffer();
byte[] data = ((BinaryMessage)msg).getPayloadData();
for (int i = 0; i < data.length; i++) {
int intData = (int)data[i] & 0xFF;
if (intData < 0x10) {
buf.append("0");
}
buf.append(Integer.toHexString(intData));
buf.append(' ');
}
StringItem stringItem = new StringItem("Isi : ", buf.toString());
append(stringItem);
}
}

Sistem Nirkabel STMIK Potensi Utama 48


} catch (IOException e) {
}
}
};

Buatlah project dengan mengetikkan coding ini menjadi satu project, tempatkan file pada
folder src, beri nama project SendSMS, pada kotak user defined di property tambahkan smsPort
dengan value 800.

SendSMS.java

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class SendSMS extends MIDlet implements CommandListener {


private Display display;
private Command cmExit, cmOk;
private PhoneInput form;
TextBox tbClip;

public SendSMS(){
display = Display.getDisplay(this);

cmOk = new Command("Lanjut", Command.OK, 1);


cmExit = new Command("Keluar", Command.EXIT, 1);

tbClip = new TextBox("Pesan", "",156, TextField.ANY);


tbClip.addCommand(cmOk);
tbClip.addCommand(cmExit);
tbClip.setCommandListener(this);
}

public void startApp(){


display.setCurrent(tbClip);
}

public void pauseApp(){


}

public void destroyApp(boolean unconditional){


}

public void commandAction(Command c, Displayable s) {


if (c == cmOk){
String smsPort = getAppProperty("SMS-Port");
form = new PhoneInput(this, display, tbClip.getString(), smsPort);

Sistem Nirkabel STMIK Potensi Utama 49


display.setCurrent(form);
}else if (c == cmExit){
exitMIDlet();
}
}

public void exitMIDlet(){


destroyApp(false);
notifyDestroyed();
}
}

PhoneInput.java

import javax.microedition.lcdui.*;
import javax.microedition.io.*;
import javax.wireless.messaging.*;
import java.io.IOException;

class PhoneInput
extends Form
implements ItemCommandListener, ItemStateListener, CommandListener, Runnable
{
private Display display;
private Command cmSend, cmCancel, cmExit;
private TextField tfPhone;
private SendSMS midlet;
private String msg;
private StringItem itemCancel, itemSend, itemExit;
private Alert al;
private String adr;
private String smsPort;

public PhoneInput(SendSMS midlet, Display display, String msg, String smsPort) {


super("Nomor HP");
this.display = display;
this.midlet = midlet;
this.msg = msg;
this.smsPort = smsPort;

cmSend = new Command("Kirim", Command.OK, 1);


cmCancel = new Command("Batal", Command.CANCEL, 1);
cmExit = new Command("Keluar", Command.EXIT, 1);

tfPhone = new TextField("Nomor HP", "", 30,TextField.PHONENUMBER);


this.append(tfPhone);

Sistem Nirkabel STMIK Potensi Utama 50


this.setCommandListener(this);

itemSend = new StringItem(null, "Kirim", Item.BUTTON);


itemSend.setDefaultCommand(cmSend);
itemSend.setItemCommandListener(this);
append(itemSend);

itemCancel = new StringItem(null, "Batal", Item.BUTTON);


itemCancel.setDefaultCommand(cmCancel);
itemCancel.setItemCommandListener(this);
append(itemCancel);

itemExit = new StringItem(null, "Keluar", Item.BUTTON);


itemExit.setDefaultCommand(cmExit);
itemExit.setItemCommandListener(this);
append(itemExit);

setItemStateListener(this);
}

public void itemStateChanged(Item item) {


}

public void commandAction(Command c, Item item) {


if (c == cmSend) {
if ((tfPhone.size() == 0)){
al = new Alert("Error", "Nomor HP Tidak Valid", null,
AlertType.ERROR);
al.setTimeout(Alert.FOREVER);
display.setCurrent(al);
}else {
this.adr = "sms://" + tfPhone.getString() + ":" + smsPort;
new Thread(this).start();
}
}else if(c == cmCancel){
display.setCurrent(midlet.tbClip);
}else if(c == cmExit){
midlet.exitMIDlet();
}
}

public void commandAction(Command c, Displayable s) {


}

public void run() {


MessageConnection smsconn = null;;

try {

Sistem Nirkabel STMIK Potensi Utama 51


smsconn = (MessageConnection)Connector.open(adr);

TextMessage txtmessage = (TextMessage)smsconn.newMessage(


MessageConnection.TEXT_MESSAGE);
txtmessage.setAddress(adr);
txtmessage.setPayloadText(msg);
smsconn.send(txtmessage);
Alert alert = new Alert("Info", "Pesan Terkirim", null, AlertType.INFO);
alert.setTimeout(Alert.FOREVER);
display.setCurrent(alert);
} catch (Throwable t) {
System.out.println("error : " + t.toString());
Alert alert = new Alert("Error", "Pesan Gagal Terkirim", null,
AlertType.ERROR);
alert.setTimeout(Alert.FOREVER);
display.setCurrent(alert);
}

if (smsconn != null) {
try {
smsconn.close();
} catch (IOException ioe) {
}
}
}
}

PRAKTIKUM 10
PEMBUATAN APLIKASI BLUETOOTH DENGAN J2ME

A. TUJUAN
- Mengetahui cara berkomunikasi wireless menggunakan protokol Bluetooth
- Dapat berkomunikasi wireless menggunakan protokol Bluetooth

B. PERANGKAT LUNAK (SOFTWARE)


- JCreator
- Notepad
- Wireless Toolkit 2.5.2

C. DASAR TEORI
Generic Connection Framework mendukung koneksi packet (socket) dan stream
(datagram). Sesuai dengan namanya, framework ini menyediakan API dasar bagi koneksi di

Sistem Nirkabel STMIK Potensi Utama 52


CLDC. Framework ini menyediakan pondasi umum dari berbagai koneksi seperti HTTP, socket,
dan datagram. Walaupun Bluetooth dan serial I/O termasuk kedalam API ini, GCF menyediakan
satu set API yang lebih generic dan mendasar yang menjadi abstraksi dari berbagai tipe koneksi.
Harus dicatat, bahwa tidak semua tipe koneksi dibutuhkan bagi implementasi sebuah MIDP
device.
WTK mempunyai librarylibrary yang dapat digunakan untuk pembuatan aplikasi J2ME.
Seringkali penggunaan WTK ini dijadikan plugin untuk development environment seperti Net
Beans dan eclipse. Dengan demikian dimungkinkan pengembangan aplikasi J2ME pada
lingkungan yang lebih baik seperti halnya pengembangan aplikasi J2SE maupun J2EE. Library
library yang dicakup dalam WTK antara lain:
a. Java Technology for Wireless Industry/JTWI (JSR 185)
b. Wireless Messaging API/WMAPI (JSR 120)
c. Java API Bluetooth Wireless ToolKit/JABWT (JSR 82)
d. Java Web Service API (JSR 172)
e. Mobile Media API (JSR 135)
Infrared, Bluetooth dan kabel data biasanya digunakan untuk deployment MIDlet dalam
skala kecil artinya MIDlet diinstal ke satu perangkat pada satu waktu. OTA memungkinkan
deployment secara masal. OTA menggunakan TCP/IP dalam pengoperasiannya. MIDletMIDlet
komersil biasanya menggunakan cara ini terutama terakhir. OTA dipilih karena merupakan cara
yang mudah dan mampu menjangkau konsumen secara luas karena menggunakan jaringan
internet. Lebih lanjut tentang OTA ini akan dibahas pada subbab over The Air Provisioning.

D. PRAKTIKUM

Latihan 1
Buatlah project dengan mengetikkan coding ini menjadi satu project, tempatkan file pada
folder src, beri nama project BluetoothServer, pada kotak user property cheklis fasilitas Bluetooth
OBEX.

BluetoothServer.java

import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.List;

public final class BluetoothServer extends MIDlet implements CommandListener {

private final Command cmExit = new Command("Keluar", Command.EXIT, 1);


private final Command cmOk = new Command("Ok", Command.SCREEN, 1);
private final List menu = new List("Bluetooth Server", List.IMPLICIT);
private UIServer uiServer;

public BluetoothServer() {
menu.addCommand(cmExit);
menu.addCommand(cmOk);

Sistem Nirkabel STMIK Potensi Utama 53


menu.setCommandListener(this);
}

public void startApp() {


show();
}

protected void destroyApp(boolean unconditional) {


if (uiServer != null) {
uiServer.destroy();
}
}

protected void pauseApp() {


}

public void commandAction(Command c, Displayable d) {


if (c == cmExit) {
destroyApp(true);
notifyDestroyed();
return;
}else{
uiServer = new UIServer(this);
}
}

Displayable getDisplayable() {
return menu;
}

public void show(){


Display.getDisplay(this).setCurrent(menu);
}
}
Server.java

import javax.bluetooth.DataElement;
import javax.bluetooth.DiscoveryAgent;
import javax.bluetooth.LocalDevice;
import javax.bluetooth.ServiceRecord;
import javax.bluetooth.ServiceRegistrationException;
import javax.bluetooth.UUID;
import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;
import javax.microedition.io.StreamConnectionNotifier;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

Sistem Nirkabel STMIK Potensi Utama 54


import java.io.OutputStream;
import java.util.Vector;
import java.util.Hashtable;

final class Server implements Runnable {


private static final UUID PICTURES_SERVER_UUID =
new UUID("F0E0D0C0B0A000908070605040302010", false);
private static final int IMAGES_NAMES_ATTRIBUTE_ID = 0x4321;
private LocalDevice localDevice;
private StreamConnectionNotifier notifier;
private ServiceRecord record;
private UIServer parent;
private boolean isClosed;
private Thread accepterThread;
private ClientProcessor processor;
private final Hashtable dataElements = new Hashtable();

Server(UIServer parent) {
this.parent = parent;
accepterThread = new Thread(this);
accepterThread.start();
}

public void run() {


boolean isBTReady = false;

try {
localDevice = LocalDevice.getLocalDevice();
if (!localDevice.setDiscoverable(DiscoveryAgent.GIAC)) {
throw new IOException("Tidak dapat mengeset mode pencarian");
}
StringBuffer url = new StringBuffer("btspp://");
url.append("localhost").append(':');
url.append(PICTURES_SERVER_UUID.toString());
url.append(";name=Picture Server");
url.append(";authorize=false");

notifier = (StreamConnectionNotifier) Connector.open(


url.toString());
record = localDevice.getRecord(notifier);

DataElement base = new DataElement(DataElement.DATSEQ);


record.setAttributeValue(IMAGES_NAMES_ATTRIBUTE_ID, base);

isBTReady = true;
} catch (Exception e) {
}
parent.completeInitialization(isBTReady);

Sistem Nirkabel STMIK Potensi Utama 55


if (!isBTReady) {
return;
}

processor = new ClientProcessor();

while (!isClosed) {
StreamConnection conn = null;

try {
conn = notifier.acceptAndOpen();
} catch (IOException e) {
continue;
}
processor.addConnection(conn);
}
}

boolean changeImageInfo(String name, boolean isPublished) {


DataElement base = record.getAttributeValue(IMAGES_NAMES_ATTRIBUTE_ID);
DataElement de = (DataElement) dataElements.get(name);
if (de == null) {
de = new DataElement(DataElement.STRING, name);
dataElements.put(name, de);
}
if (isPublished) {
base.addElement(de);
} else {
if (!base.removeElement(de)) {
return false;
}
}
record.setAttributeValue(IMAGES_NAMES_ATTRIBUTE_ID, base);

try {
localDevice.updateRecord(record);
} catch (ServiceRegistrationException e) {
return false;
}
return true;
}

void destroy() {
isClosed = true;

if (notifier != null) {
try {

Sistem Nirkabel STMIK Potensi Utama 56


notifier.close();
} catch (IOException e) {
}
}

try {
accepterThread.join();
} catch (InterruptedException e) {
}

if (processor != null) {
processor.destroy(true);
}
processor = null;
}

private void processConnection(StreamConnection conn) {


String imgName = readImageName(conn);
imgName = parent.getImageFileName(imgName);
byte[] imgData = getImageData(imgName);
sendImageData(imgData, conn);
try {
conn.close();
} catch (IOException e) {
}
}

private void sendImageData(byte[] imgData, StreamConnection conn) {


if (imgData == null) {
return;
}
OutputStream out = null;

try {
out = conn.openOutputStream();
out.write(imgData.length >> 8);
out.write(imgData.length & 0xff);
out.write(imgData);
out.flush();
} catch (IOException e) {
}

if (out != null) {
try {
out.close();
} catch (IOException e) {
}
}

Sistem Nirkabel STMIK Potensi Utama 57


}

private String readImageName(StreamConnection conn) {


String imgName = null;
InputStream in = null;

try {
in = conn.openInputStream();
int length = in.read();

if (length <= 0) {
throw new IOException("Tidak dapat membaca panjang nama");
}
byte[] nameData = new byte[length];
length = 0;

while (length != nameData.length) {


int n = in.read(nameData, length, nameData.length - length);

if (n == -1) {
throw new IOException("Tidak dapat membaca nama data");
}
length += n;
}
imgName = new String(nameData);
} catch (IOException e) {
}

if (in != null) {
try {
in.close();
} catch (IOException e) {
}
}
return imgName;
}

private byte[] getImageData(String imgName) {


if (imgName == null) {
return null;
}
InputStream in = getClass().getResourceAsStream(imgName);

byte[] buff = new byte[1024];


ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);

try {
while (true) {

Sistem Nirkabel STMIK Potensi Utama 58


int length = in.read(buff);

if (length == -1) {
break;
}
baos.write(buff, 0, length);
}
} catch (IOException e) {
return null;
}
return baos.toByteArray();
}

private class ClientProcessor implements Runnable {


private Thread processorThread;
private Vector queue = new Vector();
private boolean isOk = true;

ClientProcessor() {
processorThread = new Thread(this);
processorThread.start();
}

public void run() {


while (!isClosed) {
synchronized (this) {
if (queue.size() == 0) {
try {
wait();
} catch (InterruptedException e) {
destroy(false);
return;
}
}
}

StreamConnection conn;

synchronized (this) {

if (isClosed) {
return;
}
conn = (StreamConnection) queue.firstElement();
queue.removeElementAt(0);
processConnection(conn);
}
}

Sistem Nirkabel STMIK Potensi Utama 59


}

void addConnection(StreamConnection conn) {


synchronized (this) {
queue.addElement(conn);
notify();
}
}

void destroy(boolean needJoin) {


StreamConnection conn;

synchronized (this) {
notify();

while (queue.size() != 0) {
conn = (StreamConnection) queue.firstElement();
queue.removeElementAt(0);

try {
conn.close();
} catch (IOException e) {
}
}
}

try {
processorThread.join();
} catch (InterruptedException e) {
}
}
}
}

UIServer.java

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;

Sistem Nirkabel STMIK Potensi Utama 60


import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.List;
import java.io.IOException;
import java.util.Vector;

final class UIServer implements CommandListener {

private final Command backCommand = new Command("Kembali", Command.BACK, 2);


private final Command addCommand = new Command("Publikasi Gambar",
Command.SCREEN, 1);
private final Command removeCommand = new Command("Hapus image",
Command.SCREEN, 1);
private final List imagesList = new List("Konfigurasi Server", List.IMPLICIT);
private BluetoothServer parent;
private Vector imagesNames;
private Image onImage, offImage;
private boolean[] published;
private Server server;

UIServer(BluetoothServer parent) {
this.parent = parent;
server = new Server(this);
setupIdicatorImage();
setupImageList();
published = new boolean[imagesList.size()];

imagesList.addCommand(backCommand);
imagesList.addCommand(addCommand);
imagesList.addCommand(removeCommand);
imagesList.setCommandListener(this);
}

public void commandAction(Command c, Displayable d) {


if (c == backCommand && d == imagesList) {
destroy();
parent.show();
return;
}

if (c == backCommand) {
Display.getDisplay(parent).setCurrent(imagesList);
return;
}

int index = imagesList.getSelectedIndex();


if ((c == addCommand) == published[index]) {
return;

Sistem Nirkabel STMIK Potensi Utama 61


}

published[index] = c == addCommand;
Image stateImg = c == addCommand ? onImage : offImage;
imagesList.set(index, imagesList.getString(index), stateImg);

if (!server.changeImageInfo(imagesList.getString(index),
published[index])) {
Alert al = new Alert("Error", "Tidak dapat mengubah properti", null,
AlertType.ERROR);
al.setTimeout(Alert.FOREVER);
Display.getDisplay(parent).setCurrent(al, imagesList);

published[index] = !published[index];
stateImg = published[index] ? onImage : offImage;
imagesList.set(index, imagesList.getString(index), stateImg);
}
}

void completeInitialization(boolean isBTReady) {

if (isBTReady) {
Display.getDisplay(parent).setCurrent(imagesList);
return;
}

Alert al = new Alert("Error", "Bluetooth tidak dapat diinisialisasi", null,


AlertType.ERROR);
al.setTimeout(Alert.FOREVER);
Display.getDisplay(parent).setCurrent(al, parent.getDisplayable());
}

void destroy() {
server.destroy();
}

String getImageFileName(String imgName) {


if (imgName == null) {
return null;
}

int index = -1;

for (int i = 0; i < imagesList.size(); i++) {


if (imagesList.getString(i).equals(imgName)) {
index = i;
break;
}

Sistem Nirkabel STMIK Potensi Utama 62


}

if (index == -1 || !published[index]) {
return null;
}
return (String) imagesNames.elementAt(index);
}

private void setupIdicatorImage() {

try {
onImage = Image.createImage("/images/kupuOn.gif");
} catch (IOException e) {
onImage = createIndicatorImage(12, 12, 0, 255, 0);
}

try {
offImage = Image.createImage("/images/kupuOff.gif");
} catch (IOException e) {
offImage = createIndicatorImage(12, 12, 255, 0, 0);
}
}

private void setupImageList() {


imagesNames = new Vector();
imagesList.setCommandListener(this);

for (int n = 1; n < 100; n++) {


String name = parent.getAppProperty("NamaGambar-" + n);

if (name == null || name.length() == 0) {


break;
}
String label = parent.getAppProperty("JudulGambar-" + n);

if (label == null || label.length() == 0) {


label = name;
}
imagesNames.addElement(name);
imagesList.append(label, offImage);
}
}

private Image createIndicatorImage(int w, int h, int r, int g, int b) {


Image res = Image.createImage(w, h);
Graphics gc = res.getGraphics();
gc.setColor(r, g, b);
gc.fillRect(0, 0, w, h);

Sistem Nirkabel STMIK Potensi Utama 63


return res;
}
}

Buatlah project dengan mengetikkan coding ini menjadi satu project, tempatkan file pada
folder src, beri nama project BluetoothClient, pada kotak user property cheklis fasilitas Bluetooth
OBEX.

BluetoothClient.java

import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.List;

public final class BluetoothClient extends MIDlet implements CommandListener {

private final Command cmExit = new Command("Keluar", Command.EXIT, 1);


private final Command cmOk = new Command("Ok", Command.SCREEN, 1);
private final List menu = new List("Bluetooth Client", List.IMPLICIT);
private UIClient uiClient;

public BluetoothClient() {
menu.addCommand(cmExit);
menu.addCommand(cmOk);
menu.setCommandListener(this);
}

public void startApp() {


show();
}

protected void destroyApp(boolean unconditional) {


if (uiClient != null) {
uiClient.destroy();
}
}

protected void pauseApp() {


}

public void commandAction(Command c, Displayable d) {


if (c == cmExit) {
destroyApp(true);
notifyDestroyed();

Sistem Nirkabel STMIK Potensi Utama 64


return;
}else{
uiClient = new UIClient(this);
}
}

Displayable getDisplayable() {
return menu;
}

public void show(){


Display.getDisplay(this).setCurrent(menu);
}
}

Client.java

import javax.bluetooth.BluetoothStateException;
import javax.bluetooth.DataElement;
import javax.bluetooth.DeviceClass;
import javax.bluetooth.DiscoveryAgent;
import javax.bluetooth.DiscoveryListener;
import javax.bluetooth.LocalDevice;
import javax.bluetooth.RemoteDevice;
import javax.bluetooth.ServiceRecord;
import javax.bluetooth.UUID;
import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;
import javax.microedition.lcdui.Image;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;

final class Client implements Runnable, DiscoveryListener {

private static final UUID PICTURES_SERVER_UUID =


new UUID("F0E0D0C0B0A000908070605040302010", false);
private static final int IMAGES_NAMES_ATTRIBUTE_ID = 0x4321;
private static final int READY = 0;
private static final int DEVICE_SEARCH = 1;
private static final int SERVICE_SEARCH = 2;
private int state = READY;
private DiscoveryAgent discoveryAgent;
private UIClient parent;

Sistem Nirkabel STMIK Potensi Utama 65


private boolean isClosed;
private Thread processorThread;
private Vector devices = new Vector();
private Vector records = new Vector();
private int discType;
private int[] searchIDs;
private String imageNameToLoad;
private Hashtable base = new Hashtable();
private boolean isDownloadCanceled;
private UUID[] uuidSet;
private int[] attrSet;

Client(UIClient parent) {
this.parent = parent;
processorThread = new Thread(this);
processorThread.start();
}

public void run() {


boolean isBTReady = false;

try {
LocalDevice localDevice = LocalDevice.getLocalDevice();
discoveryAgent = localDevice.getDiscoveryAgent();
isBTReady = true;
} catch (Exception e) {
}
parent.completeInitialization(isBTReady);
if (!isBTReady) {
return;
}

uuidSet = new UUID[2];


uuidSet[0] = new UUID(0x1101);
uuidSet[1] = PICTURES_SERVER_UUID;
attrSet = new int[1];
attrSet[0] = IMAGES_NAMES_ATTRIBUTE_ID;

processImagesSearchDownload();
}

public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) {


if (devices.indexOf(btDevice) == -1) {
devices.addElement(btDevice);
}
}

public void inquiryCompleted(int discType) {

Sistem Nirkabel STMIK Potensi Utama 66


this.discType = discType;

synchronized (this) {
notify();
}
}

public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {


for (int i = 0; i < servRecord.length; i++) {
records.addElement(servRecord[i]);
}
}

public void serviceSearchCompleted(int transID, int respCode) {


int index = -1;

for (int i = 0; i < searchIDs.length; i++) {


if (searchIDs[i] == transID) {
index = i;
break;
}
}

if (index != -1) {
searchIDs[index] = -1;
}

for (int i = 0; i < searchIDs.length; i++) {


if (searchIDs[i] != -1) {
return;
}
}

synchronized (this) {
notify();
}
}

void requestSearch() {
synchronized (this) {
notify();
}
}

void cancelSearch() {
synchronized (this) {
if (state == DEVICE_SEARCH) {
discoveryAgent.cancelInquiry(this);

Sistem Nirkabel STMIK Potensi Utama 67


} else if (state == SERVICE_SEARCH) {
for (int i = 0; i < searchIDs.length; i++) {
discoveryAgent.cancelServiceSearch(searchIDs[i]);
}
}
}
}

void requestLoad(String name) {


synchronized (this) {
imageNameToLoad = name;
notify();
}
}

void cancelLoad() {
isDownloadCanceled = true;
}

void destroy() {
synchronized (this) {
isClosed = true;
isDownloadCanceled = true;
notify();
}
try {
processorThread.join();
} catch (InterruptedException e) {
}
}

private synchronized void processImagesSearchDownload() {


while (!isClosed) {
state = READY;

try {
wait();
} catch (InterruptedException e) {
return;
}

if (isClosed) {
return;
}

if (!searchDevices()) {
return;
} else if (devices.size() == 0) {

Sistem Nirkabel STMIK Potensi Utama 68


continue;
}

if (!searchServices()) {
return;
} else if (records.size() == 0) {
continue;
}

if (!presentUserSearchResults()) {
continue;
}

while (true) {
isDownloadCanceled = false;
try {
wait();
} catch (InterruptedException e) {
return;
}

if (isClosed) {
return;
}

if (imageNameToLoad == null) {
break;
}

Image img = loadImage();

if (isClosed) {
return;
}

if (isDownloadCanceled) {
continue;
}

if (img == null) {
parent.informLoadError("Gambar tidak dapat ditampilkan : "
+ imageNameToLoad);
continue;
}

parent.showImage(img, imageNameToLoad);

continue;

Sistem Nirkabel STMIK Potensi Utama 69


}
}
}

private boolean searchDevices() {


state = DEVICE_SEARCH;
devices.removeAllElements();

try {
discoveryAgent.startInquiry(DiscoveryAgent.GIAC, this);
} catch (BluetoothStateException e) {
parent.informSearchError("Tidak dapat memulai pencarian perangkat");
return true;
}

try {
wait();
} catch (InterruptedException e) {
return false;
}

if (isClosed) {
return false;
}

switch (discType) {
case INQUIRY_ERROR:
parent.informSearchError("Pemcarian perangkat error.......");

case INQUIRY_TERMINATED:
devices.removeAllElements();
break;

case INQUIRY_COMPLETED:
if (devices.size() == 0) {
parent.informSearchError("Tidak ada perangkat dalam jangkauan");
}
break;
default:
destroy();
return false;
}
return true;
}

private boolean searchServices() {


state = SERVICE_SEARCH;
records.removeAllElements();

Sistem Nirkabel STMIK Potensi Utama 70


searchIDs = new int[devices.size()];
boolean isSearchStarted = false;

for (int i = 0; i < devices.size(); i++) {


RemoteDevice rd = (RemoteDevice) devices.elementAt(i);

try {
searchIDs[i] = discoveryAgent.searchServices(attrSet, uuidSet,
rd, this);
} catch (BluetoothStateException e) {
searchIDs[i] = -1;
continue;
}
isSearchStarted = true;
}

if (!isSearchStarted) {
parent.informSearchError("Tidak dapat melakukan pencarian pelayanan");
return true;
}

try {
wait();
} catch (InterruptedException e) {
return false;
}

if (isClosed) {
return false;
}

if (records.size() == 0) {
parent.informSearchError("Tidak ada pelayanan yang sesuai");
}
return true;
}

private boolean presentUserSearchResults() {


base.clear();

for (int i = 0; i < records.size(); i++) {


ServiceRecord sr = (ServiceRecord) records.elementAt(i);

DataElement de = sr.getAttributeValue(IMAGES_NAMES_ATTRIBUTE_ID);

if (de == null) {
continue;
}

Sistem Nirkabel STMIK Potensi Utama 71


Enumeration enume = (Enumeration) de.getValue();

while (enume.hasMoreElements()) {
de = (DataElement) enume.nextElement();
String name = (String) de.getValue();

Object obj = base.get(name);

if (obj != null) {
Vector v;

if (obj instanceof ServiceRecord) {


v = new Vector();
v.addElement(obj);
} else {
v = (Vector) obj;
}
v.addElement(sr);
obj = v;
} else {
obj = sr;
}
base.put(name, obj);
}
}
return parent.showImagesNames(base);
}

private Image loadImage() {


if (imageNameToLoad == null) {
return null;
}

ServiceRecord[] sr = null;
Object obj = base.get(imageNameToLoad);

if (obj == null) {
return null;
} else if (obj instanceof ServiceRecord) {
sr = new ServiceRecord[] { (ServiceRecord) obj };
} else {
Vector v = (Vector) obj;
sr = new ServiceRecord[v.size()];

for (int i = 0; i < v.size(); i++) {


sr[i] = (ServiceRecord) v.elementAt(i);
}
}

Sistem Nirkabel STMIK Potensi Utama 72


for (int i = 0; i < sr.length; i++) {
StreamConnection conn = null;
String url = null;

if (isDownloadCanceled) {
return null;
}

try {
url = sr[i].getConnectionURL(
ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false);
conn = (StreamConnection) Connector.open(url);
} catch (IOException e) {
continue;
}

try {
OutputStream out = conn.openOutputStream();
out.write(imageNameToLoad.length());
out.write(imageNameToLoad.getBytes());
out.flush();
out.close();
} catch (IOException e) {
try {
conn.close();
} catch (IOException ee) {
}
continue;
}

byte[] imgData = null;

try {
InputStream in = conn.openInputStream();
int length = in.read() << 8;
length |= in.read();

if (length <= 0) {
throw new IOException("Tidak dapat membaca panjang data");
}

imgData = new byte[length];


length = 0;

while (length != imgData.length) {


int n = in.read(imgData, length, imgData.length - length);

Sistem Nirkabel STMIK Potensi Utama 73


if (n == -1) {
throw new IOException("Tidak dapat membaca data gambar");
}
length += n;
}
in.close();
} catch (IOException e) {
continue;
} finally {
try {
conn.close();
} catch (IOException e) {
}
}

Image img = null;

try {
img = Image.createImage(imgData, 0, imgData.length);
} catch (Exception e) {
continue;
}
return img;
}
return null;
}
}

UIClient.java

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.Gauge;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.ImageItem;
import javax.microedition.lcdui.List;
import javax.microedition.lcdui.StringItem;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Enumeration;

final class UIClient implements CommandListener {

Sistem Nirkabel STMIK Potensi Utama 74


private final Command SCR_MAIN_BACK_CMD = new Command("Kembali",
Command.BACK, 2);
private final Command SCR_MAIN_SEARCH_CMD = new Command("Cari",
Command.OK, 1);
private final Command SCR_SEARCH_CANCEL_CMD = new Command("Batal",
Command.BACK, 2);
private final Command SCR_IMAGES_BACK_CMD = new Command("Kembali",
Command.BACK, 2);
private final Command SCR_IMAGES_LOAD_CMD = new Command("Tampilkan",
Command.OK, 1);
private final Command SCR_LOAD_CANCEL_CMD = new Command("Batal",
Command.BACK, 2);
private final Command SCR_SHOW_BACK_CMD = new Command("Kembali",
Command.BACK, 2);
private final Form mainScreen = new Form("Menampilkan Gambar");
private final List listScreen = new List("Menampilkan Gambar", List.IMPLICIT);
private final Form imageScreen = new Form("Menampilkan Gambar");
private BluetoothClient parent;
private Client client;

UIClient(BluetoothClient parent) {
this.parent = parent;
client = new Client(this);
mainScreen.addCommand(SCR_MAIN_BACK_CMD);
mainScreen.addCommand(SCR_MAIN_SEARCH_CMD);
mainScreen.setCommandListener(this);
listScreen.addCommand(SCR_IMAGES_BACK_CMD);
listScreen.addCommand(SCR_IMAGES_LOAD_CMD);
listScreen.setCommandListener(this);
imageScreen.addCommand(SCR_SHOW_BACK_CMD);
imageScreen.setCommandListener(this);
}

public void commandAction(Command c, Displayable d) {

if (c == SCR_MAIN_BACK_CMD) {
destroy();
parent.show();
return;
}

if (c == SCR_MAIN_SEARCH_CMD) {
Form f = new Form("Pencarian...");
f.addCommand(SCR_SEARCH_CANCEL_CMD);
f.setCommandListener(this);
f.append(new Gauge("Pencarian Gambar...", false, Gauge.INDEFINITE,
Gauge.CONTINUOUS_RUNNING));

Sistem Nirkabel STMIK Potensi Utama 75


Display.getDisplay(parent).setCurrent(f);
client.requestSearch();
return;
}

if (c == SCR_SEARCH_CANCEL_CMD) {
client.cancelSearch();
Display.getDisplay(parent).setCurrent(mainScreen);
return;
}

if (c == SCR_IMAGES_BACK_CMD) {
client.requestLoad(null);
Display.getDisplay(parent).setCurrent(mainScreen);
return;
}

if (c == SCR_IMAGES_LOAD_CMD) {
Form f = new Form("Proses...");
f.addCommand(SCR_LOAD_CANCEL_CMD);
f.setCommandListener(this);
f.append(new Gauge("Proses tampilkan gambar...", false, Gauge.INDEFINITE,
Gauge.CONTINUOUS_RUNNING));
Display.getDisplay(parent).setCurrent(f);
List l = (List) d;
client.requestLoad(l.getString(l.getSelectedIndex()));
return;
}

if (c == SCR_LOAD_CANCEL_CMD) {
client.cancelLoad();
Display.getDisplay(parent).setCurrent(listScreen);
return;
}

if (c == SCR_SHOW_BACK_CMD) {
Display.getDisplay(parent).setCurrent(listScreen);
return;
}
}

void completeInitialization(boolean isBTReady) {

if (isBTReady) {
StringItem si = new StringItem("Siap memulai pencarian", null);
si.setLayout(StringItem.LAYOUT_CENTER | StringItem.LAYOUT_VCENTER);
mainScreen.append(si);
Display.getDisplay(parent).setCurrent(mainScreen);

Sistem Nirkabel STMIK Potensi Utama 76


return;
}

Alert al = new Alert("Error", "Bluetooth tidak dapat diinisialisasi", null,


AlertType.ERROR);
al.setTimeout(Alert.FOREVER);
Display.getDisplay(parent).setCurrent(al, parent.getDisplayable());
}

void destroy() {
client.destroy();
}

void informSearchError(String resMsg) {


Alert al = new Alert("Error", resMsg, null, AlertType.ERROR);
al.setTimeout(Alert.FOREVER);
Display.getDisplay(parent).setCurrent(al, mainScreen);
}

void informLoadError(String resMsg) {


Alert al = new Alert("Error", resMsg, null, AlertType.ERROR);
al.setTimeout(Alert.FOREVER);
Display.getDisplay(parent).setCurrent(al, listScreen);
}

void showImage(Image img, String imgName) {


imageScreen.deleteAll();
imageScreen.append(new ImageItem(imgName, img,
ImageItem.LAYOUT_CENTER | ImageItem.LAYOUT_VCENTER,
"Downloaded Gambar : " + imgName));
Display.getDisplay(parent).setCurrent(imageScreen);
}

boolean showImagesNames(Hashtable base) {


Enumeration keys = base.keys();

if (!keys.hasMoreElements()) {
informSearchError("Tidak ditemukan");
return false;
}

while (listScreen.size() != 0) {
listScreen.delete(0);
}

while (keys.hasMoreElements()) {
listScreen.append((String) keys.nextElement(), null);
}

Sistem Nirkabel STMIK Potensi Utama 77


Display.getDisplay(parent).setCurrent(listScreen);
return true;
}
}

Untuk membuat koneksi Bluetooth lakukan langkah berikut ini :

a. Server
1. Buka Wireless Toolkit.
2. Buat project baru dgn nama BluetoothServer.
>Tambahkan Bluetooth/OBEX for J2ME(JSR 82) pada tab API Selection pada jendela
Setting.
>Tambahkan pada tab User Defined pada jendela setting spt berikut:

3. Buat direktori images di dalam direktori res, kemudian isi direktori images dgn file-file
gambar: bintang.gif,kupu1.gif,dll. (spt pada lampiran modul)
4. Letakkan file source code yg harus diletakkan dalam direktori project:
>BluetoothServer.java
>UIServer.java
>File Server.java

b. Client

Sistem Nirkabel STMIK Potensi Utama 78


1. Buka Wireless Toolkit.
2. Buat project baru dgn nama BluetoothClient.
>Tambahkan Bluetooth/OBEX for J2ME(JSR 82) pada tab API Selection pada jendela
Setting.
3. Letakkan file source code yg harus diletakkan dalam direktori project:
>File BluetoothClient.java
>File UIClient.java
>File Client.java

PRAKTIKUM 11
Lingkungan Pemrograman Visual Studio Mobile Edition

A. TUJUAN
- Mengetahui cara penggunaan Microsoft Visual Studio 2008
- Dapat menggunakan Microsoft Visual Studio 2008

B. PERANGKAT LUNAK (SOFTWARE)


- Microsoft Visual Studio 2008

C. DASAR TEORI
Document Ini Menjelaskan Tentang pembuatan aplikasi sederhana diatas Windows
Mobile 6.5. Aplikasi yang akan kita buat adalah sebuah aplikasi matematika sederhana untuk
perkalian, penjumlahan dan Pengurangan. Aplikasi kasi sederhana ini mudah2an akan membantu
teman-teman sekalian dalam pengembangan Aplikasi Windows Mobile tingkat Lanjut
berikutnya. Dalam Hand On Lab ini, Kami menggunakan Tool Visual Stuido 2008, .NET
Compact Framework 3.5, Windows Mobile 6 SDK Refresh dan Windows Mobile 6.5 Simulator.
Dalam Pembuatan aplikasi diatas Windows Mobile 6.5, kita harus mempersipakan
beberapa Tools yang akan membantu kita dalam pengembangan. Pastikan di Komputer anda
telah terinstal :
a. Visual Studio 2008 beserta (optional) MSDN Untuk Visual Studio 2008
b. .Net Compact Framework 3.5
c. Windows Mobile 6 SDK Refresh
d. Windows Mobile 6.5 Simulator

D. PRAKTIKUM

Latihan 1
a)Membuat project baru
Jalankan visual studio 2008

Sistem Nirkabel STMIK Potensi Utama 79


Buatlah sebuah project baru
1. Menu file lalu pilih new project
2. Bisa juga dengan meng-klik pada text create -> project
Pilih smart device project lalu isilah properti dari project tersebut
Isilah name (nama project) dengan helloworld

Pilihlah beberapa kriteria berikut


Target platform = windows mobile 6 profesional sdk
.net compact framework version = .net compact framework 3.5
Pilih devise application
1.Device applications, adalah sebuah aplikasi yang berbentuk executable yang bisa di
jalankan diatas windows mobile
2.Library , jika kita ingin membuat librari2 yang dapat di eksekusi oleh aplikasi
executable
3.Console, adalah sebuah aplikasi berbasis executable tetapi berupa console (teks)
4.Control , jika kita ingin membuat control yang dapat kita tempelkan dalam windows
mobile form

Sistem Nirkabel STMIK Potensi Utama 80


Setelah klik ok akan tampak tampilan seperti di bawah ini

b) Mendesign Form
Salah satu component utama dalam pengembangan windows mobile adalah user interface.
Design dari user interface yang menarik tentunya akan membuat aplikasi kita di sukai banyak
orang. Visual studio 2008 telah menyediakan sebuah template untuk design windows mobile
form ini. Sama dengan pengembangan pada non gadget, menu design ini di lengkapi dengan
beberapa tool yang bisa kita gunakan untuk design form seperti toolbox, porperti dan lain
lain. Sekarang mari kita mendesign form untuk project hello world yang sudah kita buat,
sebagai contoh kita akan membuat design form seperti di bawah ini

Sistem Nirkabel STMIK Potensi Utama 81


Double klik command button hello world, ketikkan coding berikut :
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
TextBox1.Text = "Hello World"
End Sub
End Class
PRAKTIKUM 12
Lingkungan Pemrograman Visual Studio Mobile Edition

A. TUJUAN
- Mengetahui cara penggunaan Microsoft Visual Studio 2008
- Dapat menggunakan Microsoft Visual Studio 2008

B. PERANGKAT LUNAK (SOFTWARE)


- JCreator
- Notepad
- Wireless Toolkit 2.5.2
- Microsoft Visual Studio 2008

C. DASAR TEORI
Document Ini Menjelaskan Tentang pembuatan aplikasi sederhana diatas Windows
Mobile 6.5. Aplikasi yang akan kita buat adalah sebuah aplikasi matematika sederhana untuk
perkalian, penjumlahan dan Pengurangan. Aplikasi kasi sederhana ini mudah2an akan membantu
teman-teman sekalian dalam pengembangan Aplikasi Windows Mobile tingkat Lanjut
berikutnya. Dalam Hand On Lab ini, Kami menggunakan Tool Visual Stuido 2008, .NET
Compact Framework 3.5, Windows Mobile 6 SDK Refresh dan Windows Mobile 6.5 Simulator.
Dalam Pembuatan aplikasi diatas Windows Mobile 6.5, kita harus mempersipakan
beberapa Tools yang akan membantu kita dalam pengembangan. Pastikan di Komputer anda
telah terinstal :
e. Visual Studio 2008 beserta (optional) MSDN Untuk Visual Studio 2008
f. .Net Compact Framework 3.5
g. Windows Mobile 6 SDK Refresh
h. Windows Mobile 6.5 Simulator

Sistem Nirkabel STMIK Potensi Utama 82


D. PRAKTIKUM

Latihan 1
c)Membuat project baru
Jalankan visual studio 2008

Buatlah sebuah project baru


3. Menu file lalu pilih new project
4. Bisa juga dengan meng-klik pada text create -> project
Pilih smart device project lalu isilah properti dari project tersebut
Isilah name (nama project) dengan aplikasimatematika

Pilihlah beberapa kriteria berikut


Target platform = windows mobile 6 profesional sdk
.net compact framework version = .net compact framework 3.5
Pilih devise application
5.Device applications, adalah sebuah aplikasi yang berbentuk executable yang bisa di
jalankan diatas windows mobile
6.Library , jika kita ingin membuat librari2 yang dapat di eksekusi oleh aplikasi
executable
7.Console, adalah sebuah aplikasi berbasis executable tetapi berupa console (teks)

Sistem Nirkabel STMIK Potensi Utama 83


8.Control , jika kita ingin membuat control yang dapat kita tempelkan dalam windows
mobile form

Setelah klik ok akan tampak tampilan seperti di bawah ini

d) Mendesign Form
Salah satu component utama dalam pengembangan windows mobile adalah user interface.
Design dari user interface yang menarik tentunya akan membuat aplikasi kita di sukai banyak
orang. Visual studio 2008 telah menyediakan sebuah template untuk design windows mobile
form ini. Sama dengan pengembangan pada non gadget, menu design ini di lengkapi dengan
beberapa tool yang bisa kita gunakan untuk design form seperti toolbox, porperti dan lain

Sistem Nirkabel STMIK Potensi Utama 84


lain. Sekarang mari kita mendesign form untuk project aplikasi matematika yang sudah kita
buat, sebagai contoh kita akan membuat design form seperti di bawah ini

Buka lah Form1.VB dengan cara meng-Klik form1.vb di Solution Explorer, Pada
Properti Windows Rubah lah Beberapa properti
(Name ) : frmAppMat
Text : Aplikasi Matematika
Buat Lah 3 Buah TextBox Pada layar dengan cara drag & Drop dari ToolBox Windows
lalu Tempatkan Seperti Gambar Diatas dan Rubah Masing Properti TextBox
Texbox pertama
(Name) : txtAngka1
BackColor : DarkKhaki
Text :0
Texbox Kedua
(Name) : txtAngka2
BackColor : DarkKhaki
Text :0
Texbox Ketiga
(Name) : txtHasil
BackColor : BurlyWood
Text :0
Enable : False agar tidak bisa di edit
Buatlah 5 buah Label dengan cara drag & Drop dari ToolBox Windows lalu
Tempatkan Seperti Gambar Diatas dan Rubah Masing Properti Label
Label Pertama
(Name) : lblangka1
Text : Angka 1
Label kedua
(Name) : lblMat

Sistem Nirkabel STMIK Potensi Utama 85


Text : ?
Label Ketiga
(Name) : lblangka2
Text : Angka 2
Label ke Empat
(Name) : lblSamaDengan
Text : =
Label Pertama
(Name) : lblHasil
Text : Hasil
Buatlah 4 buah Button dengan cara drag & Drop dari ToolBox Windows lalu
Tempatkan Seperti Gambar Diatas dan Rubah Masing Properti Button
Button Pertama
(Name) : btnKali
Text : Kali
Button Kedua
(Name) : btnJumlah
Text : Jumlah
Button Ketiga
(Name) : btnKurang
Text : Kurang
Button Ke Empat
(Name) : btnBersihkan
Text : Bersihkan

e)Membuat Code
Coding adalah core dari Pemrograman, dan menjadi salah satu syarat agar aplikasi kita bisa
berjalan sesuai dengan yang kita inginkan. Kita bisa menggunakan beberapa bahasa yang di
sediakan oleh visual studio seperti Visual Basic dan C#
Pada HOL ini Kami menggunakan Bahasa Pemrograman Visual Basic
Double Klik Pada Button Kali, lalu Ketik Code di bawah ini
Private Sub btnKali_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnKali.Click
TxtHasil.Text = txtAngka1.Text * txtAngka2.Text
lblMat.Text = "x"
End Sub
Double Klik Pada Button Jumlah, lalu Ketik Code di bawah ini
Private Sub btnJumlah_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnJumlah.Click
TxtHasil.Text = Int(txtAngka1.Text) + Int(txtAngka2.Text)
lblMat.Text = "+"
End Sub
Double Klik Pada Button Kurang, lalu Ketik Code di bawah ini

Sistem Nirkabel STMIK Potensi Utama 86


Private Sub btnKurang_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnKurang.Click
TxtHasil.Text = txtAngka1.Text - txtAngka2.Text
lblMat.Text = "-"
End Sub
Double Klik Pada Button Bersihkan, lalu Ketik Code di bawah ini
Private Sub btnbersihkan_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnbersihkan.Click
TxtHasil.Text = 0
txtAngka1.Text = 0
txtAngka2.Text = 0
lblMat.Text = "?"
End Sub
End Class
f) Menjalankan aplikasi
Setelah semua proses di atas selesai, mari kita jalankan aplikasi yang telah kita buat. Aplikasi
yang kita buat bisa kita jalankan pada beberapa platform yang sudah terinstal di komputer
kita seperti :
Pocket PC 2003
Windows Mobile 6 Standard
Windows Mobile 6 Professional
Windows Mobile 6 Classics
Windows Mobile 6.5 Standard
Windows Mobile 6 Professional
Versi Windows Mobile Lainnya
Beberapa langkah yang harus di perhatikan
Pastikan bahwa code yang anda buat tidak memiliki kesalahan seperti salah ketik dan nama
dari properti2 yang kita buat. Untuk memastikan ini, bisa bisa menuju ke menu build ->
build aplikasimatematika. Dan coba kita liat hasilnya

Jalankan aplikasi dengan cara menekan tombol yang saya lingkari di bawah ini

Kemudian akan di minta untuk memilih platform windows mobile yang sudah terinstall di
komputer kita. Anda bebas memilih yang anda mau

Sistem Nirkabel STMIK Potensi Utama 87


Dan hasilnya akan akan tampil seperti ini

Cobalah dengan memasukkan angka pada textboxt dan tekan button di bawahnya

Sistem Nirkabel STMIK Potensi Utama 88


PRAKTIKUM 13
Pre-Defined Class dan Fungsi dalam Visual Studio Mobile Edition

A. TUJUAN
- Mengetahui dan memahami konsep / fungsi dasar dari class Visual Studio Mobile Edition
- Mengetahui dan memahami dasar dari fungsi dan pemanggilan class pada Visual Studio
Mobile Edition

B. PERANGKAT LUNAK (SOFTWARE)


- JCreator
- Notepad
- Wireless Toolkit 2.5.2

C. DASAR TEORI
Document Ini Menjelaskan Tentang pembuatan aplikasi sederhana diatas Windows
Mobile 6.5. Aplikasi yang akan kita buat adalah sebuah aplikasi matematika sederhana untuk
perkalian, penjumlahan dan Pengurangan. Aplikasi kasi sederhana ini mudah2an akan membantu
teman-teman sekalian dalam pengembangan Aplikasi Windows Mobile tingkat Lanjut
berikutnya. Dalam Hand On Lab ini, Kami menggunakan Tool Visual Studio 2008, .NET
Compact Framework 3.5, Windows Mobile 6 SDK Refresh dan Windows Mobile 6.5 Simulator.

Sistem Nirkabel STMIK Potensi Utama 89


Dalam Pembuatan aplikasi diatas Windows Mobile 6.5, kita harus mempersipakan
beberapa Tools yang akan membantu kita dalam pengembangan. Pastikan di Komputer anda
telah terinstal :
1. Visual Studio 2008 beserta (optional) MSDN Untuk Visual Studio 2008
2. .Net Compact Framework 3.5
3. Windows Mobile 6 SDK Refresh
4. Windows Mobile 6.5 Simulator

D. PRAKTIKUM

Latihan 1
Buatlah project dengan mengetikkan coding ini menjadi satu project, tempatkan file pada
folder src, beri nama project HitTheBirdMidlet.

HitTheBird.java

import java.util.Random;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.LayerManager;
import javax.microedition.lcdui.game.Sprite;
import javax.microedition.lcdui.game.TiledLayer;

public class HitTheBird extends GameCanvas implements Runnable {


public final String GRASS_IMAGE = "/grass.png";
public final String MR_SMITH_IMAGE = "/mrsmith.png";
public final String ROCK_IMAGE = "/rock.png";
public final String BIRD_IMAGE = "/bird.png";
public final String EXPLOSION_IMAGE = "/explosion.png";
//sprite property
private Sprite mrSmith;
private Sprite rock;
private Sprite bird;
private Sprite explosion;
//background
private TiledLayer grassBackground;
//Game Area
private int width;
private int heigth;

//rock property
private int rockXSpeed;
private int rockYSpeed;
private boolean rockDirection;
private boolean rockIsThrown = false;
private final int gravity = 2;

Sistem Nirkabel STMIK Potensi Utama 90


//mr smith property
private final static boolean DIRECTION_LEFT = false;
private final static boolean DIRECTION_RIGHT = true;
private boolean direction;
private Random random;
private LayerManager layermanager;
private HitTheBirdMidlet host;

//bird property
private int birdSpeed = 5;
private boolean birdHitByStone;

private boolean isGameOn = true;

public HitTheBird(HitTheBirdMidlet host) {


super(false);
this.host = host;
setFullScreenMode(true);
random = new Random(System.currentTimeMillis());
}

private int getRandom(int bound) {


return Math.abs(random.nextInt() % bound);
}

private void moveRock() {


if (rockYSpeed > -25) {
rockYSpeed = rockYSpeed - gravity;
}
if (rockDirection == DIRECTION_LEFT) {
rock.move(-rockXSpeed, -rockYSpeed);
} else {
rock.move(rockXSpeed, -rockYSpeed);
}
if (grassBackground.getY() - rock.getRefPixelY() <= 0) {
rockIsThrown = false;
rock.setVisible(false);
}
}

private Image loadImage(String path) {


Image image = null;
try {
image = Image.createImage(path);
} catch (Exception e) {
e.printStackTrace();
}
return image;

Sistem Nirkabel STMIK Potensi Utama 91


}

public void run() {


isGameOn = true;
while (isGameOn) {
getUserInput();
if (rockIsThrown) {
moveRock();
}
try {
Thread.sleep(20);
} catch (Exception e) {
e.printStackTrace();
}
updateScreen();
if(bird.collidesWith(rock, true)&& !birdHitByStone)
birdHitByStone = true;
//jika burung kena misternya, maka game over
if(bird.collidesWith(mrSmith, true)&& !birdHitByStone)
isGameOn = false;
}
host.showMainScreen();//balik ke menu utama
}

private void getUserInput() {


int keyState = getKeyStates();
if ((keyState & RIGHT_PRESSED) != 0) {
if (mrSmith.getX() < width - mrSmith.getWidth()) {
mrSmith.move(1, 0);
mrSmith.setTransform(Sprite.TRANS_NONE);
mrSmith.nextFrame();
direction = DIRECTION_RIGHT;
}
}
if ((keyState & LEFT_PRESSED) != 0) {
if (mrSmith.getX() > 0) {
mrSmith.move(-1, 0);
mrSmith.setTransform(Sprite.TRANS_MIRROR);
mrSmith.nextFrame();
direction = DIRECTION_LEFT;
}
}
if ((keyState & FIRE_PRESSED) != 0) {
if (rockIsThrown == false) {
rockIsThrown = true;
rock.setPosition(mrSmith.getX() + rock.getWidth() / 2, mrSmith.getY() +
rock.getHeight() / 2);
rock.setVisible(true);

Sistem Nirkabel STMIK Potensi Utama 92


rockYSpeed = getRandom(10) + 25;
rockXSpeed = getRandom(4) + 3;
rockDirection = direction;
}
}

private void updateScreen() {


Graphics g = getGraphics();
g.setColor(255, 255, 255);
g.fillRect(0, 0, width, heigth);
layermanager.paint(g, 0, 0);
flushGraphics();
}

public void start() {


heigth = getHeight();
width = getWidth();
layermanager = new LayerManager();
layermanager.setViewWindow(UP, UP, width, heigth);
createBackground();
createMRSmith();
createBird();
createExplosion();
createRock();
new Thread(this).start();
new BirdThread().start();
}

private void createBackground() {


Image bacgroundImage = loadImage(GRASS_IMAGE);
grassBackground = new TiledLayer(8, 1, bacgroundImage, 32, 32);
int numberofTiles = width / 32 + 1;
for (int i = 0; i < numberofTiles; i++) {
grassBackground.setCell(i, 0, 1);
}
grassBackground.setPosition(0, heigth - grassBackground.getHeight());
layermanager.append(grassBackground);
}

private void createMRSmith() {


mrSmith = new Sprite(loadImage(MR_SMITH_IMAGE), 30, 30);
int xPos = width / 2;
int yPos = heigth - mrSmith.getHeight() - grassBackground.getHeight();
mrSmith.setPosition(xPos, yPos);
mrSmith.defineReferencePixel(15, 15);
layermanager.append(mrSmith);

Sistem Nirkabel STMIK Potensi Utama 93


}

private void createBird() {


bird = new Sprite(loadImage(BIRD_IMAGE), 33, 31);
bird.defineReferencePixel(15, 15);
bird.setPosition(0, 30);
layermanager.append(bird);

private void createExplosion() {


explosion = new Sprite(loadImage(EXPLOSION_IMAGE), 75, 75);
explosion.defineReferencePixel(37, 37);
explosion.setVisible(false);
layermanager.append(explosion);
}
private void createRock() {
rock = new Sprite(loadImage(ROCK_IMAGE), 12, 12);
rock.defineReferencePixel(6, 6);
rock.setVisible(false);
layermanager.append(rock);
}

class BirdThread extends Thread {


public void run(){
while(true){
if(birdHitByStone)
explodeBird();
else
moveBird();
try {
Thread.sleep(50);
} catch (Exception e) {
e.printStackTrace();
}
}
}
private void explodeBird(){
if(bird.isVisible()){
bird.setVisible(false);
explosion.setPosition(bird.getX() - bird.getWidth()/2, bird.getY() - bird.getHeight()/2);
explosion.setVisible(true);
explosion.setFrame(0);
}
else{
if(explosion.getFrame() < 11)
explosion.nextFrame();
else{

Sistem Nirkabel STMIK Potensi Utama 94


explosion.nextFrame();
explosion.setVisible(false);
birdHitByStone = false;
bird.setVisible(true);
bird.setPosition(0, 30);
bird.setTransform(Sprite.TRANS_NONE);
if(birdSpeed < 0)
birdSpeed = birdSpeed * -1;
if(birdSpeed <= 15)
birdSpeed +=1;
}
}
}
private void moveBird() {
bird.move(birdSpeed, 0);
bird.nextFrame();
if(bird.getX() <0){
birdSpeed = birdSpeed * -1;
bird.move(0, +10);
bird.setTransform(Sprite.TRANS_NONE);
}
else if (bird.getX() > width - bird.getWidth()){
birdSpeed = birdSpeed * -1;
bird.move(0, +10);
bird.setTransform(Sprite.TRANS_MIRROR);
}
}
}
}

HitTheBirdMidlet.java

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.List;
import javax.microedition.midlet.*;

public class HitTheBirdMidlet extends MIDlet implements CommandListener{


private Display display;
private List startupList;
private Command exit;
private String [] ELEMENTS = {"New","HighScore"};
private HitTheBird game;

Sistem Nirkabel STMIK Potensi Utama 95


public HitTheBirdMidlet(){
startupList = new List("Hit The bird", List.IMPLICIT, ELEMENTS, null);
exit = new Command("Exit", Command.EXIT, 0);
startupList.addCommand(exit);
startupList.setCommandListener(this);
display = Display.getDisplay(this);

public void startApp() {


display.setCurrent(new SpalashScreen(this));
}

public void pauseApp() {


}

public void destroyApp(boolean unconditional) {


}

public void commandAction(Command c, Displayable d) {


if(c == exit && d == startupList)
{
destroyApp(false);
notifyDestroyed();
}
else if (c == List.SELECT_COMMAND && d == startupList)
{
String chosen= startupList.getString(startupList.getSelectedIndex());
if (chosen.equals("New"))
{
game = new HitTheBird(this);
display.setCurrent(game);
game.start();
}
else
{

}
}

}
public void showMainScreen(){
display.setCurrent(startupList);
}
}

Sistem Nirkabel STMIK Potensi Utama 96


mouse.java

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;

public class mouse extends Canvas {

public mouse(){
setFullScreenMode(true);
}
protected void paint(Graphics g) {
//baground
g.setColor(0xff0000);
g.fillRect(0, 0, getWidth(), getHeight());

//muka
g.setColor(0xffffff);
g.fillArc(getWidth()/2 - 50, getHeight()/2 - 50, 100, 100, 0, 360);
//telinga kanan
g.fillArc(getWidth()/2 - 40-20, getHeight()/2 - 50-20, 50, 50, 0, 360);
//telinga kiri
g.fillArc(getWidth()/2 + 40-20, getHeight()/2 - 50-20, 50, 50, 0, 360);

//mata
g.setColor(0x000000);
//kanan
g.fillArc(getWidth()/2 - 20-10, getHeight()/2 - 20-10, 20, 20, 0, 360);
//kiri
g.fillArc(getWidth()/2 + 20-10, getHeight()/2 - 20-10, 20, 20, 0, 360);

//mulut
g.fillArc(getWidth()/2 - 20, getHeight()/2 -20, 50, 50, 180, 180);
}
}

MyCanvas.java

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;

public class MyCanvas extends Canvas {

public MyCanvas() {
setFullScreenMode(true);
}

protected void paint(Graphics g) {

Sistem Nirkabel STMIK Potensi Utama 97


//backround
g.setColor(0xff0000);
g.fillRect(0, 0, getWidth(), getHeight());

//kotak hijau
g.setColor(0x00ff00);
g.fillRect(5, 5, getWidth()-50, getHeight()-50);
g.fillRect(0, 0, getWidth()/2, getHeight());

//lingkaran
g.setColor(0x0000ff);
g.fillArc(getWidth()/2 - 50, getHeight()/2 - 50, 100, 100, 0, 360);

g.setColor(0,0,0);
g.drawRect(15, 15, getWidth()-30, getHeight()-30);

g.drawArc(getWidth()/2 - 50, getHeight()/2 - 50, 100, 100, 30, 180);

g.setColor(0,0,0);
g.drawString("Bola", 20, 20, 0);

g.setFont(Font.getFont(Font.FACE_MONOSPACE,Font.STYLE_UNDERLINED,
Font.SIZE_LARGE));
g.setColor(200,0,0);
g.drawString("dicoba", 40, 40, 0);

}
}

MyForm.java

public class MyForm {


}

SplashScreen.java

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;

public class SplashScreen extends Canvas implements Runnable {


private HitTheBirdMidlet host;

public SplashScreen(HitTheBirdMidlet host){


this.host = host;
setFullScreenMode(true);
new Thread(this).start();

Sistem Nirkabel STMIK Potensi Utama 98


}

public void run() {


try {
Thread.sleep(3000);//3 detik
} catch (Exception ex) {
ex.printStackTrace();
}
dismiss();
}

protected void paint(Graphics g) {


g.setColor(255, 0, 0);
g.fillRect(0, 0, getWidth(), getHeight());
//feel free to draw...
}

private void dismiss() {


//to change to screen
host.showMainScreen();
}
}

Sistem Nirkabel STMIK Potensi Utama 99

Anda mungkin juga menyukai