Bab Tujuan. 1.2 Perangkat Mobile

Ukuran: px
Mulai penontonan dengan halaman:

Download "Bab Tujuan. 1.2 Perangkat Mobile"

Transkripsi

1 Bab 1 Pengembangan Aplikasi Mobile 1.1 Tujuan Dalam bab ini, kita akan mendiskusikan karateristik dari perangkat mobile, dan bagaimana hal tersebut mempengaruhi pengembangan program untuk perangkat ini. Kita akan diperkenalkan kepada Java 2 Mobile Edition (J2ME), termasuk pentingnya configuration dan profilenya. Pada akhir bab ini, pelajar diharapkan dapat menguasai : Mengidentifikasi karakteristik dari perangkat mobile Menjelaskan arsitektur J2ME Mengetahui peran atau aturan configuration dan profile Mengidentifikasi API yang disediakan oleh MIDP Menjelaskan daur hidup MIDlet 1.2 Perangkat Mobile Perangkat mobile memiliki banyak jenis dalam hal ukuran, desain dan layout, tetapi mereka memiliki kesamaan karakteristik yang sangat berbeda dari sistem desktop. Ukuran yang kecil Perangkat mobile memiliki ukuran yang kecil. Konsumen menginginkan perangkat yang terkecil untuk kenyamanan dan mobilitas mereka. Memory yang terbatas Perangkat mobile juga memiliki memory yang kecil, yaitu primary (RAM) dan secondary (disk). Pembatasan ini adalah salah satu faktor yang mempengaruhi penulisan program untuk berbagai jenis dari perangkat ini. Dengan pembatasan jumlah dari memory, pertimbangan-pertimbangan khusus harus diambil untuk memelihara pemakaian dari sumber daya yang mahal ini. Daya proses yang terbatas Sistem mobile tidaklah setangguh rekan mereka yaitu desktop. Ukuran, teknologi dan biaya adalah beberapa faktor yang mempengaruhi status dari sumber daya ini. Seperti harddisk dan RAM, Anda dapat menemukan mereka dalam ukuran yang pas dengan sebuah kemasan kecil. Mengkonsumsi daya yang rendah Pengembangan Perangkat Mobile 1

2 Perangkat mobile menghabiskan sedikit daya dibandingkan dengan mesin desktop. Perangkat ini harus menghemat daya karena mereka berjalan pada keadaan dimana daya yang disediakan dibatasi oleh baterai-baterai. Kuat dan dapat diandalkan Karena perangkat mobile selalu dibawa kemana saja, mereka harus cukup kuat untuk menghadapi benturan-benturan, gerakan, dan sesekali tetesan-tetesan air. Konektivitas yang terbatas Perangkat mobile memiliki bandwith rendah, beberapa dari mereka bahkan tidak tersambung. Kebanyakan dari mereka menggunakan koneksi wireless. Masa hidup yang pendek Perangkat-perangkat konsumen ini menyala dalam hitungan detik kebanyakan dari mereka selalu menyala. Coba ambil kasus sebuah handphone, mereka booting dalam hitungan detik dan kebanyakan orang tidak mematikan handphone mereka bahkan ketika malam hari. PDA akan menyala jika anda menekan tombol power mereka. 1.3 Gambaran J2ME Platform JAVA Java dibuat pada tahun 1991 oleh James Gosling. Pada awalnya diberi nama Oak, dimana untuk menghormati pohon yang ada di luar jendela Gosling. Kemudian namanya diubah ke Java karena telah ada sebuah bahasa yang diberi nama Oak. Motivasi sesungguhnya dari Java adalah kebutuhan akan sebuah bahasa yang bisa digunakan pada berbagai platform yang bisa dimasukkan ke dalam berbagai produk elektronik seperti pemanggang roti dan lemari es. Salah satu dari proyek pertama yang dikembangkan menggunakan JAVA sebuah remote kontrol yang diberi nama Star 7. Pada saat yang sama, World Wide Web dan Internet berkembang sangat cepat. Gosling menyadari bahwa Java dapat digunakan untuk pemrograman Internet. Dengan keluarnya versi 1.2, platform Java telah dipilah-pilah menjadi beberapa edisi : The Standard Edition(J2SE), Enterprise Edition(J2EE), Mobile Edition(J2ME), dan JavaCard API. J2SE Java 2 Platform, Standard Edition J2EE Java 2 Platform, Enterprise Edition J2ME Java 2 Platform, Micro Edition JavaCard Aplikasi Desktop Aplikasi enterprise dengan fokus pada pengembangan sisi webserver, termasuk servlet,jsp,ejb, dan XML Perangkat Mobile Smart Cards Pengembangan Perangkat Mobile 2

3 Servers Optional Packages Desktop machines Optional Packages High-end consumer devices Low-end consumer devices J2EE J2SE Personal Profile Foundation Profile MIDP Smart Cards CDC CLDC Java Card Java Virtual Machine KVM Card VM Java 2 Micro Edition (J2ME) Gambar 1: Platform Java Gambaran J2ME J2ME adalah satu set spesifikasi dan teknologi yang fokus kepada perangkat konsumen. Perangkat ini memiliki jumlah memori yang terbatas, menghabiskan sedikit daya dari baterei, layar yang kecil dan bandwith jaringan yang rendah. Dengan perkembangbiakan perangkat mobile konsumer dari telepon, PDA, kotak permainan ke peralatan-peralatan rumah, Java menyediakan suatu lingkungan yang portable untuk mengembangkan dan menjalankan aplikasi pada perangkat ini. Program J2ME, seperti semua program JAVA adalah diterjemahkan oleh VM. Program-program tersebut dikompile ke dalam bytecode dan diterjemahkan denga Java Virtual Machine(JVM).Ini berarti bahwa program-program tersebut tidak berhubungan langsung dengan perangkat. J2ME menyediakan suatu interface yang sesuai dengan perangkat. Aplikasi-aplikasi tersebut tidak harus dikompile ulang supaya mampu dijalankan pada mesin yang berbeda. Inti dari J2ME terletak pada configuration dan profile-profile. Suatu configuration menggambarkan lingkungan runtime dasar dari suatu sistem J2ME. Ia menggambarkan core library, virtual machine, fitur keamanan dan jaringan. Pengembangan Perangkat Mobile 3

4 Profile Configuration { Applications Optional Packages OEM APIs Libraries Java Virtual Machine Device Operating System Gambar 2: Arsitektur J2ME Sebuah profile memberikan library tambahan untuk suatu kelas tertentu pada sebuah perangkat. profile-profile menyediakan user interface(ui) API,persistence, messaging library, dan sebagainya. Satu set library tambahan atau package tambahan menyediakan kemampuan program tambahan. Pemasukan package ini ke dalam perangkat J2ME dapat berubah-ubah karena tergantung pada kemampuan sebuah perangkat. Sebagai contoh, beberapa perangkat MIDP tidak memiliki Bluetooth built-in, sehingga Bluetooth API tidak disediakan dalam perangkat ini Configuration Suatu configuration menggambarkan fitur minimal dari lingkungan lengkap Java runtime. Untuk menjamin kemampuan portabilitas dan interoperabilitas optimal diantara berbagai macam perangkat yang dibatasi sumber dayanya(memory, prosesor, koneksi yang dibatasi), configuration tidak menggambarkan fitur tambahan. Suatu configuration J2ME menggambarkan suatu komplemen yang minimum dari teknologi JAVA. Adalah merupakan tugas profile-profile untuk menggambarkan tambahan library untuk suatu kategori perangkat tertentu. configuration menggambarkan: Subset bahasa pemrograman JAVA Kemampuan Java Virtual Machine(JVM) Core platform libraries Fitur sekuriti dan jaringan Pengembangan Perangkat Mobile 4

5 1.3.4 Profile Suatu profile menggambarkan set-set tambahan dari API dan fitur untuk pasar tertentu, kategori perangkat atau industri. Sementara configuration menggambarkan library dasar, profile-profile menggambarkan library yang penting untuk membuat aplikasi-aplikasi efektif. Library ini memasukkan user interface, jaringan dan penyimpanan API. 1.4 CLDC The Connected Limited Device Configuration (CLDC) menggambarkan dan menunjuk pada area berikut ini: Fitur Bahasa Java dan Virtual Machine(VM) Library dasar(java.lang.*,java.util.*) Input/Output(java.io.*) Kemanan Jaringan Internationalization Fitur yang hilang Fitur tertentu dari J2SE yang dipindahkan dari CLDC adalah : Finalization of class instances Asynchronous exceptions Beberapa error classes User-defined class loaders Reflection Java Native Interface (JNI) Thread groups dan daemon threads Reflection, Java Native Interface (JNI) dan user-defined class loaders potensial menjadi lubang keamanan. JNI juga membutuhkan memory yang intensif sehingga dimungkinkan untuk tidak mendapat dukungan dari memory rendah sebuah perangkat mobile Karakteristik perangkat CLDC Perangkat yang diincar oleh CLDC mempunyai karateristik sebagai berikut: Memory minimal 192kb untuk platform Java. Prosesor dengan 16 atau 32 bit. Pengembangan Perangkat Mobile 5

6 Mengkonsumsi sedikit daya. Terbatas, koneksi jaringan yang sementara dengan pembatasan bandwith(biasanya wireless). CLDC tidak menggambarkan instalasi dan daur hidup sebuah aplikasi, antarmuka(ui) dan penanganan peristiwa(event handling). Adalah merupakan tugas profile yang berada di bawah CLDC untuk menggambarkan area ini. Secara khusus, spesifikasi MIDP menggambarkan daur hidup aplikasi MIDP (MIDlet), library UI dan event handling(javax.microedition.lcdui.*) Verifikasi Class Spesifikasi CLDC memerlukan semua class untuk melewati proses verifikasi dua tingkat. Verifikasi pertama dilaksanakan diluar perangkat sebelum instalasi pada perangkat. Verifikasi kedua terjadi pada perangkat selama runtime dan dilaksanakan oleh KVM. File.java Install compile (javac) verify (runtime) File.class preverify interpret File.class Development Machine Target Device Gambar 3: Proses Verifikasi dua tingkat Pengembangan Perangkat Mobile 6

7 1.4.4 Generic Connection Framework The Generic Connection Framework menyediakan API dasar untuk koneksi dalam CLDC. Framework ini menyediakan suatu pondasi umum untuk koneksi seperti HTTP, Socket, dan Datagrams.GCF menyediakan suatu set API yang umum dan biasa yang memisahkan semua jenis koneksi. Perlu dicatat bahwa tidak semua jenis koneksi dibutuhkan untuk diterapkan oleh perangkat MIDP. Hirarki interface yang dapat diperluas dari GFC membuat proses penyamarataan menjadi mungkin. Jenis koneksi baru mungkin bisa ditambahkan ke dalam framework ini dengan memperluas hirarki ini. Connection StreamConnectionNotifier DatagramConnection InputConnection OutputConnection StreamConnection ContentConnection Gambar 4: Hirarki koneksi GCF 1.5 CDC Connected Device Configuration (CDC) adalah super set dari CLDC. CDC menyediakan lingkungan Java runtime yang lebih luas dibandingkan CLDC dan lebih dekat kepada lingkungan J2SE. Pengembangan Perangkat Mobile 7

8 CDC Java Virtual Machine (CVM) mendukung penuh Java Virtual Machine (JVM). CDC berisi semua API dari CLDC. CDC menyediakan suatu subset yang lebih besar dari semua class J2SE. Seperti CLDC, CDC tidak menggambarkan setiap class UI. Library UI digambarkan oleh profileprofile di bawah configuration ini. Semua class yang terdapat dalam CDC datang dari package ini: java.io java.lang java.lang.ref java.lang.math java.net java.security java.security.cert java.text java.util java.util.jar java.util.zip CDC juga memasukkan di dalamnya GCF. CDC memerlukan jenis koneksi tambahan seperti file dan dukungan datagram. 1.6 JTWI The Java Technology for the Wireless Industry (JTWI) menetapkan satu set jasa dan spesifikasi standar. Berdasar spesifikasi JTWI, kata kuncinya adalah untuk memperkecil fragmentasi API di dalam pasar telepon mobile, dan untuk mengirim spesifikasi yang dapat diprediksi,spesifikasi yang jelas untuk perangkat pabrik, operator, dan pengembang aplikasi. Dengan penyesuaian kepada JTWI, banyak aplikasi akan berjalan di suatu set yang lebih luas pada perangkat. Perangkat pabrik juga akan beruntung karena sebuah aplikasi yang besar akan tersedia untuk perangkat mereka. Pengembangan Perangkat Mobile 8

9 MIDlets MIDP 2.0 WMA 1.1 MMAPI 1.1 Optional Packages OEM APIs CLDC 1.0 or 1.1 Device Operating System 1.7 MIDP Gambar 5: Komponen JTWI The Mobile Information Device Profile (MIDP) berada di atas dari CLDC. Anda tidak bisa menulis aplikasi mobile hanya dengan menggunakan CLDC API. Anda harus tetap memanfaatkan MIDP yang mendefinisikan UI. Spesifikasi MIDP, kebanyakan seperti CLDC dan API lainnya sudah digambarkan melalui Java Community Process (JCP). JCP melibatkan sebuah kelompok ahli berasal dari lebih dari 50 perusahaan, yang terdiri atas pabrik perangkat mobile, pengembang software. MIDP terus berkembang, dengan versi-versi masa depan yang telah lulus dari proses ketat JCP. Spesifikasi MIDP menggambarkan suatu perangkat MID yang memiliki karakteristikkarateristik ini sebagai batas minimum: Tampilan: Ukuran Layar: 96x54 kedalaman tampilan: 1-bit Ketajaman pixel: sekitar 1:1 Masukan: Satu atau lebih mekanisme user-input: satu keybboard, dua keyboard, atau touch screen Memory: 256 kilobytes of non-volatile memory untuk implementasi MIDP. 8 kilobytes of non-volatile memory for application-created persistent data 128 kilobytes of volatile memory for the Java runtime (e.g., the Java heap) Jaringan: dua jalur, wireless, bandwidth terbatas Sound: Kemampuan untuk memainkan nada-nada Pengembangan Perangkat Mobile 9

10 MIDP menggambarkan model aplikasi, UI API, penyimpanan dan jaringan yang kuat, permainan dan media API, kebijakan keamanan, penyebaran aplikasi dan ketetapan over-theair. 1.8 MIDlet Suatu aplikasi MIDP disebut MIDlet. Perangkat application management software (AMS) berinteraksi langsung dengan MIDlet dengan method MIDlet create, start, pause, dan destroy. MIDlet adalah bagian dari package javax.microedition.midlet. Sebuah MIDlet harus di-extend dengan class MIDlet. Dan dapat meminta parameter dari AMS seperti dirumuskan dalam application descriptor (JAD). Suatu MIDlet tidak harus memiliki (dan memang harus tidak mempunyai) sebuah method public static void main(string[] argv).method tersebut tidak akan dikenal lagi oleh AMS sebagai titik awal sebuah program Siklus MIDlet kehidupan MIDlet dimulai ketika di-instantiate oleh AMS. MIDlet pada awalnya masuk status Pause setelah perintah baru dibuat. AMS memanggil constructor public tanpa argumen dari MIDlet. Jika sebuah exception terjadi dalam constructor, MIDlet memasuki status Destroyed dan membuangnya segera. MIDlet masuk ke dalam status Active atas pemanggilan method startup() oleh AMS. MIDlet masuk ke dalam status Destroyed ketika AMS memanggil method destroyapp(). Status ini juga kembali diakses ketika method notifydestroyed() kembali dengan sukses kepada aplikasi. Dengan catatan bahwa MIDlet hanya bisa memasuki status Destroyed sekali dalam masa hidupnya. Pengembangan Perangkat Mobile 10

11 new destroyapp() startapp() Paused Active pauseapp() Destroyed destroyapp() Gambar 6: Daur hidup MIDlet MIDlet suites Aplikasi-aplikasi MIDlet dibungkus dan dikirim kedalam perangkat sebagai MIDlet suites. Sebuah MIDlet suite terdiri dari Java Archive (JAR) dan sebuah tambahan Java Application Descriptor (JAD). File JAD adalah suatu file teks yang berisi satu set atribut-atribut, beberapa dibutuhkan. 1.9 Latihan Apa keuntungan menggunakan java sebagai pengembangan dan platform runtime untuk perangkat mobile? Aplikasi yang sangat portable Kaya, tergambar dengan baik menghubungkan ke perangkat Penggunaan memori yang rendah(kvm) Lingkungan runtime yang aman aplikasi yang dinamis Pengembangan Perangkat Mobile 11

12 1.9.2 Apa yang memotivasi anda untuk menulis program untuk perangkat mobile? Tantangan tentang penulisan mengoptimalkan aplikasi Pengalaman pelajaran baru Faktor kesenangan Pengembangan Perangkat Mobile 12

13 Bab 2 Memulai Pemrograman Mobile 2.1 Tujuan In this section, we will be delving into writing, building, using the emulator and packaging J2ME applications. The Integrated Programming Environment that we will use is NetBeans 4.1 ( and NetBeans Mobility Pack. Pada bagian ini, kita akan menggali tentang menulis, membangun, menggunakan emulator dan melakukan packaging aplikasi J2ME. Integrated Programming Environment yang akan kita gunakan adalah NetBeans 4.1 ( dan NetBeans Mobility Pack. Setelah menyelesaikan bagian ini, siswa diharapkan mampu: Membuat MIDlet sederhana Membuat sebuah project di NetBeans Membuat sebuah MIDlet menggunakan NetBeans Mobility Pack Menjalankan MIDlet di emulator 2.2 Pengenalan IDE (Integrated Development Environment) adalah sebuah lingkungan pemrograman (programming environment) yang memiliki GUI builder, text atau code editor, compiler dan/atau interpreter dan debugger. Dalam hal ini, NetBeans Mobility Pack juga memiliki device emulator. Fasilitas ini bisa membuat kita melihat program kita pada device yang sesungguhnya. 2.3 "Hello, world!" MIDlet Kita sudah mempelajari pada bagian sebelumnya tentang daur hidup MIDlet (MIDlet's life cycle). MIDlet mulai hidup ketika MIDlet dibuat oleh Application Management System (AMS) pada device. Pengembangan Perangkat Mobile 1

14 Agar kita dapat membuat MIDlet, kita harus membuat subclass dari MIDlet class dari javax.microedition.midlet package. Kita juga harus melakukan override atau implement pada method: startapp(), destroyapp() dan pauseapp(). Method-method tersebut adalah method yang diperlukan oleh AMS untuk menjalankan dan mengkontrol MIDlet. new destroyapp() startapp() Paused Active pauseapp() Destroyed destroyapp() Tidak seperti program Java pada umumnya dimana method main() hanya digunakan sekali pada jalannya program, method startapp() mungkin akan dipanggil lebih dari sekali dalam daur hidup MIDlet. Sehingga Anda diharuskan tidak membuat satu inisialisasi code pada method startapp(). Daripada, anda dapat membuat MIDlet consturctor dan melakukan inisialisasi di situ. Berikut ini adalah code program MIDP pertama kita: /* * HelloMidlet.java * * Created on July 8, 2000, 9:00 AM */ import javax.microedition.midlet.*; import javax.microedition.lcdui.*; /** * JEDI Apprentice Pengembangan Perangkat Mobile 2

15 */ public class HelloMidlet extends MIDlet implements CommandListener { Display display; Command exitcommand = new Command("Exit", Command.EXIT, 1); Alert helloalert; public HelloMidlet(){ helloalert = new Alert( "Hello MIDlet", "Hello, world!", null, AlertType.INFO ); helloalert.settimeout(alert.forever); helloalert.addcommand(exitcommand); helloalert.setcommandlistener(this); public void startapp() { if (display == null){ display = Display.getDisplay(this); display.setcurrent(helloalert); public void pauseapp() { public void destroyapp(boolean unconditional) { public void commandaction(command c, Displayable d){ if (c == exitcommand){ destroyapp(true); notifydestroyed(); // Exit Pengembangan Perangkat Mobile 3

16 Selanjutnya kita akan mempelajari MIDlet pertama kita, difokuskan pada line yang penting dari code diatas: public class HelloMidlet extends MIDlet implements CommandListener { Seperti yang sudah kita katakan sebelumnya, kita harus membuat subclass dari MIDlet untuk membuat MIDP program. Pada line ini, kita sudah membuat subclass dari MIDlet dengan memberikan turunan kelas induk dan menamakannya HelloMIDlet. Display display; Command exitcommand = new Command("Exit", Command.EXIT, 1); Alert helloalert; Line diatas ini adalah variabel properties dari MIDlet. Kita membutuhkan object Display (hanya ada satu diplay per MIDlet) untuk melakukan fungsi menggambar pada layar. exitcommand adalah perintah yang akan kita taruh pada layar agar kita dapat keluar dari program. Jika kita tidak memiliki perintah keluar, maka kita tidak memiliki cara untuk keluar dari MIDlet dengan benar. public HelloMidlet(){ helloalert = new Alert( "Hello MIDlet", "Hello, world!", null, AlertType.INFO ); helloalert.settimeout(alert.forever); helloalert.addcommand(exitcommand); helloalert.setcommandlistener(this); Consturctor melakukan inisialisasi dari object Alert. Kita akan mempelajari lebih lanjut dari Alert class pada bab berikutnya. Method addcommand() pada object Alert memberikan perintah "Exit" pada layar. Method setcommandlistener() memberikan informasi kepada sistem untuk memberikan semua command events ke MIDlet. Pengembangan Perangkat Mobile 4

17 public class HelloMidlet extends MIDlet implements CommandListener { Code "implements CommandListener" adalah untuk command/key presses, sehingga program kita mampu menghandle "command" events. Jika kita melakukan implement CommandListener, kita harus membuat method commandaction(). public void commandaction(command c, Displayable d){ if (c == exitcommand){ destroyapp(true); notifydestroyed(); // Exit commandaction() diatas hanya menghandle request untuk perintah "Exit". Method diatas akan menghentikan program menggunakan notifydestroyed() jika perintah "Exit" dijalankan atau ditekan. public void startapp() { if (display == null){ display = Display.getDisplay(this); display.setcurrent(helloalert); Code diatas adalah bagian awal dari program kita ketika program kita sudah siap untuk ditampilkan oleh AMS. Perlu diingat bahwa method startapp() mungkin / bisa dimasukkan lebih dari sekali seperti pada daur hidup MIDlet. Jika MIDlet berhenti / dihentikan, seperti bila ada telepon masuk, program akan masuk ke state berhenti (pausedapp). Jika panggilan sudah selesai AMS akan kembali ke program dan memanggil method startapp() lagi. Method display.setcurrent() memberikan informasi ke sistem bahwa kita menginginkan object Alert untuk dimunculkan ke layar. Kita dapat mendapat tampilah object dengan memanggil method statis Display.getDisplay(). NetBeans Mobility Pack secara otomatis membuat Java Application Descriptor (JAD) untuk program Anda. NetBeans Mobility Pack menaruh file JAD pada folder "dist" dari folder project. Berikut ini adalah contoh file JAD yang dibuat oleh NetBeans Mobility Pack: MIDlet-1: HelloMidlet,, HelloMidlet MIDlet-Jar-Size: 1415 MIDlet-Jar-URL: ProjectHello.jar Pengembangan Perangkat Mobile 5

18 MIDlet-Name: ProjectHello MIDlet-Vendor: Vendor MIDlet-Version: 1.0 MicroEdition-Configuration: CLDC-1.1 MicroEdition-Profile: MIDP-2.0 Sekarang kita siap untuk mengcompile, melakukan pemaketan (package) pada aplikasi MIDlet pertama kita. 2.4 Compilation dan Packaging MIDlets Sebelum kita menggunakan integrated tools untuk mengcompile dan melakukan packaging aplikasi MIDlet (MIDlet suite), kita akan mencoba menggunakan command line. Aplikasi MIDlet biasanya dipaketkan ke dalam sebuah file yaitu file JAR. File ini adalah file terkompres, seperti file ZIP. Pada implementasinya, Anda dapat membuka file JAR menggunakan program dekompresor file ZIP. Aplikasi MIDlet terdiri dari: File JAR File Java Application Descriptor (JAD) File JAR memiliki: File class Manifest file describing the contents of the archive File manifest yang menjelaskan isi dari arsip Sumber: image/icon, video, data, dll. Digunakan oleh aplikasi File manifest, manifest.mf adalah seperti file JAD. File ini digunakan oleh appication manager dari device. Beberapa field yang diperlukan oleh file manifest adalah: MIDlet-Name MIDlet-Version MIDlet-Vendor MIDlet-<n> (dimana n adalah angka dari 1, untuk setiap MIDlet di file JAR) Pengembangan Perangkat Mobile 6

19 MicroEdition-Profile MicroEdition-Configuration Selanjutnya kita mengcompile file source java: javac -bootclasspath C:\WTK23\lib\cldcapi11.jar;C:\WTK23\lib\midpapi20.jar *.java Program Compiler Java, "javac", harus berada pada path Anda. Jika anda melihat error seperti "cannot find file" atau "not an executable", Anda bisa mengkonsultasikan dengan panduan instalasi untuk distribusi Java development kit Anda tentang bagaimana memasukkan executable PATH dari lokasi tools yang ada di Java. Selanjutnya kita melakukan pre-verify dari file class: preverify -classpath C:\WTK23\lib\cldcapi11.jar;C:\WTK23\lib\midpapi20.jar;. -d. HelloMidlet Preverify sudah berada di wireless toolkit dari java.sun.com. Masukkan perintah ini pada sebuah baris. Langkah terakhir adalah membuat file JAR tersebut: jar cvfm HelloMidlet.jar manifest.txt HelloMidlet.class Program jar sudah berada di Java Development Kit, dan lokasinya harus dimasukkan pada executeable path Anda. Perintah ini akan membuat file JAR dengan nama file HelloMidlet.jar. File manifest.txt namanya diganti dengan manifest.mf pada file JAR. 2.5 Menggunakan Sun Wireless Toolkit Sekarang kita menggunakan Sun Wireless Toolkit untuk mengcompile dan memaketkan aplikasi MIDlet / MIDlet suite (mengandung satu MIDlet) Pengembangan Perangkat Mobile 7

20 Buka ktoolbar (dari Wireless Toolkit distribution): Buat sebuah project: Pada Setting window, anda dapat merubah banyak pilihan-pilihan dari beberapa opsi konfigurasi untuk project Anda. Anda dapat memilih konfigurasi yang akan bekerja, package/api yang diperlukan, konfigurasi Push Registry dan yang lain. Untuk tujuan kita kali ini, kita akan menggunakan konfigurasi default project. Click "OK" untuk selesai membuat project. Pengembangan Perangkat Mobile 8

21 Copy HelloMidlet.java kedalam direktori "src": Pada jendela ini berada di direktori: C:\WTK23\apps\HelloMidlet\src (dimana C:\WTK23 adalah lokasi Anda menginstall wireless toolkit). Click "Build" dan "Run": Pengembangan Perangkat Mobile 9

22 Pengembangan Perangkat Mobile 10

23 Pengembangan Perangkat Mobile 11

24 2.6 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. Langkah 1: Membuat project baru Pengembangan Perangkat Mobile 12

25 Langkah 2: Memilih kategori "Mobile" Pengembangan Perangkat Mobile 13

26 Langkah 3: Memilih "Mobile Application" Pengembangan Perangkat Mobile 14

27 Langkah 4: Beri nama project dan tentukan lokasinya (Hilangkan tanda pada "Create Hello MIDlet", kita akan membuat MIDlet kita sendiri nantinya) Step 5: Memilih Platform (optional) Pengembangan Perangkat Mobile 15

28 Gambar 1: Mobile Project yang baru dibuat (NetBeans Mobility Pack) Pengembangan Perangkat Mobile 16

29 Langkah 6: Membuat sebuah MIDlet baru Pengembangan Perangkat Mobile 17

30 Langkah 7: Memilih MIDP "Category" dan MIDlet "File Type" Pengembangan Perangkat Mobile 18

31 Langkah 8: Memberi nama MIDlet Pengembangan Perangkat Mobile 19

32 Langkah 9 Gambar 2: Membuat MIDlet secara otomatis membuat method MIDlet yang diperlukan Pengembangan Perangkat Mobile 20

33 Langkah 10: Mengganti code yang dibuat secara otomatis dengan code program kita. Pengembangan Perangkat Mobile 21

34 Langkah 11: Mengcompile dan Menjalankan (Run) MIDlet di Emulator Pengembangan Perangkat Mobile 22

35 Langkah 12: Menjalankan MIDlet kita di Emulator Pengembangan Perangkat Mobile 23

36 Gambar 3: Hello World MIDlet Pengembangan Perangkat Mobile 24

37 2.7 Latihan Multiple MIDlets dalam satu MIDlet suite Tambahkan satu MIDlet baru pada project "ProjectHello". Perlu anda catat bahwa NetBeans Mobility Pack secara otomatis menambahkan MIDlet baru pada aplikasi file JAD ketika anda menggunakan "New File..." Wizard Multiple MIDlets dalam satu MIDlet suite menggunakan Wireless Toolkit Gunakan Sun Wireless Toolkit untuk menambahkan MIDlet baru pada aplikasi MIDlet anda. Pengembangan Perangkat Mobile 25

38 Bab 3 High Level User Interface 3.1 Tujuan Pada akhir pembahasan, para pembaca diharapkan dapat: Mengetahui keuntungan dan kerugian dengan menggunakan high-level dan low-level UI classes Mengetahui desain MIDlets menggunakan komponen high-level UI Mengidentifikasi perbedaan sub-classes pada screen Mengetahui perbedaan item-item yang dapat dimasukkan kedalam sebuah object Form 3.2 MIDP User Interface MDIP user interface didesain untuk peralatan mobile. Aplikasi MDIP ditunjukan pada area limited screen. Peralatan memory juga menjadi faktor penting jika perlengkapan mobile hanya memiliki kapasitas memory yang kecil. Dengan berbagai macam peralatan mobile, dari berbagai model mobile phones sampai PDAs, MIDP user interface telah didesain untuk lebih fleksibel dan mudah digunakan dalam berbagai macam peralatan ini. MIDP mempunyai class yang dapat menangani fungsi high-level dan low-level user interface. High-level UI interfaces didesain secara fleksibel. Penampilan dari komponen ini tidak didefinisikan secara spesifik. Penampilan screen yang sebenarnya dari berbagai macam komponen ini digunakan dari satu peralatan ke peralatan yang lain. Tetapi para programmer telah teryakinkan oleh kegunaan dari high-level komponen UI interfaces memiliki persamaan dalam berbagai spesifikasi-pengimplementasi secara keseluruhan. High Level UI highly portable across devices look dan feel sama dengan peralatannya Memiliki interaksi seperti scrolling yang dienkapsulasi Penampilannya tidak dapat digambarkan secara aktual Low-Level UI Memungkinkan semua peralatan Spesifik aplikasi look and feel Pengimplementasiannya harus dengan petunjuk sendiri Penampilannya tidak dapat digambarkan dalam satuan pixel Pengembangan Perangkat Mobile 1

39 High Level UI Tidak memiliki akses untuk peralatan dengan feature yang spesifik Low-Level UI Mengakses masukkan low-level hanya dengan menekan Gambar: Perbedaan High-Level UI dengan Low-Level UI Kapan menggunakan High-Level UI Saat membangun aplikasi text-based yang mudah Saat Anda ingin aplikasi Anda dapat dengan mudah dipertukarkan dengan berbagai macam peralatan (Portabilitas) Saat Anda ingin aplikasi Anda memiliki tampilan yang sama dengan komponen UI yang lain dari berbagai peralatan Saat Anda ingin kode Anda dapat menjadi sesedikit mungkin, ketika sebuah interaksi ditangani oleh API Kapan menggunakan Low-Level UI Saat Anda memerlukan sebuah high-level untuk mengkontrol tampilan dari suatu aplikasi Saat aplikasi Anda membutuhkan tempat yang tepat dari elemen-elemen yang ada pada screen Saat membuat game secara grafik; meskipun Anda tetap dapat menggunakan highlevel UI pada menu game, hal tersebut lebih disarankan untuk membuat menu UI Anda sendiri untuk menghindari seamless atmosphere bagi para user Saat sebuah aplikasi membutuhkan akses ke low-level yang memiliki inputan seperti key presses Jika aplikasi Anda akan diimplementasikan pada layar navigasi Anda sendiri Display Inti dari MIDP user interfaces adalah display. Yang merupakan satu-satunya kemudahan dari Display per MIDlet. MIDlet dapat mendapatkan referensi Display object dengan menggunakan method static Display.getDisplay(), melewatkan referensi tersebut ke MIDlet instance. MIDlet dijamin dengan display object tidak akan berubah dengan adanya eksistensi instance MIDlet. Hal ini berarti bahwa variebel dikembalikan (returned) ketika Anda memanggil getdisplay() dan tidak akan berpengaruh jika anda memenggilnya dengan startapp() atau destroyapp() (Lihat pada gambar Midlet Life Cycle). Pengembangan Perangkat Mobile 2

40 3.2.2 Displayable Hanya satu displayable yang ditampilkan pada satu waktu. Secara langsung, displayable tidak ditampilkan pada layar. Seuabh displayable dapat ditampilkan dengan memanggil method setcurrent() dari Display instance. Method setcurrent() harus dipanggil pada saat memulai aplikasi, dengan kata lain sebuah screen kosong akan ditampilkan atau aplikasi tersebut tidak akan dijalankan. Gambar: MIDlet Life Cycle Method startapp dari MIDlet merupakan suatu tempat dimana Anda dapat menaruh method pemanggil setcurrent(). Tetapi Anda harus mempertimbangkan bahwa dalam MIDlet startapp() dapat dipanggil lebih dari satu kali. Untuk memberhentikan MIDlet sementara waktu dapat dipause dengan memanggil fungsi pauseapp(), dengan adanya incoming call, memungkinkan startapp() dipanggil lagi (setelah ada telepon masuk). Maka dengan memanggil setcurrent() pada method pada startapp(), dan ada kemungkinan layar akan menjadi gelap (blank) pada screen displayed yang sebelumnya, sampai adanya penghentian sementara (pause by the phone call). Sebuah displayable dapat memiliki nama, beberapa perintah(command), commandlistener dan Ticker. Pengembangan Perangkat Mobile 3

41 Gambar: Properti dari sebuah Displayable Title Sebuah Displayable memiliki title yang berhubungan dengan dirinya sendiri. Posisi dan penampilan dari title tersebut merupakan piranti spesifik yang hanya dapat ditentukan oleh peralatan dari aplikasi yang sedang dijalankan. Sebuah title ditampilkan pada Displayable dengan memanggil settitle().dengan memanggil method ini maka seketika akan meng-update title pada Displayable. Jika pada saat Displayable ditampilkan pada layar, MIDP specification states menyebutkan bahwa title harus dirubah dengan implementasi Memungkinkan untuk dilakukan dengan cepat. Memberi parameter null pada settitle() berarti menghapus title pada Displayable. Merubah atau menghapus sebuah title dari Displayable dapat mempengaruhi ukuran area untuk isi dari Displayable tersebut.jika terjadi perubahan ukuran area terjadi, MIDlet akan diberitahu dengan memanggil kembali method sizechanged() Command Dengan adanya kekurangan ukuran pada screen, MIDP tidak menggambarkan sebuah menu bar. Untuk menggantikan menu bar, MIDlet memiliki Commands. Biasanya Command diimplementasikan sebagai soft key atau item dalam sebuah menu. Object Command hanya berisi informasi tentang action yang harus dikerjakan pada saat Command diaktifkan. Dia tidak berisikan kode yang akan dieksekusi pada saat Pengembangan Perangkat Mobile 4

42 Command tersebut dipilih. Properti CommandListener dari Displayable berisi action yang akan dieksekusi saat Command diaktifkan. CommandListener merupakan interface yang spesifik pada single method : public void commandaction(command command, Displayable displayable) Mapping dari Commands pada peralatan bergantung pada nomer yang telah ditetapkan atau programable button pada peralatan. Jika nomer dari Command tidak benar pada semua button, maka memungkinkan peralatan menaruh beberapa atau semua Command pada menu dan peta pada menu dan button akan diberi label Menu. Command exitcommand = new Command("Exit", Command.EXIT, 1); Command newcommand = new Command("New Item", Command.OK, 1); Command renamecommand = new Command("Rename Item", Command.OK, 1); Command deletecommand = new Command("Delete Item", Command.OK, 1);... list.addcommand(exitcommand); list.addcommand(newcommand); list.addcommand(renamecommand); list.addcommand(deletecommand); Gambar: Listing program untuk mapping Commands kedalam Displayable Pengembangan Perangkat Mobile 5

43 Gambar: Contoh tampilan dari multiple Commands Command memiliki sebuah short label, long label, tipe dan prioritas. Command Label Diasumsikan bahwa screen yang berukuran kecil dari target sebuah peralatan, selalu menjadi faktor ketika membangun aplikasi MIDP. Asumsi ini juga dapat diterapkan untuk Command label. Command label harus singkat, namun deskriptif, maka hal itu harus benar pada screen dan tetap dapat dipahami oleh user. Ketika long label ditentukan, hal tersebut akan ditampilkan kapan saja pada saat sebuah implementasi sistem dilihat secara sesuai. Tidak ada pemanggilan API yang menetapkan label yang akan ditampilkan. Hal tersebut juga memungkinkan bahwa sebuah Command akan menampilkan short label pada saat Command lain pada screen yang sama menampilkan long labels. Command Type Sebuah Command yang diperkenalkan pada peralatan sering disebut device-dependent. Seorang programer dapat mengetahui spesifikasi tipe dari Command. Tipe ini akan ditampilkan sebagai hint pada tempat Command diletakkan. Berbagai macam tipe Command: Command.OK, Command.BACK, Command.CANCEL, Command.EXIT, Command.HELP, Command.ITEM, Command.SCREEN, Command.STOP Pengembangan Perangkat Mobile 6

44 Gambar: Tampilan Command yang berbeda pada implementasi telepon yang berbeda Command Priority Aplikasi dapat menetapkan spesifikasi Command yang penting pada priority property. Hal ini merupakan integer property dan nilai rendah yang sangat penting. Priority property juga hanya sebuah hint pada tempat dimana seharusnya Command ditempatkan. Biasanya implementasi menentukan posisi dari Command oleh tipenya. Jika terdapat lebih dari satu Command dari tipe yang sama, secara normal priority akan mempertimbangkan penempatan Command CommandListener CommandListener merupakan interface dengan single method: void commandaction(command command, Displayable displayable) Method commandaction() akan dipanggil jika Command dipilih. Variabel Command merupakan referensi Command yang telah dipilih. Tampilan merupakan Displayable (atau screen) dimana Command ditempatkan dan saat action pilih terjadi. CommandAction() harus dikembalikan dengan seketika, jika tidak maka pengeksekusian aplikasi akan diblock. Hal ini dikarenakan, spesifikasi MIDP tidak memerlukan implementasi untuk membuat sebuah pembatas untuk pengiriman event. Pengembangan Perangkat Mobile 7

45 3.2.6 Ticker Ticker adalah sebuah baris dari text yang dapat discrolling secara terus-menerus pada display. Method konstruktor dari ticker menerima text string untuk ditampilkan. Hal tersebut hanya memiliki dua method lain, yaitu getter dan setter untuk text ini: String getstring() dan void setstring(string text). Tidak ada cara lain pada sebuah aplikasi untuk mengontrol kecepatan dan arah dari scrolling text. Scrolling tidak dapat dipause atau distop. Jika spasi diletakkan pada text, hal tersebut tidak akan ditampilkan pada layar. Semua baris text akan ditampilkan sebagai single line dari scrolling text. Sebuah ticker dapat dipasang pada Displayable dengan memanggil setticker(). Jika ticker telah ada pada Displayable, maka akan diganti oleh ticker yang baru yang terdapat dalam parameter. Memberi parameter null pada setticker akan mengganti semua ticker yang telah dimasukkan pada Displayable. Menghapus ticker dari Displayable dapat menyebabkan perubahan ukuran area dari isi Displayable tersebut. Jika perubahan ukuran area terjadi, maka MIDlet akan memanggil sebuah ukuran dengan method sizechanged(). Pada ticker object Displayable boleh berbagi suatu kejadian(action) Screen Screen merupakan inti abstrak class yang digunakan untuk high-level UI ketika canvas merupakan Displayable abstrak class untuk low-level UI. Berikut ini empat subclasses dari abstract class screen : Form, TextBox, List dan Alert. Pengembangan Perangkat Mobile 8

46 Gambar: Displayable Class Heirarchy Item Items merupakan komponen yang dapat diletakan kedalam container, seperti Form atau Alert. Sebuah item dapat memiliki property seperti dibawah ini: Property Default Value Label Dikelompokan pada subclass konstruktor Commands - defaultcommand null ItemCommandListener null Layout directive LAYOUT_DEFAULT Preferred width and height -1 (unlocked) Pengembangan Perangkat Mobile 9

47 Gambar: Item Class Heirarchy Spesifikasi layout dari item dengan Form. Direktif layout dapat dikombinasikan menggunkan bitwise atau operasi ( ). Bagaimanapun juga, beberapa direktif bersifat mutually exclusive. Berikut ini direktif horizontal alignment yang mutually exclusive: LAYOUT_LEFT LAYOUT_RIGHT LAYOUT_CENTER Berikut ini direktif vertical alignment yang juga mutually exclusive: LAYOUT_TOP LAYOUT_BOTTOM LAYOUT_VCENTER Berikut ini layout yang lain dari direktif (tidak mutually exclusive): LAYOUT_NEWLINE_BEFORE LAYOUT_NEWLINE_AFTER LAYOUT_SHRINK LAYOUT_VSHRINK LAYOUT_EXPAND LAYOUT_VEXPAND LAYOUT_2 3.3 Alert Alert merupakan sebuah screen yang dapat menampilkan text dan gambar. Alert merupakan komponen untuk menampilkan error dan warning, display text dan informasi gambar atau untuk mendapatkan informasi dari user. Alert ditampilkan untuk spesifikasi peeriode dari waktu. Waktu di-set menggunakan method settimeout() dan method tersebut dispesifikasikan dalam unit millliseconds. Hal tersebut dapat dibuat untuk ditampilkan hingga user mengaktifkan perintah ( Done ) dengan menspesifikasikan spesial timeout dari Alert.FOREVER. Pengembangan Perangkat Mobile 10

48 Alert juga dapat menampilkan komponen Gauge (Lihat pada Gauge item) sebagai indikator. Ketika alert berisi text yang tidak sesuai dengan screenful dan harus discroll, maka secara otomatis alert menge-set ke modal(timeout di set kepada Alert.FOREVER). import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class AlertExample extends MIDlet implements CommandListener { Display display; Form mainform; Command exitcommand = new Command("Exit", Command.EXIT, 0); Command okcommand = new Command("Ok", Command.OK, 0); Gauge gauge = new Gauge(null, false, 5, 0); Command[] commands = { new Command("Alarm", Command.OK, 0), new Command("Confirmation", Command.OK, 0), new Command("Info", Command.OK, 0), new Command("Warning", Command.OK, 0), new Command("Error", Command.OK, 0), new Command("Modal", Command.OK, 0) ; Alert[] alerts = { new Alert("Alarm Alert", "Example of an Alarm type of Alert", null, AlertType.ALARM), new Alert("Confirmation Alert", "Example of an CONFIRMATION type of Alert", null, AlertType.CONFIRMATION), new Alert("Info Alert", "Example of an INFO type of Alert", null, AlertType.INFO), new Alert("Warning Alert", "Example of an WARNING type of Alert, w/ gauge indicator", null, AlertType.WARNING), Pengembangan Perangkat Mobile 11

49 ; new Alert("Error Alert", "Example of an ERROR type of Alert, w/ an 'OK' Command", null, AlertType.ERROR), new Alert("Modal Alert", "Example of an modal Alert: timeout = FOREVER", null, AlertType.ERROR), public AlertExample(){ mainform = new Form("JEDI: Alert Example"); mainform.addcommand(exitcommand); for (int i=0; i< commands.length; i++){ mainform.addcommand(commands[i]); mainform.setcommandlistener(this); // Menambah sebuah gauge dan menge-set timeout (milliseconds) alerts[3].setindicator(gauge); alerts[3].settimeout(5000); // Menambah sebuah command untuk Alert alerts[4].addcommand(okcommand); // Menge-Set alert alerts[5].settimeout(alert.forever); public void startapp() { if (display == null){ display = Display.getDisplay(this); display.setcurrent(mainform); public void pauseapp() { Pengembangan Perangkat Mobile 12

50 public void destroyapp(boolean unconditional) { public void commandaction(command c, Displayable d){ if (c == exitcommand){ destroyapp(true); notifydestroyed(); // Exit for (int i=0; i<commands.length; i++){ if (c == commands[i]){ display.setcurrent(alerts[i]); INFO Alert Modal Alert Alert w/ gauge indicator Gambar: Perbedaan tipe-tipe Alert. 3.4 List List merupakan subclass dari screen yang berisi sebuah daftar dari suatu pilihan. Sebuah list dapat dibagi menjadi tiga tipe: IMPLICIT, EXCLUSIVE atau MULTIPLE. Pengembangan Perangkat Mobile 13

51 Jika List bertipe IMPLICIT dan user mengeksekusi tombol select, commandaction() dari list commandlistener akan dipanggil. Default perintahnya adalah List.SELECT_COMMAND. Untuk tipe IMPLICIT dan EXCLUSIVE, GetSelectedIndex() mengembalikan index dari element yang dipilih. Untuk tipe MULTIPLE, getselectedflags() mengembalikan sebuah array dari boolean yang berisi state dari elemen-elemen. isselected(int index) mengembalikan state dari elemen dalam pemberian posisi index. import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class ListExample extends MIDlet implements CommandListener { Display display; List list; Command exitcommand = new Command("Exit", Command.EXIT, 1); Command newcommand = new Command("New Item", Command.OK, 1); Command renamecommand = new Command("Rename Item", Command.OK, 1); Command deletecommand = new Command("Delete Item", Command.OK, 1); Ticker ticker = new Ticker( "JEDI - Java Education and Development Initiative"); public ListExample(){ list = new List("JEDI: List Example", List.IMPLICIT); list.append("list Item #1", null); list.append("list Item #2", null); list.append("list Item #3", null); list.setticker(ticker); list.addcommand(exitcommand); list.addcommand(newcommand); list.addcommand(renamecommand); list.addcommand(deletecommand); list.setcommandlistener(this); Pengembangan Perangkat Mobile 14

52 public void startapp() { if (display == null){ display = Display.getDisplay(this); display.setcurrent(list); public void pauseapp() { public void destroyapp(boolean unconditional) { public void commandaction(command c, Displayable d){ if (c == exitcommand){ destroyapp(true); notifydestroyed(); // Exit if (c == List.SELECT_COMMAND){ int index = list.getselectedindex(); String currentitem = list.getstring(index); // menjalanjan suatu hal Pengembangan Perangkat Mobile 15

53 List.IMPLICIT List.EXCLUSIVE List.MULTIPLE Gambar: Tipe-tipe List 3.5 Text Box TextBox merupakan sub-class dari screen yang dapat digunakan untuk mendapatkan input text dari user. Hal ini memperbolehkan user untuk memasukan dan mengedit text. TextBox hampir sama dengan TextField(Lihat pada item TextField) karena dia dapat memiliki input constraint dan input modes. Perbedaannya dengan TextField adalah user dapat memasukan garis baru(ketika input constraint di-set untuk semua ANY ). Isi dari TextBox dapat diambil kembali dengan menggunakan method getstring(). Pengembangan Perangkat Mobile 16

54 Gambar:TextBox tipe ANY (multi-line) Gambar: TextBox dengan modifikasi PASSWORD 3.6 Form Form merupakan subclass dari Screen. Form merupakan conntainer untuk item subclass, seperti TextField, StringItem, ImageItem, DateField dan ChoiceGroup. Dia menghandle layout untuk komponen ini. Dan juga menghandle traversal antar komponen-komponen dan scrolling dari Screen. Item ditambahkan dan dimasukkan ke dalam sebuah Form menggunakan method append() dan insert(), berturut-turut. Item direferensikan menggunakan index zero-based. 3.7 ChoiceGroup Item Choicegroup merupakan group dari selectable choice. Sebuah choice boleh berisi sebuah text, gambar atau kedua-duanya. Choice boleh EXCLUSIVE (hanya satu pilihan yang dapat dipilih) atau MULTIPLE (banyak pilihan yang dapat dipilih pada suatu waktu). Jika ChoiceGroup bertipe POPUP, hanya satu choice yang ditampilkan. Popup selection akan ditampilkan ketika item ini dipilih. Dari popup seleksi ini, user diperbolehkan memilih pilihannya. Choice yang ditampilkan selalu choice yang dipilih. Pengembangan Perangkat Mobile 17

55 GetSelectedIndex() mengembalikan nilai index pada element dari ChoiceGroup yang dipilih. GetSelectedFlags() mengembalikan sebuah array dariboolean yang merespon elemen dari Choicegroup. isselected(int index) mengembalikan state dari elemen yang diberikan oleh posisi index. choiceform = new Form("Choice Group Types"); choiceform.addcommand(exitcommand); choiceform.setcommandlistener(this); choiceexclusive = new ChoiceGroup("Exclusive", Choice.EXCLUSIVE); choiceexclusive.append("male", null); choiceexclusive.append("female", null); choiceform.append(choiceexclusive); choicemultiple = new ChoiceGroup("Multiple", Choice.MULTIPLE); choicemultiple.append("apple", null); choicemultiple.append("orange", null); choicemultiple.append("grapes", null); choiceform.append(choicemultiple); choicepopup = new ChoiceGroup("Popup", Choice.POPUP); choicepopup.append("asia", null); choicepopup.append("europe", null); choicepopup.append("americas", null); choiceform.append(choicepopup); Pengembangan Perangkat Mobile 18

56 Gambar: Tipe dari Choice Group 3.8 Date Field Komponen DateField digunakan untuk masukan tanggal dan waktu dari user. DateField dapat diisi dengan date entry(mode DATE), time entry (mode TIME) atau keduanya (mode DATE_TIME). Method getdate() mengembalikan nilai suatu item. Dia akan mengembalikan nilai null jika item tidak diinialisasi terlebih dahulu. Jika mode dari DateField adalah DATE, komponen time dari pengembalian nilai akan di-set menjadi nol. Jika modenya adalah TIME, komponen date akan di-set menjadi Januari 1, dateform = new Form("DateField Modes"); dateform.addcommand(backcommand); dateform.setcommandlistener(this); DateField dateonly = new DateField("Birthday (DATE)", DateField.DATE); DateField timeonly = new DateField("Set Alarm (TIME)", DateField.TIME); Pengembangan Perangkat Mobile 19

57 DateField datetime = new DateField("Departure (DATE_TIME)", DateField.DATE_TIME); dateform.append(dateonly); dateform.append(timeonly); dateform.append(datetime); DateField input modes Selecting a date Time input Gambar: mode DateField dan input screens 3.9 String Item StringItem merupakan komponen read-only. Dia terdiri dari label dan text. Secara bebas StringItem menerima tampilan mode parameter. Tampilan dari mode dapat berupa Item.PLAIN, Item.HYPERLINK atau Item.BUTTON. Jika tampilan sebuah mode bertipe HYPERLINK atau BUTTON, default Command dan ItemCommandListener harus di-set didalam Item. stringform = new Form("StringField Modes"); stringform.addcommand(exitcommand); stringform.setcommandlistener(this); Pengembangan Perangkat Mobile 20

58 StringItem plain = new StringItem("Plain", "Plain Text", Item.PLAIN); StringItem hyperlink = new StringItem("Hyperlink", " Item.HYPERLINK); hyperlink.setdefaultcommand(new Command("Set", Command.ITEM, 0)); hyperlink.setitemcommandlistener(this); StringItem button = new StringItem("Button", "Click me", Item.BUTTON); button.setdefaultcommand(new Command("Set", Command.ITEM, 0)); button.setitemcommandlistener(this); stringform.append(plain); stringform.append(hyperlink); stringform.append(button); Gambar: StringItem Pengembangan Perangkat Mobile 21

59 3.10 Image Item ImageItem merupakan Image sederhana yang dapat dimasukan kedalam komponen, seperti Form. ImageItem menerima item layout sebagai parameter (Lihat pada bagian Item): public ImageItem( String label, Image img, int layout, String alttext) Konstruktor yang lain menerima tampilan mode yang bertipe Item.PLAIN, Item.HYPERLINK atau Item.BUTTON (Lihat pada bagian StringItem): public ImageItem(String label, Image image, int layout, String alttext, int appearancemode) imageform = new Form("ImageItem"); imageform.addcommand(backcommand); imageform.setcommandlistener(this); try { Image img = Image.createImage("/jeni.png"); ImageItem image = new ImageItem("JENI", img, Item.LAYOUT_CENTER, "jeni logo"); imageform.append(image); catch (Exception e){e.printstacktrace(); File jeni.png sangat penting untuk dimasukan kedalam project dengan menggunakan operating system's manager dan menaruh image tersebut kedalam direktori project dibawah subdirektori src. Kemudian project direfresh dengan mengklik kanan nama project dan pilih Refresh Folders. Pengembangan Perangkat Mobile 22

60 Gambar: ImageItem Pengembangan Perangkat Mobile 23

61 3.11 Text Field TextField merupakan Item dimana user dapat memasukan encode. Beberapa batasan exclusive yang dapat di-set yaitu: TextField.ANY TextField. ADDR TextField.NUMERIC TextField.PHONENUMBER TextField.URL TextField.DECIMAL Masukan tersebut juga dapat memiliki macam-macam modifikasi: TextField.PASSWORD TextField.UNEDITABLE TextField.SENSITIVE TextField.NON_PREDICTIVE TextField.INITIAL_CAPS_WORD TextField.INITIAL_CAPS_SENTENCE Modifikasi dapat di-set dengan menggunakan bit-wise OR ( ) operator (atau toggled menggunakan bit-wise XOR operator ^) pada input constraint. Sebagai konsekuensinya, modifikasi dapat diperoleh dari pengembalian nilai dari getconstraint() bit-wise operator AND(&). Sejak nilai modifikasi juga dikembalikan oleh getconstraint(), Masukan main constraint dapat diekstrak dengan menggunakan bit-wise operator AND dengan TextBox.CONSTAINT_mask dan nilai pengembalian dari getconstaints(). GetString() mengembalikan isi dari TextField sebagai nilai sebuah String. textform = new Form("TextField Types"); textform.addcommand(backcommand); textform.setcommandlistener(this); TextField ANY = new TextField("ANY", "", 64, TextField.ANY); TextField ADDR = new TextField(" ADDR", "", 64, TextField. ADDR); TextField NUMERIC = new TextField("NUMERIC", "", 64, TextField.NUMERIC); TextField PHONENUMBER = Pengembangan Perangkat Mobile 24

62 new TextField("PHONENUMBER", "", 64, TextField.PHONENUMBER); TextField URL = new TextField("URL", "", 64, TextField.URL); TextField DECIMAL = new TextField("DECIMAL", "", 64, TextField.DECIMAL); textform.append(any); textform.append( addr); textform.append(numeric); textform.append(phonenumber); textform.append(url); textform.append(decimal); Gambar: TextField Items Pengembangan Perangkat Mobile 25

63 3.12 Latihan List Dinamis Buatlah sebuah MIDlet yang memiliki List IMPLICIT sebagai Screen main. Masukan tiga Command kedalam List ini - Add Item, Remove Item dan Exit. Comman Add Item akan memberikan layanan pada user untuk memasukan list menggunakan TextBox, kemudian insert item tersebut sebelum current item yang dipilih dari list. Remove Item akan menghapus currently selected list item (getselectedindex). Command Exit akan keluar dari program. Pengembangan Perangkat Mobile 26

64 Bab 4 Low Level User Interface 4.1 Tujuan Setelah mempelajari bab ini, Pelajar diharapkan mampu untuk : Memahami event handling level rendah dalam MIDP Menggambar dan menampilkan teks, gambar, garis, kotak, dan sudut Menentukan warna, huruf, dan coretan untuk operasi menggambar Memahami dan menggunakan class Canvas dan Graphic Mengetahui bagaimana menggunakan GAME API Menggambar grafik berskala 4.2 Pengenalan Pada bab sebelumnya, kita telah membahas tentang bagaimana cara membuat user interface level tinggi seperti list, form, dan field input. Mereka bersifat user interface level tinggi dan programmer tidak perlu khawatir tentang menggambar pixel layar atau mengatur posisi teks pada layar. Semua program telah menetapkan jenis komponen dan label elemen. Sistem tersebut akan menangani gambar pada layar, scrolling dan layout. Satu kelemahan ketika hanya menggunakan komponen user interface level tinggi adalah program tidak memiliki kendali penuh sebuah layar. Ada saat dimana kita ingin menggambar sebuah garis, gambar beranimasi dan mempunyai kendali untuk mengatur pixel pada layar. Pada bab ini, kita akan berhadapan langsung dengan layar. Kita akan mempelajari class Canvas, dimana akan menjadi pendukung dari proses menggambar kita. Kita juga akan menyelidiki ke dalam class Graphic, dimana memiliki metode untuk menggambar garis, kotak, sudut, dan teks. Kita juga akan membahas huruf, warna dan gambar. Pengembangan Perangkat Mobile 1

65 4.3 Canvas Canvas adalah subclass dari Displayable. Itu adalah sebuah class abstrak yang harus di-extend sebelum sebuah aplikasi dapat menggunakan fungsi-fungsi yang ada. Canvas dapat digabungkan dengan subclass Displayable level tinggi yaitu Screen. Program dapat pindah ke dan dari Canvas dan Screen. Canvas menggambarkan metode-metode event handling kosong. Aplikasi harus mengesampingkan mereka untuk handle event. Class Canvas menggambarkan sebuah metode abstrak yang disebut paint(). Aplikasi menggunakan class Canvas harus menyediakan sebuah implementasi untuk metode paint() Sistem Koordinat Sistem koordinat dari Canvas adalah berbasis nol. Koordinat x dan y dimulai dengan nol. Pojok kiri atas dari Canvas berkoordinat (0,0). Koordinat x bertambah dari kiri ke kanan. Sedangkan koordinat y bertambah dari atas ke bawah. Metode getwidth() dan getheight() mengembalikan nilai lebar dan tinggi berturut-turut. Pojok kanan bawah pada layar memiliki koordinat (getwidth()-1,getwidth()-1). Setiap perubahan yang terjadi pada ukuran yang diberikan untuk area menggambar pada Canvas dilaporkan kepada aplikasi oleh metode sizechanged(). Ukuran yang tersedia pada Canvas mungkin saja berubah jika ada pergantian antara mode layar full dan normal atau penambahan dan pengurangan sebuah komponen seperti Command. Pengembangan Perangkat Mobile 2

66 (0,0) increasing x value increasing y value (getwidth()-1,getheight()-1) Gambar 1: Sistem Koordinat Pengembangan Perangkat Mobile 3

67 4.3.2 Hello,World! Gambar 2: Hello World MIDlet menggunakan canvas import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class HelloCanvasMIDlet extends MIDlet { private Display display; HelloCanvas canvas; Command exitcommand = new Command("Exit", Command.EXIT, 0); public void startapp() { if (display == null){ canvas = new HelloCanvas(this, "Hello, world!"); display = Display.getDisplay(this); Pengembangan Perangkat Mobile 4

68 display.setcurrent(canvas); public void pauseapp() { public void destroyapp(boolean unconditional) { protected void Quit(){ destroyapp(true); notifydestroyed(); class HelloCanvas extends Canvas implements CommandListener { private Command exitcommand = new Command("Exit", Command.EXIT, 0); private HelloCanvasMIDlet midlet; private String text; public HelloCanvas(HelloCanvasMIDlet midlet, String text) { this.midlet = midlet; this.text = text; addcommand(exitcommand); setcommandlistener(this); Pengembangan Perangkat Mobile 5

69 protected void paint(graphics g) { // membersihkan layar dengan mengisi semua layar dengan warna putih g.setcolor(255, 255, 255 ); g.fillrect(0, 0, getwidth(), getheight()); // mengatur warna tulisan dengan warna hitam g.setcolor(0, 0, 0); // dan menulis sebuah text g.drawstring(text, getwidth()/2, getheight()/2, Graphics.TOP Graphics.HCENTER); public void commandaction(command c, Displayable d) { if (c == exitcommand){ midlet.quit(); Dengan midlet Hello,World!, kita membuat sebuah class yang ber-extend Canvas class HelloCanvas extends Canvas implements CommandListener { Kemudian kita menambahkan perintah ( Exit ) dan mengatur command listener nya. addcommand(exitcommand); setcommandlistener(this); Kita menciptakan command listener dengan mengimplementasikan class CommandListener. Ini berarti membuat class yang memiliki metode commandaction. Pengembangan Perangkat Mobile 6

70 class HelloCanvas extends Canvas implements CommandListener {... public void commandaction(command c, Displayable d) {... Inti dari program ini adalah metode paint(). Set pertama dari pemanggilan metode adalah membersihkan layar. g.setcolor(255, 255, 255 ); g.fillrect(0, 0, getwidth(), getheight()); Dan kemudian grafik memanggil metode drawstring() untuk menampilkan Hello,World! pada layar : // mengatur warna tulisan dengan warna hitam g.setcolor(0, 0, 0); // dan menulis sebuah text g.drawstring(text, getwidth()/2, getheight()/2, Graphics.TOP Graphics.HCENTER); Perintah Seperti halnya list, textbox, dan form, Canvas juga mempunyai Command yang disediakan dan dapat merespon untuk event Command. Langkah-langkah untuk menambahkan Command ke dalam Canvas adalah sama : Pengembangan Perangkat Mobile 7

71 1. Buatlah objek Command. private Command exitcommand = new Command("Exit", Command.EXIT, 0); 2. Gunakan usecommand() untuk menambahkan perintah ke dalam canvas(atau Form, list, text box) addcommand(exitcommand); 3. Gunakan setcommandlistener() untuk mendaftarkan class mana yang akan mendapat event command untuk perintah dalam Displayable. setcommandlistener(this); 4. Buatlah sebuah commandlistener dengan mengimplementasikan class commandlistener dan menyediakan sebuah metode commandaction(). class HelloCanvas extends Canvas implements CommandListener {... public void commandaction(command c, Displayable d) { if (c == exitcommand){ // do something Pengembangan Perangkat Mobile 8

72 4.3.4 Event key Subclass dari Canvas dapat merespon sebuah event tombol dengan metode-metode sebagai berikut : keypressed(int keycode) keyrepeated(int keycode) keyreleased(int keycode) Dipanggil ketika kunci ditekan Dipanggil ketika kunci diulang Dipanggil ketika kunci dilepas Canvas mendefinisikan kode tombol ini : KEY_NUM0, KEY_NUM1, KEY_NUM2, KEY_NUM3, KEY_NUM4, KEY_NUM5, KEY_NUM6, KEY_NUM7, KEY_NUM8, KEY_NUM9, KEY_STAR, and KEY_POUND. Untuk mendapatkan String nama sebuah kunci, gunakan metode getkeyname(int keycode) Aksi Permainan Masing-masing kode tombol bisa dipetakan menjadi sebuah aksi game. Sebuah key code bisa dipetakan kepada aksi sebuah game. Class Canvas mendefinisikan aksi game ini : UP, DOWN, LEFT, RIGHT, FIRE, GAME_A, GAME_B, GAME_C, GAME_D. Sebuah program dapat menerjemahkan sebuah key code ke dalam aksi game menggunakan metode getgameaction(keycode). Metode getkeycode(int gameaction) mengembalikan key code yang berkaitan dengan suatu aksi game. Sebuah aksi game dapat memiliki lebih dari satu key code yang berkaitan dengannya. Jika terdapat lebih dari satu key code yang berkaitan dengan aksi game, hanya satu key code yang akan dikembalikan. Sebuah aplikasi perlu menggunakan getgameaction(int keycode) daripada langsung menggunakan kode tombol yang telah didefinisikan. Secara normal, jika suatu program ingin merespon kunci UP, sebaiknya menggunakan kunci KEY_NUM2 atau key code yang spesifik untuk tombol UP. Program menggunakan metode ini tidaklah portable sejak sebuah perangkat memiliki layout kunci yang berbeda dan key code yang berbeda pula. KEY_NUM2 mungkin menjadi kunci UP untuk sebuah Pengembangan Perangkat Mobile 9

73 perangkat, tetapi mungkin juga menjadi kunci LEFT untuk perangkat lainnya. GetGameAction() akan selalu mengembalikan UP, tidak terikat pada kunci mana yang ditekan selama dia adalah kunci UP di dalam konteks dari layout kunci sebuah perangkat Event Pointer Disamping dari event key, program MIDP juga dapat mengatasi event pointer. Hal ini bersifat benar jika sebuah perangkat memiliki sebuah pointer dan hal tersebut diimplementasikan di dalam sistem JAVA pada sebuah perangkat. Metode haspointerevents() mengembalikan nilai true jika sebuah perangkat mendukung pointer yang bersifat ditekan dan dilepaskan. Metode haspointermotionevents() mengembalikan nilai true jika sebuah perangkat mendukung event gerakan dari pointer. public boolean haspointerevents() public boolean haspointermotionevents() Sebuah event dapat di-generate oleh aktivitas pointer sebagai berikut : pointerpressed, pointerreleased dan pointerdragged. Sebuah aplikasi mengesampingkan metode-metode yang untuk diperhatikan ketika event ini terjadi. Koordinat (x,y) dari event (ketika pointer ditekan, dilepas atau digeser) ditetapkan didalam metode-metode callback ini. protected void pointerpressed(int x, int y) protected void pointerreleased(int x, int y) protected void pointerdragged(int x, int y) 4.4 Grafik Class Graphic adalah class utama untuk menulis teks, menggambar, garis, kotak dan sudut. Dia memiliki metode untuk menentukan warna, huruf, dan coretan Warna Class Display memiliki metode untuk menentukan apakah sebuah perangkat memiliki fasilitas yang mendukung layar berwarna atau layar monochrome pada sebuah perangkat. Pengembangan Perangkat Mobile 10

74 public boolean iscolor() public int numcolors() Mengembalikan nilai true jika mendukung layar berwarna dan sebaliknya. Mengembalikan nomor warna(atau level abu-abu jika sebuah perangkat tidak mendukung warna) yang didukung sebuah perangkat Untuk mengatur warna yang digunakan untuk metode grafik berikutnya, gunakan metode setcolor(). SetColor() memiliki dua bentuk: public void setcolor(int red, int green, int blue) public void setcolor(int RGB) Pada bentuk pertama, Anda menentukan komponen warna merah, hijau, dan biru. Pada bentuk kedua komponen warna ditentukan dalam bentuk 0x00RRGGBB. Pemanggilan setcolor(int) pada contoh berikut akan melakukan hal yang sama: int red, green, blue;... setcolor(red, green, blue); setcolor( (red<<16) (green<<8) blue ); Metode lainnya untuk memanipulasi warna adalah : public int getcolor() public int getredcomponent() public int getgreencomponent() public int getbluecomponent() Mengembalikan warna terbaru dalam bentuk integer. Mengembalikan komponen merah sebagai warna terbaru Mengembalikan komponen hijau sebagai warna terbaru Mengembalikan komponen biru sebagai Pengembangan Perangkat Mobile 11

75 public int getcolor() Mengembalikan warna terbaru dalam bentuk integer. warna terbaru public int getgrayscale() public void setgrayscale(int value) Mengembalikan nilai abu-abu sebagai warna terbaru Memilih nilai abu-abu untuk mengganti operasi menggambar Huruf Sebuah huruf memiliki tiga atribut yaitu bentuk, type, dan ukuran. Huruf tidak diciptakan oleh aplikasi. Sebagai gantinya, sebuah aplikasi meminta sistem untuk memilih model atribut huruf dan sistem mengembalikan huruf yang sesuai dengan model atribut yang diminta. Sistem tidak menjamin akan mengembalikan semua atribut huruf yang dipilih. Jika sistem tidak memiliki huruf yang sesuai dengan permintaan, dia akan mengembalikan sebuah huruf hampir mirip dengan atribut yang diminta. Huruf adalah sebuah class yang terpisah. Seperti yang dinyatakan di atas, aplikasi tidak menciptakan objek huruf. Sebagai gantinya, metode-metode statis getfont() dan getdefaultfont() digunakan untuk meminta sebuah huruf dari sistem. public static Font getfont(int face, int style, int size) public static Font getdefaultfont() public static Font getfont(int fontspecifier) Mengembalikan sebuah huruf dari sistem yang sesuai dengan atribut Mengembalikan huruf default yang digunakan oleh sistem Mengembalikan huruf yang digunakan untuk komponen UI level tinggi. FontSpecifier bisa jadi : FONT_INPUT_TEXT atau FONT_STATIC_TEXT Pengembangan Perangkat Mobile 12

76 Face adalah salah satu dari FACE_SYSTEM, FACE_MONOSPACE, atau FACE_PROPORTIONAL. Style bisa jadi STYLE_PLAIN atau kombinasi STYLE_BOLD, STYLE_ITALIC dan STYLE_UNDERLINED. Kombinasi style ditentukan oleh penggunaan bitwise operator OR ( ). Sebuah style huruf tebal(bold) dan garis miring(italic) dideklarasikan sebagai : STYLE_BOLD STYLE_ITALIC Ukuran huruf bisa jadi : SIZE_SMALL, SIZE_MEDIUM, SIZE_LARGE Metode ini mengembalikan atribut huruf tertentu: public int getstyle() public int getface() public int getsize() public boolean isplain() public boolean isbold() public boolean isitalic() public boolean isunderlined() Style Coretan Metode setstrokestyle(int style) menetapkan style coretan bahwa akan digunakan untuk menggambar garis, sudut, dan kotak. Style coretan tidak mempengaruhi teks, gambar, dan operasi mewarnai. public void setstrokestyle(int style) public int getstrokestyle() Mengatur style coretan untuk menggambar garis, sudut, kotak, dll Mengembalikan style coretan terbaru Nilai valid untuk style adalah SOLID dan DOTTED. Pengembangan Perangkat Mobile 13

77 4.4.4 Clipping Suatu bidang clipping adalah suatu kotak di dalam objek Graphics yang ada. Setiap operasi grafik hanya akan mempengaruhi pixel-pixel didalam area clip. Pixel yang berada diluar clipping tidak akan dipengaruhi oleh setiap operasi grafik. public void setclip(int x, int y, int width, int height) public int getclipx() public int getclipy() public int getclipwidth() public int getclipheight() Mengatur area clip yang tersedia menjadi kotak, ditentukan oleh koordinat Mengembalikan offset X dari area clip yang tersedia, sehubungan dengan awal mula dari konteks grafik ini Mengembalikan offset Y dari area clip yang tersedia Mengembalikan lebar dari area clip yang tersedia Mengembalikan tinggi dari area clip yang tersedia Anchor Points Teks digambar sesuai dengan sebuah anchor points. Metode drawstring() mengharap sebuah koordinat (x,y) sesuai dengan anchor points. public void drawstring(string str, int x, int y, int anchor) Anchor harus suatu kombinasi horisontal yang konstan (LEFT,HCENTER, atau RIGHT) dan vertikal yang konstan (TOP, BASELINE, atau BOTTOM). Horisontal dan vertikal yang konstan harus dikombinasikan mengunakan operator bitwise OR ( ). Ini berarti menggambar teks berhubungan dengan baseline dan horisontal tengah akan membutuhkan sebuah nilai anchor BASELINE HCENTER. Pengembangan Perangkat Mobile 14

78 TOP HCENTER TOP LEFT TOP RIGHT LINE LEFT BASELINE R BOTTOM LEFT BOTTOM RIGHT BOTTOM HCENTER BASELINE HCENTER Gambar 3: titik anchor teks Menggambar Teks Metode untuk menggambar teks dan karakter adalah : Pengembangan Perangkat Mobile 15

79 public void drawstring(string str, int x, int y, int anchor) public void drawsubstring(string str, int offset, int len, int x, int y, int anchor) public void drawchar(char character, int x, int y, int anchor) public void drawchars(char[] data, int offset, int length, int x, int y, int anchor) Menggambar teks dalam str menggunakan warna dan huruf yang tersedia. (x,y) adalah koordinat titik anchor Sama seperti drawstring, kecuali ini hanya akan menggambar substring dari offset (berbasis nol) dengan panjang length. Menggambar karakter dengan warna dan huruf yang tersedia Menggambar karakter dalam data array karakter, dimulai dari indeks offset dengan panjang length Berikut adalah beberapa metode dari Font yang berguna dalam menggambar teks: public int getheight() Mengembalikan tinggi teks dalam huruf ini. Tinggi dikembalikan termasuk spasi ekstra. Pengembangan Perangkat Mobile 16

80 Hal ini memastikan bahwa dua teks digambar dengan jarak ini dari titik anchor ke titik anchor lainnya akan berisi cukup ruang antara dua baris teks. public int stringwidth(string str) public int charwidth(char ch) public int getbaselineposition() Mengembalikan lebar total dalam pixel dari ruang yang ditempati oleh string ini jika digambar menggunakan huruf ini Mengembalikan lebar total dalam pixel dari ruang yang ditempati oleh karakter ini jika digambar menggunaka huruf ini Mengembalikan jarak dalam pixel antara TOP dan BASELINE pada teks, berdasarkan pada huruf ini g.setcolor(255, 0, 0); // merah g.drawstring("jedi", getwidth()/2, getheight()/2, Graphics.TOP Graphics.HCENTER); g.setcolor(0, 0, 255); // biru Font font = g.getfont(); g.drawstring("java Education & Development Initiative", getwidth()/2, getheight()/2+font.getheight(), Graphics.TOP Graphics.HCENTER); Pengembangan Perangkat Mobile 17

81 Gambar 4: Hasil operasi drawstring() Menggambar garis Satu-satunya metode grafik untuk menggambar garis didefinisikan sebagai : public void drawline(int x1, int y1, int x2, int y2) Metode ini menggambar sebuah garis menggunakan warna yang tersedia dan coretan antara koordinat (x1,y1) dan (x2,y2). g.setcolor(255, 0, 0); // red // garis dari pojok kiri atas ke pojok kanan bawah layar g.drawline(0, 0, getwidth()-1, getheight()-1); g.setcolor(0, 255, 0); // green // garis horisontal pada tengah layar g.drawline(0, getheight()/2, getwidth()-1, getheight()/2); g.setcolor(0, 0, 255); // blue Pengembangan Perangkat Mobile 18

82 // garis horisontal pada bawah layar g.drawline(0, getheight()-1, getwidth()-1, getheight()-1); g.setcolor(0, 0, 0); // black // garis dari pojok kiri bawah ke pojok kanan atas layar g.drawline(0, getheight()-1, getwidth()-1, 0); Gambar 5: hasil pemanggilan metode drawline() Menggambar kotak Metode grafik untuk menggambar kotak adalah : public void drawrect(int x, int y, int width, int height) public void drawroundrect(int x, int y, int width, int height, int arcwidth, int archeight) public void fillrect(int x, int y, int width, int height) public void fillroundrect(int x, int y, int width, int height, int arcwidth, int archeight) Metode drawrect() menggambar sebuah kotak dengan pojok kiri atas pada koordinat (x,y) dan luas area (width+1 x height+1). Parameter yang sama ada bersama Pengembangan Perangkat Mobile 19

83 drawroundrect(). Parameter tambahan arcwidth dan archeight adalah diameter horisontal dan vertikal dari busur dari keempat sudut. Jika Anda akan mengenali, definisi drawrect dan drawroundrect menetapkan lebar dari kotak yang digambar pada layar adalah dengan width+1 dan tingginya dengan height+1. Hal ini sangat tidak intuitif, tetapi seperti itulah spesifikasi MIDP menggambarkan metode ini. Untuk meng-agravate tidak konsistensi dari off-byone ini, metode fillrect dan fillroundrect hanya mengisi sebuah area kotak (width x height). Anda akan melihat ketidakcocokan ini jika anda memasukkan parameter yang sama untuk drawrect dan fillrect (dan drawroundrect vs fillroundrect). Sisi kanan dan bawah dari kotak digambar oleh kepalsuan drawrect di luar area yang diisi oleh fillrect. // menggunakan tinta hitam untuk drawrect g.setcolor(0, 0, 0); g.drawrect(8, 8, 64, 32); // menggunakan tinta kuning untuk fillrect // untuk menampilkan perbedaan antara drawrect dan fillrect g.setcolor(255, 255, 0); g.fillrect(8, 8, 64, 32); Gambar 6: hasil dari penggunaan parameter yang sama untuk drawrect dan fillrect // mewarnai warna pena dengan warna hitam g.setcolor(0, 0, 0); // menggambar kotak pada (4,8) dengan lebar 88 dan tinggi 44 Pengembangan Perangkat Mobile 20

84 // kotak pada kiri atas g.drawrect(4,8,88,44); // elips pada kanan atas g.drawroundrect(108,8,88,44,18,18); // kotak pada kiri bawah g.fillrect(4,58,88,44); // elips pada kanan bawah g.fillroundrect(108,58,88,44,18,18); Gambar 7:drawRect(), fillrect(), drawroundrect(), dan fillroundrect() Pengembangan Perangkat Mobile 21

85 4.4.9 Menggambar Sudut Metode untuk menggambar bundar atau eclips adalah : public void drawarc(int x, int y, int width, int height, int startangle, int arcangle) public void fillarc(int x, int y, int width, int height, int startangle, int arcangle) Menggambar arc dengan pusat pada (x,y) dan dimensi (width+1 x height+1). Arc digambar mulai dari startangle dan extend untuk derajat arcangle. 0 derajat terletak pada jarum jam 3. Mewarnai bidang bundar dan eclips yang telah dibuat dengan warna yang tersedia. g.setcolor(255, 0, 0); g.drawarc(18, 18, 50, 50, 0, 360); // menggambar sebuah lingkaran g.setcolor(0, 255, 0); g.drawarc(40, 40, 100, 120, 0, 180); g.setcolor(0, 0, 255); g.fillarc(100, 200, 80, 100, 0, 90); Pengembangan Perangkat Mobile 22

86 Gambar 8: Hasil pemanggilan metode drawarc dan fillarc Melukis gambar Gambar digambar dengan metode drawimage() public void drawimage(image img, int x, int y, int anchor) Selama dengan drawstring, x dan y adalah koordinat titik anchor. Perbedaannya adalah bahwa vertikal anchor tetap adalah VCENTER yang berdasar BASELINE. Anchor harus berupa kombinasi dari horizontal constant(left, HCENTER atau RIGHT) dan vertical constant (TOP,VCENTER atau BOTTOM). Horizontal dan Vertical Constants dikombinasikan dengan menggunakan operator bitwise OR( ). Pengembangan Perangkat Mobile 23

87 TOP HCENTER TOP LEFT TOP RIGHT EFT VCEN LEFT BOTTOM NTER HCENTER BOTTOM HCENT Gambar : Image Anchor Points try { Image image = Image.createImage("/jedi.png"); g.drawimage(image, getwidth()/2, getheight()/2, Graphics.VCENTER Graphics.HCENTER); catch (Exception e){ Gambar : Output dari drawimage() Pengembangan Perangkat Mobile 24

88 4.5 Game API Game API 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. Pengembangan Perangkat Mobile 25

89 MyCanvas.java : import javax.microedition.lcdui.*; import javax.microedition.lcdui.game.*; public class MyCanvas extends GameCanvas implements Runnable { private boolean running; private long delay; private int currentx, currenty; private int screenwidth; private int screenheight; public MyCanvas() { super(true); screenwidth = getwidth(); screenheight = getheight(); currentx = screenwidth / 2; currenty = screenheight / 2; delay = 20; public void start() { running = true; Thread thread = new Thread(this); thread.start(); public void stop() { running = false; // The Game Loop public void run() { Graphics g = getgraphics(); while (running == true) { getinput(); drawscreen(g); try { Thread.sleep(delay); catch (InterruptedException ie) { private void getinput() { int keystates = getkeystates(); if ((keystates & LEFT_PRESSED)!= 0) { currentx = Math.max(0, currentx - 1); if ((keystates & RIGHT_PRESSED)!= 0) { currentx = Math.min(screenWidth, currentx + 1); if ((keystates & UP_PRESSED)!= 0) { currenty = Math.max(0, currenty - 1); if ((keystates & DOWN_PRESSED)!= 0) { currenty = Math.min(screenHeight, currenty + 1); private void drawscreen(graphics g) { g.setcolor(0xffffff); g.fillrect(0, 0, getwidth(), getheight()); g.setcolor(0x0000ff); g.drawstring("jedi", currentx, currenty, Graphics.TOP Graphics.LEFT); flushgraphics(); Pengembangan Perangkat Mobile 26

90 GameMidlet.java: import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class GameMidlet extends MIDlet { private Display display; public void startapp() { display = Display.getDisplay(this); MyCanvas gamecanvas = new MyCanvas(); gamecanvas.start(); display.setcurrent(gamecanvas); public Display getdisplay() { return display; public void pauseapp() { public void destroyapp(boolean unconditional) { exit(); public void exit() { System.gc(); destroyapp(false); notifydestroyed(); Layers Layers adalah elemen visual dari sebuah screen. Layer adalah abstract class yang merepresentasikan objects pada screen. Sprite dan TiledLayer adalah subclasses dari class Layer. Tiled Layer adalah rangkaian dari beberapa persegi empat yang berukuran sama dan gambar gambar yang memadai untuk ditempatkan pada persegi empat tersebut. Layer ini dibangun dengan menempatkan gambar gambar dan elemen elemen visual dalam area ini. Sebuah gambar dapat digunakan oleh lebih dari satu persegi empat sehingga dapat menghemat ruang dan memory. Tiled Layers umumnya digunakan sebagai background pada game Sprites Sprites adalah objects grafis yang anda lihat pada game. Object ini dapat berupa character, kunci, tombol, pintu ataupun peluru. Sebuah sprite bersifat statis ataupun animasi. Animasi sprite terbuat dari beberapa elemen sprite dengan perbedaan perbedaan kecil dan tersusun sedemikian hingga membentuk kesan bergerak. Rangkaian sprite ini disebut sebagai frame. Pengembangan Perangkat Mobile 27

91 Contoh kode berikut ini (dari Project Game2) mendemonstrasikan cara penggunaan sprites. Program ini menggunakan sprite sederhana dengan dua frame. Frame ditampilkan menurut penekanan tombol oleh user (UP, DOWN, LEFT atau RIGHT). GameCanvas dengan Sprite : import javax.microedition.lcdui.*; import javax.microedition.lcdui.game.*; public class MyCanvas extends GameCanvas implements Runnable { private boolean running; private long delay; private int currentx, currenty; private int screenwidth; private int screenheight; private Sprite sprite; public MyCanvas() throws Exception { super(true); screenwidth = getwidth(); screenheight = getheight(); currentx = screenwidth / 2; currenty = screenheight / 2; delay = 20; Image image = Image.createImage("/jedi.png"); sprite = new Sprite(image, 32, 32); public void start() { running = true; Thread thread = new Thread(this); thread.start(); public void stop() { running = false; // The Game Loop public void run() { Graphics g = getgraphics(); while (running == true) { getinput(); drawscreen(g); try { Thread.sleep(delay); catch (InterruptedException ie) { private void getinput() { int keystates = getkeystates(); sprite.setframe(0); if ((keystates & LEFT_PRESSED)!= 0) { currentx = Math.max(0, currentx - 1); sprite.setframe(0); Pengembangan Perangkat Mobile 28

92 if ((keystates & RIGHT_PRESSED)!= 0) { currentx = Math.min(screenWidth, currentx + 1); sprite.setframe(1); if ((keystates & UP_PRESSED)!= 0) { currenty = Math.max(0, currenty - 1); sprite.setframe(1); if ((keystates & DOWN_PRESSED)!= 0) { currenty = Math.min(screenHeight, currenty + 1); sprite.setframe(0); private void drawscreen(graphics g) { g.setcolor(0xffffff); g.fillrect(0, 0, getwidth(), getheight()); g.setcolor(0x0000ff); sprite.setposition(currentx, currenty); sprite.paint(g); flushgraphics(); Pengembangan Perangkat Mobile 29

93 4.5.4 LayerManager Class LayerManager akan memberikan kemudahan dalam pengaturan keseluruhan Sprites dan TiledLayers. LayerManager mengatur seluruh Sprites dan TiledLayers yang anda buat. Dan anda tidak perlu untuk membuat seluruh object tersebut satu persatu. LayerManager yang akan melakukannya untuk anda. LayerManager juga mengatur pengurutan objek dari dasar hingga paling atas. 4.6 Scalable 2D Graphics JSR 226 menyediakan method untuk proses rendering dan transforming atas grafis vector-based 2D. Format gambar raster-based seperti GIF melakukan proses encode terhadap pewarnaan pada tiap-tiap pixel pada area persegi empat yang menunjukkan bentuk gambar. Gambar dengan tipe vector-based hanya memiliki instruksi penggambaran yang menentukan bagaimana pixel-pixel dari gambar tersebut harus diwarnai. Vector tersebut merepresentasikan sebuah gambar yang berukuran jauh lebih kecil, sebuah nilai lebih dalam penggunaan resource pada mobile devices. 4.7 Latihan Key Codes Buatlah sebuah MIDlet yang akan menampilkan kode dan nama dari tombol yang ditekan oleh user. Gunakan sebuah Canvas dan tempatkan keterangan kode dan nama tepat di tengah dari tampilan pada layer. Pengembangan Perangkat Mobile 30

94 Pengembangan Perangkat Mobile 31

95 Bab 5 Persistence MIDP menyediakan sebuah API dimana program dapat menyimpan data-data aplikasi secara lokal didalam device tersebut. MIDP Record Management System adalah sebuah fasilitas yang dimiliki oleh MIDlets untuk menyimpan data-data aplikasi pada saat MIDlet invocations. Data akan disimpan dalam non-volatile memory didalam device. Hal ini berarti, data-data program yang telah disimpan tidak akan hilang walaupun program di restart maupun device dimatikan. 5.1 Tujuan Pada akhir pembelajaran, siswa diharapkan dapat: Memahami mengenai konsep dari Record Store Membuat dan membuka sebuah Record Store Menambah, memanggil kembali, mengupdate, dan mendelete record Memanggil record satu persatu (enumerate) record dengan menggunakan RecordEnumerate Membuat sebuah Record Comparator Membuat sebuah Record Filter 5.2 Record Store Sebuah Record Store adalah sebuah koleksi daripada record-record. Record Id didalam Record Store selalu unique. Record Id akan secara otomatis dialokasikan pada saat pembentukan sebuah record dan bertindak sebagai index atau primary key. Pemberian record Id dilaksanakan secara sekuensial dan nilai yang diberikan kepada record Id pertama pada setiap Record Store adalah 1 (satu). Pada saat sebuah record dihapus, record id-nya tidak akan bisa digunakan kembali. Jika kita membuat empat buah record dan menghapus record ke-empat, maka record Id selanjutnya yang akan diberikan oleh system adalah 5 (lihat gambar) Pengembangan Perangkat Mobile 1

96 Record ID Byte array 1 Data dari record #1 2 Data dari record #2 3 Data dari record #3 5 Data dari record #5 MIDlets dapat menciptakan lebih dari satu Record Store. Nama dari sebuah record store didalam MIDlet suite haruslah unique. Nama dari record store juga case sensitive dan memiliki panjang maksimal 32 karakter. Pada saat MIDlet suite dihapus dari sebuah device, maka semua record store yang terkoneksi dengan MIDlet didalam suite tersebut juga akan terhapus. Membuat dan membuka sebuah Record Store Method-method dibawah ini digunakan untuk membuat dan membuka sebuah record store: static RecordStore openrecordstore(string recordstorename, boolean createifnecessary) static RecordStore openrecordstore(string recordstorename, boolean createifnecessary, int authmode, boolean writable) static RecordStore openrecordstore(string recordstorename, String vendorname, String suitename) Jika createifnecessary di-set menjadi true dan Record Store belum ada, maka Record Store akan dibangun. Jika createifnecessary di-set menjadi false dan Record Store tersebut belum dibuat, maka sebuah RecordStoreNotFoundException akan dijalankan. Authmode paramater dapat di-set menjadi RecordStore.AUTHMODE_PRIVATE atau RecordStore.AUTHMODE_ANY. Penggunaan AUTHMODE_PRIVATE akan menyebabkan Record Store hanya mampu diakses oleh MIDlet suite si pemilik MIDlet. Sedangkan setting authmode ke AUTHMODE_ANY akan menyebabkan Record Store untuk diakses oleh MIDlet manapun. Access mode ini dispesifikasikan oleh sebuah writable boolean parameter. Untuk memperbolehkan MIDlet yang lain (diluar MIDlet suite) untuk menggunakan record store tersebut, parameter ini harus diubah menjadi true. Penggunaan bentuk pertama dari method openrecordstore()akan menyebabkan Record Store untuk dapat diakses oleh MIDlet-MIDlet didalam suite yang sama (authmode di-set ke AUTHMODE_PRIVATE). Untuk membuka sebuah Record Store dari MIDlet suite yang berbeda, bentuk ketiga dari method openrecordstore harus digunakan. Anda harus menspesifikasikan nama vendor (vendorname) dan nama dari Midlet suite (suitename). Pengembangan Perangkat Mobile 2

97 Jika sebuah Record Store terlanjur dibuka, method ini akan mengembalikan reference kepada record store tersebut. System akan tetap menghitung berapa kali Record Store telah dibuka dan setiap Record Store harus ditutup dengan jumlah yang sama pada saat ia dibuka. Menambahkan sebuah record int addrecord(byte[] data, int offset, int numbytes) Method addrecord akan membuat record yang baru didalam Record Store dan akan mengembalikan record ID. Mengambil kembali Record byte[] getrecord(int recordid) int getrecord(int recordid, byte[] buffer, int offset) int getrecordsize(int recordid) Bentuk pertama dari method getrecord akan mengembalikan copy dari data stored yang ada didalam record tertentu berdasarkan RecordID. Bentuk kedua akan mengcopy data pada paramater byte array yang telah disediakan. Pada saat menggunakan bentuk kedua, byte array tersebut haruslah dialokasikan terlebih dahulu. Jika ukuran dari record lebih besar daripada ukuran dari parameter, maka akan terjadi ArrayIndexOutOfBoundsException. Anda akan menggunakan method getrecordsize secara berurutan untuk mengetahui ukuran dari record sebelum Anda mulai untuk membacanya. Meng-update sebuah Record Anda tidak dapat memodifikasi hanya sebagian dari data record. Jika Anda ingin untuk memodifikasi sebuah record Anda harus: 1. Membaca tiap record dengan menggunakan getrecord 2. Meng-update record didalam memory 3. Memanggil setrecord untuk mengupdate data record void setrecord(int recordid, byte[] newdata, int offset, int numbytes) Menghapus Record void deleterecord(int recordid) Pada saat sebuah record dihapus, record Id akan digunakan kembali di pemanggilan berikutnya pada addrecord. Hal ini berarti, ada sebuah celah didalam Record Id. Oleh karena itu, tidak disarankan untuk menggunakan counter increment untuk Pengembangan Perangkat Mobile 3

98 membuat list dari keseluruhan record didalam record store. Anda harus menggunakan Record Enumerator untuk mengetahui tiap record didalam sebuah list store. Menutup sebuah Record Store void closerecordstore() Record store yang akan ditutup dengan cara pemanggilan method closerecordstore() tidak akan benar-benar ditutup sampai closerecordstore() dipanggil sejumlah pemanggilan dari openrecordstore() sebelumnya. Pemanggilan closerecordstore() lebih dari jumlah pemanggilan openrecordstore() akan berakibat exception RecordStoreNotOpen. Potongan kode dari contoh RmsExample1 adalah MIDlet sederhana yang mendemonstrasikan bagaimana untuk membuat sebuah record store, menambah record, dan memanggil kembali semua record didalam record store: // Buka dan buatlah record store dengan nama RmsExample1 recstore= RecordStore.openRecordStore("RmsExample1", true); // Masukkan content kedalam record store for(int recid=1; recid<=recstore.getnumrecords(); recid++){ // getrecord memiliki return value berupa panjang dari record reclength = recstore.getrecord(recid, data, 0); // Mengkonversikan byte array menjadi String String item = new String(data, 0, reclength); // Ini adalah String yang akan kita masukkan kedalam record String newitem = "Record #" + recstore.getnextrecordid(); // Konversikan String ke byte array byte[] bytes = newitem.getbytes(); // Tulislah record kedalam record store recstore.addrecord(bytes, 0, bytes.length); Tips Pemrograman: 1. Record ID dimulai dari 1, bukan 0. Oleh karena itu, apabila menggunakan loop, ingatlah untuk menggunakan 1 sebagai index pertama dan bukan Lebih baik digunakan Record Enumerator daripada menggunakan index incrementing (seperti contoh). Record yang telah dihapus, tetapi masih tetap ingin dibaca pada contoh disini akan menyebabkan InvalidRecordIDException. Pengembangan Perangkat Mobile 4

99 Mendapatkan list dari Record Store didalam MIDlet Suite static String[] listrecordstores() Method ini akan mengembalikan array dari nama record store tersebut yang dimiliki oleh MIDlet suite. Jika MIDlet suite tidak memiliki sebuah Record Store, maka method ini akan memiliki nilai pengembalian null. String[] storenames = RecordStore.listRecordStores(); System.out.println("Record Stores for this MIDlet suite:"); for (int i=0; storenames!= null && i<storenames.length; i++){ System.out.println(storeNames[i]); Contoh: RmsListStores Record Stores for this MIDlet suite: Prefs RmsExample1 RmsExample2 Contoh output dari RmsListStores Urutan penamaan yang akan dikembalikan tidak akan didefinisikan dan akan diimplementasikan secara independent. Oleh karena itu, apabila Anda ingin untuk menampilkan nama tersebut secara alphabetic, maka Anda harus melakukan sorting array terlebih dahulu. Menyimpan Data Primitif Java Sejauh ini, data yang telah dibuat dan dibaca dari Record Store adalah berupa String. CLDC memiliki standard classes dalam manipulasi data primitif. Class tersebut berasal dari standard library platform Java 2, yaitu Standard Edition (J2SE). Anda dapat menulis data Java primitif dengan mengkombinasikan class ByteArrayOutputStream dan DataOutputStream. Pembacaan tipe data primitive(int, long, short, string, Boolean, dan sebagainya) dapat pula dilakukan dengan menggunakan ByteArrayInputStream dan DataInputStream. ByteArrayOutputStream out = new ByteArrayOutputStream(); DataOutputStream dout = new DataOutputStream(out); // Menyimpan sebuah integer dout.writeint(recstore.getnextrecordid() * recstore.getnextrecordid()); // Menyimpan sebuah string dout.writeutf("record #" + recstore.getnextrecordid()); byte[] bytes = out.tobytearray(); // Menuliskan Record pada Store recstore.addrecord(bytes, 0, bytes.length);... Pengembangan Perangkat Mobile 5

100 // Menuju Record selanjutnya byte[] recbytes = enumerator.nextrecord(); ByteArrayInputStream in = new ByteArrayInputStream(recBytes); DataInputStream din = new DataInputStream(in); int count = din.readint(); String item = din.readutf(); Method lain untuk Record Stores long getlastmodified() int getversion() Sistem merekam bilamana sebuah Record Store mengalami modifikasi terakhir. Method getlastmodified memberikan informasi bahwa sebuah Record Store mengalami perubahan terakhir, dalam bentuk long dan sesuai format yang digunakan oleh System.currentTimeMillis(). Seluruh Record Store memiliki version information. Setiap kali sebuah record mengalami modifikasi, maka version number juga akan terupdate. Penggunaan method addrecord, setrecord dan deleterecord menyebabkan penambahan version number dari record store tersebut. static void deleterecordstore(string recordstorename) Menghapus record store. String getname() Mengetahui nama dari RecordStore. int getnextrecordid() Mengetahui recordid dari record selanjutnya untuk disimpan pada record store. int getnumrecords() Mendapatkan jumlah record yang terdapat pada Record Store. int getsize() Mengetahui space (dalam bytes) yang dipakai oleh record store. int getsizeavailable() Mengetahui sisa space yang tersedia (dalam bytes). void setmode(int authmode, boolean writable) Mengubah access mode dari RecordStore. Pengembangan Perangkat Mobile 6

101 5.3 Record Enumeration Memeriksa sebuah record store menggunakan incerementing index adalah tidak efisien. Record stores yang telah dihapus akan terlewati jika Record Id dari record tersebut tidak digunakan kembali. Penggunaan record enumeration dapat menyelesaikan permasalahan tersebut dengan melakukan pemeriksaaan pada record yang telah dihapus. Anda juga dapat mengurutkan enumerasi dengan menggunakan method pembanding. Dengan penggunaan method pembanding, anda dapat melewati record yang tidak diharapkan pada output. RecordEnumeration enumeraterecords(recordfilter filter, RecordComparator comparator, boolean keepupdated) Method enumeraterecords dari sebuah record store akan menghasilkan enumerasi untuk memeriksa seluruh record pada sebuah record store. Ini adalah cara yang direkomendasikan untuk melewatkan seluruh record dalam record store. Filter dan Comparator akan dibahas dalam pembahasan selanjutnya. Cara paling sederhana dalam menggunakan method ini adalah memberikan nilai null untuk filter dan comparator. Hal ini akan menghasilkan enumerasi dari seluruh record pada sebuah store dalam urutan acak. // Membuka atau membuat sebuah record store dengan nama "RmsExample2" recstore = RecordStore.openRecordStore("RmsExample2", true); // Mengambil isi dari record store RecordEnumeration enumerator = recstore.enumeraterecords(null, null, false); while (enumerator.hasnextelement()){ // Mendapatkan record selanjutnya dan konversi byte array menjadi string String item = new String(enumerator.nextRecord()); // Area kode manipulasi record Record Comparator Pengurutan sebuah enumerasi dapat didefinisikan menggunakan sebuah Record Comparator. Record Comparator digunakan pada method enumeraterecords. Jika anda ingin mengurutkan output dari enumerasi, anda harus membuat comparator dan mengimplementasikannya sebagai parameter kedua pada enumeraterecords. int compare(byte[] rec1, byte[] rec2) Pengembangan Perangkat Mobile 7

102 Untuk membuat sebuah record comparator, anda harus mengimplementasikan interface RecordComparator. Interface tersebut mendefinisikan method tunggal, compare(byte[] rec1, byte[] rec2). Method ini harus menghasilkan return value, RecordComparator.FOLLOWS atau RecordComparator.PRECEDES. RecordComparator.EQUIVALENT harus dihasilkan jika rec1 adalah ekuivalen terhadap rec2 dalam pengurutan. // Membuat enumerasi, diurutkan menurut alfabet RecordEnumeration enumerator = recstore.enumeraterecords(null, new AlphaOrder(), false);... // Pengurutan menurut alfabet class AlphaOrder implements RecordComparator { public int compare(byte[] rec1, byte[] rec2){ String record1 = new String(rec1).toUpperCase(); String record2 = new String(rec2).toUpperCase(); if (record1.compareto(record2) < 0){ return(precedes); else { if (record1.compareto(record2) > 0){ return(follows); else { return(equivalent); 5.5 Record Filter Contoh contoh selama ini membaca seluruh record dari sebuah store. Kita dapat menggunakan sebuah filter untuk mendapatkan hanya record yang kita inginkan. Program Anda harus mengimpelementasikan method match() untuk menyeleksi record. Method tersebut akan menghasilkan nilai true jika record sesuai dengan criteria. boolean matches(byte[] candidate) public boolean matches(byte[] candidate){ boolean isamatch = false; try { ByteArrayInputStream bin = new ByteArrayInputStream(candidate); DataInputStream din = new DataInputStream(bin); Pengembangan Perangkat Mobile 8

103 int count = din.readint(); String item = din.readutf(); // mendapatkan record dengan akhiran 0 if (item.endswith("0")){ isamatch = true; else { isamatch = false; catch (Exception e){items.append(e.tostring(), null); return(isamatch); 5.6 Record Listener Sebuah Record Store dapat menggunakan lebih dari satu record listener. Record listener adalah object yang dipanggil pada saat sebuah record ditambahkan, diubah atau dihapus dari record store. Record listeners harus mengimplementasikan interface RecordListener. Record Listener diregristrasikan pada record store menggunakan method addrecordlistener(). Pada saat sebuah record store ditutup, seluruh record listener yang terkait juga akan dihapus. Penggunaan method deleterecordstore() tidak akan menghasilkan pemanggilan recorddeleted() pada record listener manapun yang terkait. void recordadded(recordstore recordstore, int recordid) Dipanggil saat sebuah record ditambahkan pada record store. void recordchanged(recordstore recordstore, int recordid) Dipanggil setelah sebuah record pada record store diubah. void recorddeleted(recordstore recordstore, int recordid) Dipanggil setelah sebuah record dihapus dari record store. Pengembangan Perangkat Mobile 9

104 5.7 Latihan Penyimpanan Pilihan Buat sebuah class yang dapat melangsungkan pemilihan pada program. Class tersebut akan menyimpan pilihan pada sebuah Record Store. Setiap record akan memiliki variabel name dan value. Setiap pasangan variabel disimpan pada sebuah record. Name dan value disimpan pada database sebagai string. Class Anda harus mengimplementasikan method sebagai berikut : public String readvar(recordstore recstore, String name, String defaultvalue){ public void writestring(recordstore recstore, String name, String value); Pengembangan Perangkat Mobile 10

105 Bab 6 Jaringan Pada bagian ini, kita akan belajar bagaimana menerapkan sebuah MIDlet yang mempunyai kemampuan untuk koneksi kedalam jaringan. Pada bagian akhir dari sesi ini, siswa diharapkan dapat: Mendeskripsikan Generic Connection Framework, dan bagaimana ia dapat digunakan untuk mendukung method koneksi yang berbeda-beda. Menspesifikasikan parameter-parameter koneksi dengan menggunakan format pengalamatan GCF URL Membuat koneksi HTTP/HTTPS Menciptakan MIDlet dengan menggunakan TCP sockets dan UDP datagram 6.1 Generic Connection Framework Generic Connection Framework mendukung koneksi packet (socket) dan stream (datagram). Sesuai dengan namanya, framework ini menyediakan API dasar bagi koneksi di 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 Hirarki dari GCF Interface Perluasan dari hirarki GCF interface memungkinkan terjadinya generalization. Sebuah tipe koneksi yang baru mungkin dapat ditambahkan kepada framework ini dengan cara memperluas hirarki. Pengembangan Perangkat Mobile 1

106 Gambar 8.1: Hirarki dari GCF Interface Pengembangan Perangkat Mobile 2

107 6.1.2 GCF Connection URL Parameter-parameter koneksi telah dispesifikasikan dengan menggunakan sebuah format pengalamatan: 1. Scheme adalah sebuah protokol atau method koneksi. Misalnya: http,ftp, https. 2. Username bersifat optional, akan tetapi bila kita ingin mendefinisikannya, harus didahului dengan 3. Password juga bersifat optional dan hanya dapat dispesifikasikan jika username telah didefinisikan sebelumnya. Jika password didefinisikan, maka ia harus dipisahkan dari username dengan menggunakan tanda titik dua (:) 4. Host parameter ini wajib dicantumkan. Bisa berupa nama host atau fully qualified domain name (FQDN) atau alamat IP dari host yang dituju. 5. Port parameter ini juga bersifat optional. Jika tidak dispesifikasikan, maka default port akan digunakan 6. Path 7. parameters bersifat optional, tetapi harus didahuli dengan titik koma (;) apabila ia dicantumkan Jika kita menggunakan kurung siku untuk memberi tanda pada parameter-parameter yang bersifat optional pada format pengalamatan diatas, kita dapat mengubah format diatas menjadi seperti berikut: scheme://[username[:password]@]host[:port]/path[;parameters] Format pengalamatan tersebut haruslah sesuai dengan Uniform Resource Indicator (URI) seperti yang didefinisikan pada RFC Pada MIDP 2.0, hanya skema http dan https dibutuhkan untuk diimplementasikan pada device. Pengembangan Perangkat Mobile 3

108 6.2 Koneksi HTTP Protokol HTTP HTTP merupakan kepanjangan dari HyperText Transfer Protocol. Ia merupakan protocol yang digunakan untuk memindahkan web pages dari web server (misal: kepada web browser. Client(web browser) akan me-request sebuah web page dengan cara mespesifikasikan path dengan command Get atau POST. Pada method GET, parameter telah dispesifikasikan dan dilekatkan pada URL. Sebagai contoh, untuk memberikan sebuah variable dengan nama id dan memiliki nilai 100 kepada index.jsp, url tersebut akan dispesifikasikan sebagai : Parameter tambahan dipisahkan dengan dengan tanda &, " Jika method POST digunakan, parameter bukanlah menjadi bagian dari URL tetapi dikirim dengan pada baris terpisah pada command POST. Pengembangan Perangkat Mobile 4

109 Client / Web Browser GET /index.jsp?id=100 HTTP/1.1 HTTP Server HTTP/ OK Server: Apache-Coyote/1.1 Content-Type: text/html;charset=iso Date: Wed, 18 Jun :09:31 GMT Connection: close <html> <head> <title>test Page</title> </head> <body> <h1 align="center">test Page</h1> </body> </html> Gambar 8.2: Contoh dari transaksi HTTP GET Pengembangan Perangkat Mobile 5

110 Client / Web Browser GET /non-existent.html HTTP/1.0 HTTP Server HTTP/ /non-existent.html Server: Apache-Coyote/1.1 Content-Type: text/html;charset=utf-8 Content-Length: 983 Date: Mon, 11 Jul :21:01 GMT Connection: close <html><head><title>apache Tomcat/ Error report</title><style>... <body><h1>http Status 404</h1>... The requested resource (non-existent.html) is not available.... </body></html> Gambar 8.3: Contoh dari transaksi HTTP GET dengan response error Menciptakan sebuah koneksi HTTP Anda dapat membuka sebuah koneksi HTTP dengan menggunakan Connector.open() dan meng-casting nya dengan salah satu dari ketiga interface berikut ini: StreamConnection, ContentConnection, dah HTTPConnection. Bagaimanapun, dengan StreamConnection dan ContentConnection, Anda tidak dapat menspesifikasikan dan menurunkan parameterparameter spesifik dari HTTP dan juga result-nya. Bila Anda menggunakan StreamConnection, panjang dari sebuah reply, tidak dapat ditentukan sebelumnya. Sedangkan pada ContentConnection atau HTTPConnection, selalu ada cara untuk menentukan panjang dari sebuah reply. Akan tetapi penentuan panjang ini, tidak selalu tersedia. Oleh karena itu, program Anda harus bisa mendapatkan reply tersebut tanpa harus mengetahui panjang content terlebih dahulu. Pengembangan Perangkat Mobile 6

111 import javax.microedition.io.*; HttpConnection connection = null; InputStream istream = null; byte[] data = null; try { connection = (HttpConnection) Connector.open(" int code = connection.getresponsecode(); switch (code){ case HttpConnection.HTTP_OK: istream = connection.openinputstream(); int length = (int) connection.getlength(); if (length > 0){ data = new byte[length]; int totalbytes = 0; int bytesread = 0; while ((totalbytes < length) && (bytesread > 0)) { bytesread = istream.read( data, totalbytes, length - totalbytes); if (bytesread > 0){ totalbytes += bytesread; else { //panjang tidak diketahui, baca tiap karakter... break; default: break;... Pengembangan Perangkat Mobile 7

112 6.2.3 Handling HTTP Redirects Terkadang server akan melakukan redirect dari sebuah browser/client ke web page yang lain dengan cara me-reply HTTP_MOVED_PERM (301), HTTP_MOVED_TEMP (302), HTTP_SEE_OTHER (303) atau HTTP_TEMP_REDIRECT (307) daripada menggunakan reply HTTP_OK yang biasa dilakukan. Program Anda harus dapat mengidentifikasi-nya dengan menggunakan getresponsecose(), mendapatkan URI yang baru dari header dengan menggunakan getheaderfield( Location ), dan mendapatkan kembali dokumen dari lokasi yang baru. int code = connection.getresponsecode(); switch(code){ case HttpConnection.HTTP_MOVED_PERM: case HttpConnection.HTTP_MOVED_TEMP: case HttpConnection.HTTP_SEE_OTHER: case HttpConnection.HTTP_TEMP_REDIRECT: String newurl = conn.getheaderfield("location");... Pengembangan Perangkat Mobile 8

113 6.3 Koneksi HTTPS HTTPS adalah sebuah HTTP diatas sebuah koneksi secure transport. Membuka sebuah koneksi HTTPS, hampir sama untuk membuka koneksi HTTP. Perbedaan utamanya adalah URL akan memberikan kepada Connector.open() dan meng-casting hasilnya kepada HttpsConnection class variable. Sebuah tipe exception tambahan juga harus dijalankan melalui Connector.open() misalnya IllegalArgumentException, ConnectionNotFoundException, java.io.ioexception dan SecurityException. Sebuah CertificateException juga dapat dijalankan untuk melaporkan kesalahan pada certificate. import javax.microedition.io.*; HttpsConnection connection = null; InputStream istream = null; byte[] data = null; try { connection = (HttpsConnection) Connector.open(" int code = connection.getresponsecode();... catch (CertificateException ce){ switch (ce.getreason()){ case CertificateException.EXPIRED:... Pengembangan Perangkat Mobile 9

114 static byte BAD_EXTENSIONS Mengindikasikan bahwa sertifikat memiliki extenstion yang tidak teridentifikasi. static byte BROKEN_CHAIN Mengindikasikan bahwa sertifikat terletak didalam sebuah rantai yang tidak terautentikasi pada mata rantai berikutnya. static byte CERTIFICATE_CHAIN_TOO_LONG Mengindikasikan bahwa sertifikat server dari rantai tersebut melebihi panjang yang disepakati pada policy dari pembuat sertifikat. static byte EXPIRED Mengindikasikan bahwa sertifikat tersebut telah berakhir jangka waktunya. static byte INAPPROPRIATE_KEY_USAGE Mengindikasikan bahwa public key dari sertifikat tersebut telah digunakan tidak sesuai dengan ketetapan yang dibuat oleh pembuat sertifikat. static byte MISSING_SIGNATURE Mengindikasikan bahwa object dari sertifikat tidak memiliki sebuah tanda tangan digital. static byte NOT_YET_VALID Mengindikasikan bahwa sertifikat tersebut tidak berlaku. static byte ROOT_CA_EXPIRED Mengindikasikan bahwa root dari public key CA telah habis jangka waktunya. static byte SITENAME_MISMATCH Indicates a certificate does not contain the correct site name. static byte UNAUTHORIZED_INTERMEDIATE_CA Mengindikasikan bahwa ada sebuah sertifikat intermediate certificate didalam rantai yang tidak punya otoritas sebagai intermediate CA. static byte UNRECOGNIZED_ISSUER Mengindikasikan bahwa sertifikat tersebut telah dikeluarkan oleh entity yang tidak teridentifikasi. static byte UNSUPPORTED_PUBLIC_KEY_TYPE Mengindikasikan bahwa tipe public key didalam sertifikat tidak didukung oleh device. static byte UNSUPPORTED_SIGALG Mengindikasikan bahwa sertifikat telah ditandatangani dengan menggunakan algorithma yang tidak disupport. static byte VERIFICATION_FAILED Mengindikasikan bahwa sertifikat tersebut gagal di-verifikasi. Gambar 8.4: Berbagai alasan pada CertificateException (kutipan dari spesifikasi MIDP 2.0 JSR 118) Pengembangan Perangkat Mobile 10

115 6.4 TCP Sockets Banyak implementasi dari HTTP dijalankan diatas layer TCP. Jika Anda mengirim data menggunakan layer TCP, data tersebut akan dipotong menjadi bagian yang lebih kecil yang disebut dengan packet. Layer TCK akan memastikan bahwa semua packet akan dikirim oleh sender dan diterima oleh recipient, dengan susunan yang sama seperti pada saat ia dikirimkan. Jika sebuah packet tidak diterima oleh recipient, ia akan mengirimkannya kembali. Hal ini berarti, sekali Anda mengirim sebuah pesan, Anda dapat memastikan bahwa pesan tersebut akan berhasil dikirim kepada recipient dengan format yang sama seperti pada saat Anda mengirimkannya, tanpa ada data yang hilang atau disisipi (dihalangi oleh sebuah siklus tertentu seperti recipient disconnect dari jaringan). Layer TCP menangani reassembly dan retransmission pada packet secara transparan. Sebagai contoh, pada protokol HTTP kita tidak perlu khawatir terhadir prosess disassembly dan assembly packet karena hal ini akan dihandle pada layer TCP. Kadang-kadang, ukuran dari pesan tersebut terkadang terlalu kecil dan sangat tidak efisien untuk dikirimkan sebagai packet tunggal (overhead dari packet sangat tinggi jika dibandingkan dengan payload). Bayangkan banyak packet dikirimkan melalui jaringan dengan satu byte payload dan multi byte overhead(misal 16 bytes). Hal ini akan menyebabkan jaringan sangat tidak effisien, banyak packets membanjiri jaringan dengan hanya satu byte payload. Pada kasus ini, implementasi dari TCP dimungkinkan untuk menunggu sebuah pesan dikirim dengan sukses. Pesan tersebut kemudian akan dipaket sebagai banyak pesan didalam sebuah packet sebelum dikirimkan. Jika hal ini terjadi, maka akan terjadi keterlambatan pada koneksi. Jika aplikasi Anda menginginkan sesedikit mungkin terjadi keterlambatan, anda harus mengeset DELAY socket option ke nol (0). Atau jika aplikasi Anda dapat tetap berjalan dengan beberapa paket yang hilang atau tidak tersusun secara benar, Anda mungkin harus mencoba menggunakan UDP atau koneksi datagram. Koneksi UDP juga menggunakan sesedikit mungkin overhead packet. SocketConnection conn = (SocketConnection) Connector.open("socket:// client.setsocketoption(delay, 0); InputStream istream = conn.openinputstream(); OutputStream ostream = conn.openoutputstream(); os.write("get / HTTP/1.0\n\n".getBytes()); int c = 0; while((c = is.read())!= -1) { // memproses data yang diterima... Pengembangan Perangkat Mobile 11

116 istream.close(); ostream.close(); conn.close(); 6.5 Server Sockets Didalam model client-server, server akan secara terus menerus menunggu sebuah koneksi dari client atau dari port tertentu yang telah disetujui. Kita juga dapat menggunakan method Connector.open untuk menciptakan sebuah server socket. Sebuah URL akan memberikan sebuah format yang sama seperti pada TCP socket kepada method open(), dengan nama hostname yang dibiarkan kosong (misal socket://:8899). ServerSocketConnection conn = (ServerSocketConnection) Connector.open("socket://:8889"); // Dengarkan koneksi dari client SocketConnection client = (SocketConnection) conn.acceptandopen(); client.setsocketoption(delay, 0); InputStream istream = client.openinputstream(); OutputStream ostream = client.openoutputstream(); // baca/tulis untuk input/output streams... is.close(); os.close(); client.close(); server.close(); Pengembangan Perangkat Mobile 12

117 6.6 Datagrams Koneksi dari TCP socket adalah koneksi yang dapat dipercaya. Sebaliknya, tersampaikannya pesan dengan menggunakan packet UDP tidak dijamin. Tidak ada jaminan bahwa packet yang dikirimkan dengan menggunakan paket datagram akan diterima oleh pasangan. Susunan dari packet yang diterima juga tidak terpercaya. Susunan packet yang dikirimkan dimungkinkan untuk tidak sama dengan susunan packet yang diterima. UDP datagrams atau packet digunakan apabila aplikasi dapat tetap berjalan walaupun ada packet yang hilang atau packet tersebut tidak lagi memiliki susunan yang sama seperti yang dikirimkan. String url; try { if (isserver){ // memulai sebagai server, mendengarkan port 8888 url = "datagram://:8888"; else { // memulai sebagai client, koneksi dengan port 8888 sebagai //localhost url = "datagram://localhost:8888"; dc = (DatagramConnection) Connector.open(url); while (true) { Datagram dgram = dc.newdatagram(128); dc.receive(dgram); if (isserver){ // memulai sebagai server, mendapatkan alamat koneksi // bagi pesan kita selama proses pengiriman url = dgram.getaddress(); if (dgram.getlength() > 0){ String mesg = new String(dgram.getData(), 0, dgram.getlength())); Pengembangan Perangkat Mobile 13

118 catch (IOException ioe) { catch (Exception e) {... private void sendmesg(string line){ try { byte[] bytes = line.getbytes(); Datagram dgram = null; dgram = dc.newdatagram(bytes, bytes.length, url); dc.send(dgram); catch (Exception ioe) { 6.7 Latihan Mendapatkan URL Buatlah sebuah MIDlet yang mendapatkan HTTP URL. Aplikasi tersebut akan mendapatkan URL dengan method GET dan menampilkan jenis koneksi/ content properties (jika tersedia): Reponse Code, Response Message, Length, Type, Encoding, Expiration dan Last Modified Date. Pengembangan Perangkat Mobile 14

119 Pengembangan Perangkat Mobile 15

120 Bab 7 Security 7.1 Tujuan Pada akhir pembahasan bab ini, siswa diharapkan mampu : o Memahami dasar security dan kriptografi o Memahami proteksi domains dan permissions o Bagaimana menambahkan permissions pada MIDlet Suite o Bagaimana membuat MIDlet Suite menggunakan NetBeans Mobility Pack o Bagaimana membuat message digest menggunakan SATSA o Bagaimana melakukan enkripsi menggunakan symmetric keys 7.2 Dasar Security Kriptografi Kriptografi adalah cabang dari ilmu matematika yang memiliki banyak fungsi dalam pengamanan data. Kriptografi adalah proses mengambil message dan menggunakan beberapa fungsi untuk menggenerasi materi kriptografis (sebuah digest atau message terenkripsi). Kriptografi adalah salah satu dari teknologi yang digunakan dalam layanan security seperti integrity, confidentiality, identity dan non repudiation. Tipe Security Services Sebelum kita memasuki bahasan dasar fungsi kriptografi, kita pelajari terlebih dahulu beberapa security services penting yang digunakan dalam sebuah aplikasi : Authentification Adalah proses verifikasi indentitas dari pengguna pada akhir jalur komunikasi. Confidentiality Jika kita mengirimkan data sensitive melalui sebuah jaringan, kita ingin memastikan bahwa hanya penerima yang dituju yang dapat membacanya. Pengembangan Perangkat Mobile 1

121 Integrity Kita ingin memastikan bahwa data yang kita terima tidak mengalami pengubahan, penambahan ataupun pemisahan. Non-repudiation Service ini dapat menunjukkan bukti bahwa pengirim telah mengirimkan message, atau penerima telah menerima message. Authorization Untuk memastikan bahwa user memiliki hak akses spesifik terhadap data penting maupun sumber data. Message Digests Sebuah message digest juga disebut sebagai digital fingerprint. Sebuah message digest adalah sebuah kesimpulan matematis dari sebuah message atau file. Hal ini untuk memastikan integritas dari message atau file. Sehingga dapat memberikan informasi bahwa sebuah message telah mengalami perubahan atau tidak. Mengubah satu karakter dari sebuah file atau message dapat menyebabkan perubahan drastis dari message digest. Digest terbuat melalui sebuah proses yang sangat menyulitkan untuk membuat dua file atau message yang berbeda dengan message digest yang sama. Sebuah message digest berfungsi dalam satu alur fungsi. Sebuah message digest relatif mudah untuk diproses, namun sangat sulit jika dilakukan dengan cara sebaliknya. Dari sebuah message digest, sangat sulit untuk mengolah dan membuat sebuah message yang dapat menghasilkan message digest yang sama. Kriptografi Symmetric Key Dengan kriptografi symmetric key, sebuah message dapat terenkripsi dan terdekripsi menggunakan key yang sama. Baik pengirim maupun penerima message harus memiliki key yang sama supaya proses tersebut berjalan dengan sukses. Pengirim menggunakan key rahasia untuk mengenkripsi message, sedangkan penerima menggunakan kunci yang sama untuk mendekripsi message. Sekali message telah terenkripsi, message tersebut dapat dikirimkan melalui jaringan tanpa dipahami oleh penyadap. Secret Key Secret Key Message ENCODE Encrypted Message ENCODE Message Pengembangan Perangkat Mobile 2

122 Kriptografi Asymmetric Key Permasalahan dari symmetric key adalah kedua pihak harus memiliki key yang sama. Key tersebut harus dikirimkan secara aman menuju penerima dari beberapa sebab sehingga key dapat dicuri dan digunakan untuk mendekripsi sebuah message. Dengan menggunakan asymmetric keys, pengirim mengenkripsi message dengan menggunakan public key penerima. Kemudian penerima mendekripsi message tersebut menggunakan private key. Private key hanya dimiliki oleh penerima. Antara private dan public key merupakan komplemen matematis sehingga message yang terenkripsi menggunakan public key dapat terdekripsi menggunakan private key. Hal tersebut secara komputasi juga sulit untuk membuat private key ulang menggunakan public key. Public Key Private Key Message ENCODE Encrypted Message ENCODE Message Kriptografi Public Key Algoritma public key menuntut penggunaan complementary key secara terpisah dalam proses enkripsi dan dekripsi. Hal ini menunjukkan kepastian bahwa akan memakan waktu yang sangat lama untuk mengetahui private key melalui pengolahan public key. Tuntutan ini membuat distribusi public key menjadi mudah tanpa mengkhawatirkan kerahasiaan dari private key. Algoritma public key yang amat popular adalah algortima RSA. Keamanan dari RSA telihat dari tingkat kesulitan faktorial numerik dalam cakupan yang besar. Digital Signature Sebuah digital signature mirip dengan message digest kecuali bahwa digest dihasilkan oleh private key dari sebagian personal atau entitas. Public key digunakan dalam verifikasi bahwa message yang ditandai berasal dari penanda. Key Management Salah satu permasalahan dari kriptografi public key adalah key management. Bagaimana anda mengetahui bahwa public key yang anda gunakan dalam verifikasi otentifikasi dari digital signature adalah public key asli yang dikirimkan oleh pengirim? Pengembangan Perangkat Mobile 3

123 Digital Certificates adalah messages yang dibuat oleh Certification Authority (CA) yang menyertakan keabsahan entitas dari public key. Pada dasarnya, Digital Certificates adalah container dari Public Keys. Untuk mendapatkan sertifikat dari CA, sebuah entitas menyertakan dokumentasi yang membuktikan eksistensi dari identitas. Setelah melalui proses verifikasi identifikasi, CA kemudian menandai public key dari identitas yang menggunakan private key dari CA. Namun kita telah menciptakan problem yang lain. Bagaimana kita memverifikasi bahwa public key dari CA adalah asli? Anda akan mengetahui bahwa kita hanya membuat rangkaian dari keabsahan. Solusinya adalah penandaan certificate secara pribadi. CA menandai public key menggunakan private key yang sesuai. Kemudian certificate yang telah ditandai dan mengandung public key dari CA akan didistribusikan secara bebas. Hal ini dikenal sebagai root certificate. Certificate yang ditandai secara pribadi dapat dibuat dengan mudah oleh siapapun. Aplikasi seperti web browser dan umumnya disertai dengan root certificates dari Certificate Authorities yang diterima secara luas. Signature Generation Signature Verification Sender's Private Key Message Create Digest Create Digest Message Digest Message Digest Message Encrypted Digest Compare Encrypt Decrypted Message Digest Encrypted Message Digest Decrypt Sender's Public Key Pengembangan Perangkat Mobile 4

124 7.3 J2ME Security Protection Domains Sebuah protection domains mendefinisikan rangkaian permissions yang disertakan pada MIDlet Suite. MIDP 2.0 menjelaskan bahwa paling tidak terdapat dua buah protection domains : untrusted dan trusted domains. Untrusted domains adalah pembatasan dimana akses terhadap protected API pada kondisi default tidak diijinkan. Seorang user secara eksplisit harus mengatur tipe akses MIDlet Suite terhadap API. Untrusted MIDlets (berjalan di untrusted domains) tidak memerlukan user permission dalam mengakses protected API. Untrusted dan trusted domain menyediakan akses yang tak terbatas pada Record Management, MIDlet life cycle, LDCUI, Game dan Multimedia API. Bagaimanapun, API untuk koneksi HTTP dan HTTPS menuntut kejelasan permissions dari user jika MIDlet Suite berjalan pada untrusted domain. Sebuah protection domain adalah rangkaian dari Allowed dan User permissions yang diberikan kepada MIDlet Suite. Permissions Terdapat dua tipe mode interaksi permissions, mode Allowed dan User. Pada mode Allowed, user tidak diminta melakukan pengaturan permission saat MIDlet mengakses sebuah API yang terproteksi. Sebuah aplikasi secara otomatis memberikan hak akses terhadap resource dan interaksi dari user tidak diperlukan. Dalam mode User, device menanyakan apakah user menginginkan untuk mencabut atau memberikan hak akses MIDlet terhadap resource. Frekuensi dari pertanyaan bergantung pada mode interaksi yang dipilih oleh user. Mode Interaksi User Sebuah user permission memiliki salah satu dari 3 mode interaksi berikut : Blanket User memberikan permission pada MIDlet Suite untuk mengakses resource atau API secara permanen. User tidak akan lagi diminta melakukan pengaturan setiap MIDlet Suite berjalan. Permission yang ada akan tetap eksis hingga MIDlet Suite dihapus dari device atau user merubah permission tersebut. Membuat sebuah permission adalah salah satu dari cara pengamanan akses terhadap restricted APIs. Dalam MIDP, nama dari permission menggunakan nama dari package dari API tersebut sebagai prefix dan bersifat case sensitive. Jika permission tersebut ditujukan kepada sebuah class, maka penamaan permission harus mengandung nama class dan package. Sebuah MIDlet dapat menuntut adanya permission dengan mendeklarasikan MIDlet- Permissions ataupun atribut MIDlet-Permissions-Opt pada application descriptor. Jika MIDlet Suite menyertakan atribut MIDlet-Permissions, atribut permission tersebut Pengembangan Perangkat Mobile 5

125 harus diberi hak akses terhadap protection domain. Jika hak akses tidak diberikan, maka proses instalasi akan dibatalkan. Multiple permissions dituliskan menggunakan tanda koma (,) sebagai pemisah. MIDlet-Permissions: javax.microedition.io.connector.http MIDlet-Permissions-Opt: javax.wireless.messaging.sms.receive, javax.wireless.messaging.sms.send Membuat permissions pada MIDlet Suite menggunakan NetBeans Mobility Pack : Pengembangan Perangkat Mobile 6

126 Trusted MIDlets Sebuah MIDlet dapat diputuskan sebagai trusted application jika authentifikasi dan integritas dari file JAR dapat terverifikasi oleh device dan terbatas pada sebuah protection domain. Proses verifikasi dilakukan oleh device menggunakan certificates. Menandai MIDlet pada NetBeans Mobility Pack : Untuk memberi tanda pada MIDlet Suite menggunakan NetBeans Mobility Pack, buka project properties (klik kanan project name pada projects tab dan pilih Properties). Periksa bagian Sign Distribution : Pengembangan Perangkat Mobile 7

127 7.4 Menggunakan Security dan Trust Services API (SATSA) Security and Trust Services API (SATSA) terdefinisi dalam Java Spesification Request (JSR) 177. SATSA adalah sebuah pilihan package yang menyediakan APIs untuk fungsi fungsi security seperti manajemen digital signatures, pembuatan message digest dan digital signatures, berhubungan dengan Java Cards dan operasi kriptografi lainnya. Contoh berikut ini menunjukkan cara pembuatan message digest dan enkripsi sebuah message menggunakan symmetric keys : Membuat Message Digest : /* * DigestMidlet.java * */ import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import java.security.*; public class DigestMidlet extends MIDlet { public void startapp() { String message = "I LOVE JENI!"; System.out.println("Generating digest for message: " + message); byte[] digest = generatedigest(message.getbytes()); System.out.println("SHA-1 Digest:"); for (int i=0; i<digest.length; i++) { System.out.print(digest[i] + " "); System.out.println(); public void pauseapp() { public void destroyapp(boolean unconditional) { public byte[] generatedigest(byte[] message) { String algorithm = "SHA-1"; int digestlength = 20; byte[] digest = new byte[digestlength]; try { MessageDigest md; md = MessageDigest.getInstance(algorithm); md.update(message, 0, message.length); md.digest(digest, 0, digestlength); catch (Exception e) { System.out.println("Exception: " + e.getmessage()); return digest; Pengembangan Perangkat Mobile 8

128 Sun Java Wireless Toolkit 2.3 menyediakan dukungan JSR 177 (atau SATSA) : Proses Build dan Run file DigestMidlet : 1. Buka aplikasi Ktoolbar dari Wireless Toolkit : 2. Pilih New Project kemudian tentukan nama project dan class MIDlet : Pengembangan Perangkat Mobile 9

129 3. Pilih JWTI sebagai Target Platform. Tandai pilihan Security and Trust Services APIs (JSR 177) dan kilik OK. 4. Buat file dengan nama DigestMidlet.java pada direktori : WTK/apps/SATSA/src Pengembangan Perangkat Mobile 10

130 (WTK adalah direktori instalasi dari Sun Java Wireless Toolkit, secara default adalah C:\WTK23, dan SATSA adalah nama project). 5. Klik Build 6. Klik Run untuk menjalankan MIDlet pada emulator. Jika anda menjalankan MIDlet pada emulator, anda tidak akan mendapatkan output grafis apapun. Output yang akan dihasilkan adalah berupa console pada WTK Tollbar. Enkripsi dan Dekripsi Messages menggunakan symmetric keys : /* * SymmetricCipherMidlet.java * */ import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import java.security.*; import java.security.spec.*; import javax.crypto.*; import javax.crypto.spec.*; import javax.microedition.securityservice.*; public class SymmetricCipherMidlet extends MIDlet { private static final byte[] key = { (byte) 0xab, (byte) 0xcd, (byte) 0xef, (byte) 0x88, (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78 Pengembangan Perangkat Mobile 11

131 ; String message = "I LOVE JEDI!"; public SymmetricCipherMidlet() { try { System.out.println("Original Message: " + message); printbytes(message.getbytes()); byte[] encryptedmessage = encrypt("des/ecb/pkcs5padding", message.getbytes(), key, "DES"); System.out.println("Encrypted Message:"); printbytes(encryptedmessage); byte[] decryptedmessage = decrypt("des/ecb/pkcs5padding", encryptedmessage, key, "DES"); System.out.println("Decrypted Message:"); printbytes(decryptedmessage); catch (Exception e) { System.out.println("Exception: " + e.getmessage()); e.printstacktrace(); private void printbytes(byte[] bytes) { for (int i = 0; i<bytes.length; i++){ System.out.print(toHex(bytes[i]) + " "); System.out.println(); private String tohex(byte b) { char d1 = tohexdigit((byte) ((b>>4) & 0x0F)); char d2 = tohexdigit((byte) (b & 0x0F)); return ("0x"+d1+d2); private char tohexdigit(byte x) { if (x > 9) { return ((char) ('A' + (x-10))); else { return ((char) ('0' + x)); private byte[] encrypt(string algorithm, byte[] message, byte[] keybytes, String keyalgo) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, ShortBufferException, IllegalBlockSizeException, BadPaddingException { Cipher cipher = Cipher.getInstance(algorithm); Key key = new SecretKeySpec(keybytes, 0, keybytes.length, keyalgo); int blocksize = 16; int cipherlength = ((message.length / blocksize) + ((message.length % blocksize) > 0? 1 : 0)) * blocksize; cipher.init(cipher.encrypt_mode, key); byte[] ciphertext = new byte[cipherlength]; cipher.dofinal(message, 0, message.length, ciphertext, 0); return(ciphertext); public byte[] decrypt(string algorithm, byte[] ciphertext, byte[] keybytes, String keyalgo) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, ShortBufferException, IllegalBlockSizeException, BadPaddingException { Pengembangan Perangkat Mobile 12

132 Cipher cipher = Cipher.getInstance(algorithm); Key key = new SecretKeySpec(keybytes, 0, keybytes.length, keyalgo); cipher.init(cipher.decrypt_mode, key); byte[] decrypted = new byte[message.length()]; cipher.dofinal(ciphertext, 0, ciphertext.length, decrypted, 0); return(decrypted); public void startapp() { public void pauseapp() { public void destroyapp(boolean unconditional) { Pengembangan Perangkat Mobile 13

133 7.5 Latihan Buat sebuah method yang akan melakukan verifikasi atas integritas dari sebuah message dengan cara mengolah dan membandingkan antaradigest dari message tersebut dengan message digest asli. public boolean verifydigest(byte[] message, byte[] originaldigest) Pengembangan Perangkat Mobile 14

134 Bab 8 Web Services 8.1 Tujuan Diakhir pembahasan, diharapkan siswa dapat : Mengetahui bagaimana memodelkan data menggunakan XML Mengetahui beberapa Java API yang digunakan dalam pemrosesan XML Mendeskripsikan apa yang bisa dilaksanakan oleh web service Mengetahui beberapa key standard dalam web service Mengetahui bagaiamana membuat web service mobile sebagai client 8.2 Pengenalan terhadap XML XML (extensible Markup Language) adalah sebuah meta-language untuk mendeskripsikan data. XML merupakan sebuah cara merepresentasikan data tanpa tergantung kepada system. Ia juga dapat digunakan sebagai extension markup languages. XML adalah berbasis text, sehingga ia dapat dengan mudah dipindahkan dari satu sistem komputer ke sistem yang lain. Dengan XML, data direpresentasikan dalam sebuah dokumen yang terstruktur dan ia juga telah menjadi sebuah standard industri. Element Sebuah dokumen XML adalah sebuah dokumen yang mudah dibaca dan terdiri dari XML tag atau element. Sama halnya dengan HTML, XML tag didefinisikan dengan kurung siku <>. Sebuah dokumen XML memiliki struktur seperti entities didalam sebuah tree. Anda dapat menggunakan tag sesuai dengan yang Anda inginkan, selama semua aplikasi yang menggunakan dokumen tersebut menggunakan tag dengan nama yang sama. Tag dapat memiliki attributes. Dalam contoh dibawah ini, task pertama memiliki id dengan attribut 1, sedangkan task yang kedua memiliki id dengan attribute 2. <tasks> <task id="1"> Pengembangan Perangkat Mobile 1

135 <name>connect to database</name> <duration>2</duration> <assignedto>alex</assignedto> <progress>50</progress> </task> <task id="2"> <name>list table rows</name> <duration>4</duration> <assignedto>alex</assignedto> <progress>100</progress> </task> </tasks> Attributes Tag dapat juga terdiri dari attribute-attribute. Didalam contoh, tag task memiliki attribute dengan nama id. Sebuah attribut diikuti dengan tanda sama dengan (=) dan diikuti dengan value atau nilainya. Pada saat mendesai sebuah struktur XML, permasalahan yang selalu muncul adalah apakah sebuah data element harus menjadi attribute dari sebuah element atau menjadi sebuah sub-element. Seperti contoh, XML diatas juga dapat kita tulis lagi sebagai berikut: <tasks> <task> <id>1</id> <name>connect to database</name>... </tasks> Tidak ada aturan yang pasti, struktur element seperti apa yang harus kita anut. Akan tetapi dalam beberapa situasi, aturan-aturan dibawah ini harus dipenuhi: Data akan memiliki beberap sub-struktur, pada kasus dimana Anda harus menggunakan sebuah sub-element karena ia tidak boleh dimodelkan sebagai attribut. Data akan terdiri dari beberapa baris apabila attribut ingin dibuat sesederhana mungkin sebuah string yang pendek tetapi mudah untuk dibaca dan digunakan. Pengembangan Perangkat Mobile 2

136 Data element dimungkinkan untuk muncul kembali. Data akan sering berubah. XML Schema XML tag harus bersifat extensible, dimana seorang desainer system dimungkinkan untuk menuliskan sendiri XML tag-nya dalam pendeskripsian sebuah content. Anda dapat menciptakan tag-tag yang berbeda untuk setiap format dokumen yang Anda inginkan didalam aplikasi atau sistem Anda. Tag didefinisikan menggunakan XML schema language. Sebuah schema mendefinisikan struktur dari dokumen XML. Sebuah skema juga digunakan membatasi content dari sebuah dokumen XML kedalam sebuah element, attributes, dan values tertentu. Sebuah Document Type Definition schema adalah bagian dari spesifikasi XML. Kita akan memanggil schema yang ditulis dalam bahasa ini disebut sebagai DTD. DTD ini juga mendefinisikan tag atau attribute mana yang sangat diperlukan dan mana yang bersifat optional. <!ELEMENT tasks (task)*> <!ELEMENT task (name, duration, assignedto, progress) > <!ATTLIST task id CDATA #REQUIRED > <!ELEMENT task (name, duration, assignedto, progress) > <!ELEMENT name (#PCDATA) > <!ELEMENT duration (#PCDATA) > <!ELEMENT assignedto (#PCDATA) > <!ELEMENT progress (#PCDATA) > Namespace Ada beberapa kasus dimana tag atau element Anda memiliki nama yang sama. Misalnya, ada beberapa element yang mempunya nama yang sama yaitu name. Untuk mengatasi hal tersebut, sebuah namespace digunakan. Spesifikasi dari namespace akan digunakan oleh penulis dokumentasi untuk mengetahui schema atau DTD mana yang digunakan pada element tertentu. Namespace dapat diaplikasikan pada attribut dan juga pada elements. Pengembangan Perangkat Mobile 3

137 8.3 Java APIs bagi XML JAXP JAXP atau Java API for XML Processing (JAXP) adalah sebuah fleksible API yang mendukung Anda untuk mendukung sembarang XML-complient parser didalam aplikasi Java Anda. Ia memiliki sebuah layer plugability, dimana Anda dapat menambahkan sembarang implementasi dari SAX atau DOM APIs. JAXP juga telah mendukung namespaces, sehingga ia akan mendukung Anda untuk bekerja dengan schema XML dalam mengatasi permasalahan penamaan. DOM API Document Object Model (DOM) adalah sebuah struktur tree, dimana tiap node akan terdiri dari sebuah komponen dari struktur XML. DOM API mendukung Anda untuk membuat atau menghilangkan sebuah node didalam tree. Ia juga dapat digunakan untuk mengganti content dari node dan mengubah hierarki node. Oleh karena, sebuah tree me-representasikan keseluruhan XML data, DOM API membutuhkan banyak memori didalam runtime-nya. SAX API Simple API for XML (SAX) adalah sebuah event-based XML parser API. Ia akan membaca XML dokumen dari awal hingga akhir. Setiap saat bertemu dengan sebuah construction syntax, ia akan memberikan tanda (notify) untuk menjalankan program tersebut. Sebuah SAX parser akan memberikan tanda kepada aplikasi dengan jalan memanggil method dari interface ContentHandler. Sebagai contoh, pada saat parser mencapai simbol kurang dari (<), ia akan memanggil method startelement. Pada saat bertemu dengan tag terakhir (sebuah slash yang diikuti dengan tanda lebih besar dari), hal ini disebut method endelement. SAX sangatlah cepat dan efisien. Ia membutuhkan memori yang lebih sedikit daripada DOM, karena ia tidak mengharuskan untuk membuat sebuah struktur tree internal dari data-data XML. SAX hanya akan mengirimkan data setiap kali aplikasi ingin membaca data tersebut. XLST API Pengembangan Perangkat Mobile 4

138 Extensible Stylesheet Language Transformation (XSLT) standard mendefinisikan mekanisme untuk pengalamatan (addressing) data-data XML dan untuk menspesifikkan transformasi data. Extensible Stylesheet Language (XSL) memiliki tiga sub-komponen: XSL-FO Formatting Objects standard. XSL-FO adalah sebuah standard yang menyediakan mekanisme untuk mendeskripsikan aspek-aspek dari sebuah object misalnya ukuran huruf dan layout halaman. Sub komponen ini tidak tercover didalam JAXP. XSLT adalah sebuah transformation language dimana Anda diharapkan dapat mendefisinikan sendiri transformasi dari sebuah XML ke format yang lain seperti HTML. Xpath adalah sebuah language spesification, dimana Anda diharapkan dapat menspesifikasikan sendiri bagian-bagian dari struktur XML yang direference setiap saat. Xpath adalah sebuah mekanisme pengalamatan yang mendukung Anda untuk mendefinisikan sebuah path kepada element. JAX-RPC Java API for XML-based RPC (JAX-RPC) adalah sebuah teknologi untuk membangun web services dan client web service yang dapat mengaktifkan remote procedure calls (RPC). RPC model mendukung client untuk mengeksekusi procedure pada remote system. Didalam JAX-RPC, remote procedure calls dan hasilnya direpresentasikan pada protocol berbasis XML. SOAP adalah salah satu protokol yang menggunakan JAX-RPC. JAX-RPC akan meng-convert API pemanggilan dan beraksi dari dan untuk SOAP/XML messages. Hal ini akan menyebabkan SOAP menjadi lebih mudah dan menghilangkan kekompleksan. 8.4 Web Services Web Services Messaging W3C mendefinisikan web service sebgai sebuah software aplikasi yang dapat teridentifikasi oleh URI dan memiliki interface yang didefiniskan, dideskripsikan, dan dimengerti oleh XML dan juga mendukung interaksi langsung dengan software aplikasi yang lain dengan menggunakan message berbasis XML melalui protokol internet Pengembangan Perangkat Mobile 5

139 Web service adalah sebuah sofware aplikasi yang tidak terpengaruh oleh platform, ia akan menyediakan method-method yang dapat diakses oleh network. Ia juga akan menggunakan XML untuk pertukaran data, khususnya pada dua entities bisnis yang berbeda. Beberapa karakteristik dari web service adalah: Message-based Standards-based Programming language independent Platform-neutral Beberapa key standard didalam web service adalah: XML, SOAP, WSDL and UDDI. SOAP (Simple Object Access Protocol) adalah sebuah XML-based mark-up language untuk pergantian pesan diantara aplikasi-aplikasi. SOAP berguna seperti sebuah amplop yang digunakan untuk pertukaran data object didalam network. SOAP mendefinisikan empat aspek didalam komunikasi: Message envelope, Encoding, RPC call convention, dan bagaimana menyatukan sebuah message didalam protokol transport. Sebuah SOAP message terdiri dari SOAP Envelop dan bisa terdiri dari attachments atau tidak memiliki attachment. SOAP envelop tersusun dari SOAP header dan SOAP body, sedangkan SOAP attachment membolehkan non-xml data untuk dimasukkan kedalam SOAP message, di-encoded, dan diletakkan kedalam SOAP message dengan menggunakan MIME-multipart. Web Services Description WSDL (Web Services Description Language) adalah sebuah XML-based language untuk mendeskripsikan XML. Ia menyediakan service yang mendeskripsikan service request dengan menggunakan protokol-protokol yang berbeda dan juga encoding. Ia akan memfasilitasi komunikasi antar aplikasi. WSDL akan mendeskripsikan apa yang akan dilakukan oleh web service, bagaimana menemukannya dan bagaimana untuk mengoperasikannya. Spesifikasi WSDL mendefinisikan tujuh tipe element: Types element untuk mendefinisikan tipe data. Mereka akan mendefinisikan tipe data (seperti string atau integer) dari element didalam sebuah message. Message - abstract, pendefinisian tipe data yang akan dikomunikasikan. Operation sebuah deskripsi abstract dari sebuah action yang didukung oleh service. Pengembangan Perangkat Mobile 6

140 Port Type sebuah koleksi abstract dari operations yang didukung oleh lebih dari satu endpoints. Binding mendefinisikan penyatuan dari tipe port (koleksi dari operasioperasi) menjadi sebuah protokol transport dan data format (ex. SOAP 1.1 pada HTTP). Ini adalah sebuah protokol konkret dan sebuah spesifikasi data format didalam tipe port tertentu. Port mendefinisikan sebuah komunikasi endpoint sebagai kombinasi dari binding dan alamat network. Bagi protokol HTTP, ini adalah sebuah bentuk dari URL sedangkan bagi protokol SMTP, ini adalah sebuah form dari address. Service satu set port yang terkorelasi atau suatu endpoints. WSDL mendefinisikan service sebagai sebuah koleksi dari endpoints network. Sebuah definisi abstrak dari endpoints dan messages adalah ia bersifat terpisah dari pembangunan network atau penyatuan data format. Pembagian ini menyebabkan penggunaan kembali abstract description dari data yang akan dipertukarkan (message exchange) dan abstract collection dari operasi (ports) Protokol konkret dan spesfikasi data format bagi tipe port tertentu menentukan binding yang dapat digunakan kembali(reusable). Sebuah port adalah sebuah network address yang dikombinasikan reusable binding; sebuah service adalah koleksi dari port-port. Web Service Discovery UDDI (Universal Description, Discovery and Integration) adalah sebuah service registry bagi pengalokasian web service. UDDI mengkombinasikan SOAP dan WSDL untuk pembentukan sebuah registry API bagi pendaftaran dan pengenalan service. Ia menyediakan sebuah area umum dimana sebuah organisasi dapat mengiklankan keberadaan mereka dan service yang mereka berikan (web service). UDDI adalah sebuah framework yang mendefinisikan sebuah XML-based registry dimana sebuah organisasi dapat meng-upload informasi mengenai service yang mereka berikan. XML-based registry berisi nama-nama dari organisasi tsb, beserta service dan deskripsi dari service yang mereka berikan. Pengembangan Perangkat Mobile 7

141 8.5 J2ME Web Services API (WSA) Web Services API(JSR 172) menyediakan fungsi-fungsi tambahan yang mendukung web service. API ini berisi fungsi-fungsi dasar yang digunakan dalam web service client seperti remote web invocation dan XML parsing. WSA hanya merupakan subset dari J2SE API. WSA hanya mendukung pemakaian dari web service. Hal ini berarti, aplikasi J2ME dengan menggunakan WSA hanya dapat menjadi konsumen dari service dan bukan merupakan producer service. UDDI juga tidak disupport oleh JSR 172. JAXP subset disupport oleh WSA spesification yang didukung oleh SAX. Ia tidak berisi dukungan bagi DOM dan XSLT. Dokumen parsing XML menggunakan SAX Untuk mendapatkan instance dari SAX Parser, pertama-tama kita harus mendapatkan instance dari SAXParserFactory: // Dapatkan instance dari SAX parser factory SAXParserFactory factory = SAXParserFactory.newInstance(); Kemudian, kita akan mendapatkan instance dari SAX Parser: SAXParser parser = factory.newsaxparser(); Pada akhirnya, kita akan membuat sebuah source input dan menggunakan event handler untuk mem-parser. Untuk mempermudah contoh, kita akan membuat sebuah stream dari sebuah String. Biasanya, hal ini bisa terlaksana dengan menggunakan resource dari file atau network. Contoh yang kita buat juga tidak memiliki sebuah GUIia hanya mencetak sebuah outcome dari sebuah parsing menjadi sebuah standard output. ByteArrayInputStream stream = new ByteArrayInputStream(sampleXML.getBytes()); InputSource inputsource = new InputSource(stream); SaxEventHandler handler = new SaxEventHandler(); parser.parse(inputsource, handler); Kode berikut ini adalah kode untuk Event Handler: Pengembangan Perangkat Mobile 8

142 import java.util.*; import javax.xml.parsers.*; import org.xml.sax.*; import org.xml.sax.helpers.*; public class SaxEventHandler extends DefaultHandler { private boolean finished; private Stack qnamestack = new Stack(); private Vector tasks = new Vector(); private static final String TASKS_ELEMENT = "tasks"; private static final String TASK_ELEMENT = "task"; private static final String NAME_ELEMENT = "name"; private static final String ID_ATTRIBUTE= "id"; public void startdocument() throws SAXException { finished = false; qnamestack.removeallelements(); tasks.removeallelements(); public void enddocument() throws SAXException { finished = true; // Akhir dari dokumen, sekarang lakukan proses untuk memparsing object for (int i=0; i<tasks.size(); i++) { Task task = (Task) tasks.elementat(i); System.out.println("Task: " + task.name); public void startelement( String uri, String localname, String qname, Attributes attributes) throws SAXException { if (TASK_ELEMENT.equals(qName)) { // Dapatkan id attribute dari sebuah task String id = attributes.getvalue(id_attribute); Pengembangan Perangkat Mobile 9

143 Task task = new Task(id); tasks.addelement(task); qnamestack.push(qname); public void characters( char[] ch, int start, int length) throws SAXException { String name = new String(ch, start, length); String qname = (String) qnamestack.peek(); if (NAME_ELEMENT.equals(qName)) { if (tasks.size() > 0) { Task task = (Task) tasks.lastelement(); task.name = name; public void endelement( String uri, String localname, String qname) throws SAXException { qnamestack.pop(); Pengembangan Perangkat Mobile 10

144 8.6 Membuat sebuah Mobile Web Service Client Kita akan membuat secara sederhana aplikasi mobile dan kita akan menamakannya arithmeticclient. Pengembangan Perangkat Mobile 11

145 Kemudian, kita akan menggunakan stub generator (Tools->Java Platform Manager -> Wireless Toolkit -> Tools and Extensions -> Open Utilities -> Stub Generator): Pengembangan Perangkat Mobile 12

146 Sebelum kita dapat membuat sebuah web service client, kita harus memiliki sebuah file WSDL atau lokasi URL dimana terdapat service yang dapat kita pergunakan. Seperti yang telah disebutkan dalam bagian sebelumnya, JSR 172 tidak mendukung UDDI atau automatic discovery bagi service. Masukkan lokasi WSDL dari sebuah web service. Path dari outputnya harus menjadi path dari direktori sumber project Anda (PROJECT_PATH/src). Sebuah stub generator tidak menerima package tanpa penamaan. Oleh karena itu, Anda harus meng-inputkan sebuah nama package. Pengembangan Perangkat Mobile 13

147 Kemudian, kita akan membuat sebuah Midlet yang akan menggunakan stub yang telah kita buat untuk mengakses sebuah web service: /* * arithemeticclient.java * */ import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import jedi.*; public class WSClient extends MIDlet { private ArithmeticSEI_Stub stub; public void startapp() { System.out.println("Creating stub..."); stub = new ArithmeticSEI_Stub(); System.out.println("Invoking operation..."); WebServiceClient client = new WebServiceClient(); Thread thread = new Thread(client); thread.start(); Pengembangan Perangkat Mobile 14

148 public void pauseapp() { public void destroyapp(boolean unconditional) { class WebServiceClient implements Runnable { public void run() { try { int reply = stub.multiply(4, 5); System.out.println("Reply: " + reply); catch (java.rmi.remoteexception rex) { System.out.println("Remote Exception: " + rex.getmessage()); Pengembangan Perangkat Mobile 15

149 9.1 Tujuan Bab 9 Optimisasi Setelah menyelesaikan bab ini, pelajar diharapkan menguasai : Mengetahui teknik yang berbeda dalam optimisasi aplikasi mobile 9.2 Optimisasi Sebelum benar-benar melakukan setiap optimisasi pada program Anda, Anda seharusnya perlu memastikan bahwa package software anda memiliki kualitas yang baik. Anda perlu meletakkan optimisasi dalam agenda Anda. Beberapa teknik yang dibahas pada bab ini seharusnya dapat membantu dalam menghindari beberapa kesalahan pemrograman. 9.3 Eksekusi program Gunakan StringBuffer sebagai pengganti String. Anda perlu ingat bahwa pada Java, object String bersifat absolut atau abadi. Menggunakan method String menciptakan suatu object String terpisah. Perangkaian String yang sederhana menciptakan suatu object String ganda (kecuali jika String itu bersifat konstan dan kompiler cukup pandai untuk menggabungkan mereka pada proses compile berlangsung). Menggunakan StringBuffer tidak hanya mengoptimalkan runtime program Anda (lebih sedikit menimbulkan object runtime), itu juga mengoptimalkan pemakaian memori ( lebih sedikit object String dibuat). String StringBuffer String a, b, c;... String a, b, c;... String message = "a=" + a + "\n" + "b=" + b + "\n" + "c=" + c + "\n"; StringBuffer message = new StringBuffer(255); message.append("a="); message.append(a); message.append("\n"); message.append("b="); Pengembangan Perangkat Mobile 1

150 String StringBuffer message.append(b); message.append("\n"); message.append("c="); message.append(c); message.append("\n"); Gunakan clipping area dalam menggambar Menggunakan Graphics.setClip() akan mengurangi waktu eksekusi karena Anda hanya akan menggambar nomor-nomor yang optimal dari pixel-pixel di layar. Ingat, bahwa menggambar grafik pada layar meminta banyak terminologi pada waktu eksekusi. Mengurangi banyaknya pixel-pixel untuk digambar akan sangat mempengaruhi kinerja runtime program Anda. Graphics g; int x1, y1, x2, y2;... g.setclip(x1, y1, x2, y2); g.drawstring("jedi", x, y, Graphics.TOP Graphics.HCENTER); // Operasi menggambar yang lainnya Hindari modifier yang sama Menggunakan modifier yang sama mengambil sesuatu tanpa diduga pada kecepatan eksekusi program Anda karena hal tersebut menimbulkan beberapa ukuran tambahan sehingga itu tidak akan diakses secara bersamaan Lewatkan parameter sesedikit mungkin Ketika memanggil suatu method, penerjemah akan mendorong semua parameter ke atas tumpukan eksekusi. Melewatkan banyak parameter akan mempengaruhi kecepatan eksekusi dan pemakaian Heap Memory Mengurangi pemanggilan method Memanggil method menghabiskan Heap Memory dan waktu eksekusi. Lihat subbab sebelumnya Menunda semua inisialisasi Untuk mempercepat awal permulaan aplikasi, tunda semua inisialisasi yang sangat besar sampai mereka dibutuhkan. Jangan meletakkan inisialisasi dalam konstruktor MIDlet atau Pengembangan Perangkat Mobile 2

151 method startapp. Mempercepat waktu load sebuah aplikasi akan menambah penggunaan aplikasi Anda. Kebanyakan user akan meninggalkan aplikasi ketika aplikasi tersebut membutuhkan waktu yang lama untuk start up. Ingat bahwa waktu load aplikasi anda secara langsung mempengaruhi kesan pertama pengguna aplikasi Anda Gunakan array sebagai pengganti collection Mengakses Array lebih cepat daripada menggunakan vektor Menggunakan variabel lokal Hal tersebut lebih cepat mengakses variabel lokal daripada mengakses variabel instance. 9.4 Ukuran JAR Gunakan Obfuscator Tujuan utama obfuscator adalah untuk mengacak file class yang dikompile sehingga sulit untuk di decompile. Tetapi proses obfuscator juga mengurangi ukuran sebuah aplikasi. Salah satu method yang digunakan oleh obfuscator adalah memberi nama baru pada class menjadi sebuah nama. Karena obfuscator melakukan hal ini berdasar kepada modifier dari methodmethod. Jika method memiliki private atau protected modifier, lalu itu dapat diasumsikan aman ketika method ini tidak akan digunakan oleh package lainnya dan oleh karena itu dapat diberi nama baru kembali. Netbeans Mobility Pack datang dengan satu obfuscator. Dia tidak diaktifkan sebagai default. Buka tab property dan klik pada cabang Obfuscating : Pengembangan Perangkat Mobile 3

152 Ada sepuluh tingkat obfuscation, dari tanpa obfuscation sampai ke obfuscation yang paling agresif. Pengembangan Perangkat Mobile 4

153 9.4.2 Memadatkan file JAR Anda Pastikan bahwa sebelum mendistribusikan aplikasi Anda, Anda memampatkan file akhir JAR untuk distribusi. Sebuah file JAR adalah sebuah arsip ZIP, dan suatu arsip ZIP mempunyai beberapa tingkat tekanan (termasuk tanpa tekanan). NetBeans Mobility Pack tidak mendukung tingkat tekanan. Untuk mengatur pilihan tekanan JAR, buka halaman properti dari aplikasi dan pilih cabang Creating JAR. Centang radio box Compress JAR untuk memampatkan file JAR proyek Anda. Jangan lupa untuk membangun kembali proyek Anda. Pengembangan Perangkat Mobile 5

154 9.4.3 Hindari membuat class yang tidak perlu Ini akan tampak berlawanan untuk prinsip berorientasi object, tapi apakah Anda mengetahui bahwa suatu class kosong yang sederhana seperti ini : public class EmptyClass { public EmptyClass(){ akan dikompile menjadi file class dengan ukuran file sebesar 250kb (tanpa dimampatkan)? Anda dapat mencoba mengkompile class kosong ini dan buktikan sendiri. Netbeans Mobility Pack menyimpan package file JAR di dalam folder distribusi dibawah folder proyek. Anda dapat merubah nama file.jar menjadi file.zip dan buka dengan program ZIP favorit Anda untuk melihat ukuran dari file class yang Anda kompile Hindari membuat interfaces Teknik ini berkaitan dengan teknik sebelumnya. Memiliki banyak class dan interfaces akan menambahkan lebih ukuran file (kilobytes) dalam aplikasi Anda. Pengembangan Perangkat Mobile 6

155 9.4.5 Hindari inner dan anonymous class Sama seperti diatas. Inner class adalah semua class yang sama. Anonymous class mungkin tidak memiliki nama, tetapi mereka mengambil ruang yang sama untuk definisi class Gunakan satu Listener untuk object yang ganda Ini akan mengurangi banyaknya class dalam aplikasi Anda. Buatlah MIDlet Anda mengimplementasikan CommandListener interface sehingga membantu anda memangkas package Anda oleh satu class (Dimana mengurangi byte) Gunakan package default (package tanpa nama) Didalam permintaan kita untuk package berukuran kecil, memendekkan (atau tidak menggunakan) nama package tersebut mendukung pengurangan byte Batasi penggunaan dari initializer static Menggunakan inisialisasi static seperti ini : int[] tones = { 64, 63, 65, 76, 45, 56, 44, 88 ; Akan dikompile oleh kompiler Java menjadi pernyataan berikut : tones[0] = 64; tones[1] = 63; tones[2] = 65; tones[3] = 76; tones[4] = 45; tones[5] = 56; tones[6] = 44; tones[7] = 88; Contoh ini menggambarkan hanya delapan anggota array. Bayangkan jika inisialisasi ratusan nilai menggunakan statemen terpisah. Hal tersebut akan menjadikan overhead pada ukuran aplikasi Anda. Sebagai salah satu alternatif, Anda dapat menggunakan method getresourceasstream() untuk mendapatkan nilai dari sebuah file atau menggunakan single string untuk menyimpan nilai array Anda Menggabungkan gambar ke dalam satu file Memampatkan gambar lebih baik ketika di-kelompokkan menjadi satu file gambar. Karena memampatkan format gambar (contohnya PNG) adalah lebih spesifik untuk gambar daripada memampatkan method pengarsipan JAR. Ada teknik-teknik untuk mendapatkan gambar yang Pengembangan Perangkat Mobile 7

156 spesifik dari sebuah gambar yang besar yaitu dengan memotongnya Bereksperimen dengan memampatkan gambar method tekanan(compressing) tidak diciptakan sama. Beberapa mungkin memampatkan lebih baik pada beberapa jenis gambar tetapi kadang memiliki rasio yang rendah dalam memampatkan jenis gambar yang lain. Pilih sebuah format gambar yang dapat meningkatkan rasio pemampatan gambar Anda. Terkadang, rasio pemampatan juga dipengaruhi oleh software pengolah gambar yang anda gunakan. Cobalah bereksperimen dengan berbagai macam jenis software pengolah gambar untuk mendapatkan ukuran gambar yang lebih baik Gunakan class yang belum diinstal Gunakan semua class yang bisa diterapkan yang tersedia pada platform yang anda gunakan. Buatlah class Anda sendiri yang tidak akan menambah ukuran aplikasi Anda, tetapi juga mengurangi stabilitas aplikasi Anda. 9.5 Jaringan Gunakan thread yang terpisah Gunakan thread yang terpisah untuk jaringan Anda yang berfungsi untuk menghindari screen lockups Memampatkan data jaringan Menggunakan data yang dimampatkan untuk mengurangi lalu lintas jaringan dari aplikasi Anda. Hal ini akan membutuhkan client dan server Anda untuk menggunakan protokol dan method pemampatan yang sama. Memampatkan XML akan memberikan rasio yang lebih baik karena data XML terwakili dalam suatu format teks Mengurangi lalu lintas jaringan Karena komunikasi jaringan semakin lambat dan mahal, cobalah sebisa mungkin untuk memasukkan beberapa perintah kedalam satu permintaan jaringan. Ini akan mengurangi overhead yang dikenakan oleh protokol jaringan. 9.6 Penggunaan Memori Gunakan struktur data ringkas Gunakan struktur data memory yang sering digunakan. Array jarang bisa diwakili dengan cara lain tanpa mengkonsumsi jumlah yang sama dari memory. Ada tradeoff ketika mengoptimalkan untuk ukuran dan kecepatan. Menggunakan struktur data komplek akan mempengaruhi kecepatan eksekusi program Anda. Pengembangan Perangkat Mobile 8

157 9.6.2 Membebaskan object yang tidak terpakai untuk garbage collection Membebaskan object yang tak terpakai untuk garbage collection layar, koneksi jaringan, rekaman RMS. Menentukan variabel untuk menunjuk kepada object yang tak terpakai menjadi null dan akan memberi isyarat kepada garbage collector bahwa object ini aman untuk tidak diload dari memory Jangan sering menggunakan layar on-the-fly Tidak sering menggunakan object Screen (seperti Help dan about screen)on-the-fly akan banyak bebaskan banyak kebutuhan Anda yang menumpuk pada memory. Meski Anda harus membayar harga yaitu loading yang lambat untuk screen tertentu. Layar ini akan diduga menimbun pada heap memory sementara mereka tidak digunakan untuk membantu dalam penghematan memory public void commandaction(command c, Displayable d) { if (c == helpcommand) { display.setcurrent(new HelpForm()); 9.7 Latihan Ide optimisasi lainnya. Diskusikan ide-ide tentang optimisasi lainnya yang ada pada pikiran Anda atau teknik yang telah Anda kembangkan. Pengembangan Perangkat Mobile 9

158 Bab 10 Optional Packages 10.1 Tujuan Bab ini akan mempelajari tentang penulisan, build, menggunakan emulator dan packaging aplikasi J2ME. IDE yang digunakan adalah NetBeans ( dan NetBeans mobility pack. Setelah menyelesaikan pembahasan bab ini, siswa diharapkan : mengetahui fungsionalitas yang disediakan oleh Mobile Media API (MMAPI) memainkan nada sederhana menjalankan file audio dari jaringan dan file JAR mengirim dan menerima pesan SMS berkomunikasi wireless menggunakan protokol bluetooth 10.2 Pengenalan Tidak seluruh device terbuat sama dan tiap class device memiliki fitur yang berbeda beda pula. Sangatlah sulit untuk membuat spesifikasi standar yang meliputi seluruh device yang telah ada. Untuk mengakomodasi perbedaan kemampuan dari device, MIDP memiliki beberapa optional packages. Packages packages tersebut adalah spesifik dan memenuhi fitur fitur umum spesifik. Bab ini akan membahas bagaimana memulai penggunaan Mobile Media API (MMAPI) dan Wireless Messaging API (WMA) Mobile Media API (MMAPI) Mobile Media API (MMAPI) memfasilitasi pembuatan nada, memankan serta merekam audio dan video pada device yang cocok. Memainkan atau merekam sebuah media ditangani oleh dua object : DataSource dan Player. Pengembangan Perangkat Mobile 1

159 DataSource Player DataSource menangani detail cara mendapatkan data dari source yang tersedia. Source dapat berasal dari file JAR atau jaringan (melalui protokol HTTP), record dari RMS, streaming connection dari sebuah server atau sumber properietary lain. Player tidak perlu terlalu mempermasalahkan darimana data berasal atau bagaimana cara mendapatkannya. Player hanya perlu membaca data yang berasal dari DataSource, memproses, menampilkan dan memainkan playback media pada output device. Pihak ketiga dalam skenario ini adalah Manager. Manager membuat Player dari DataSource. Manager memiliki method untuk membuat Player dari lokasi sumber media (URL), DataSource dan InputStreams. Manager DataSource Player Anda dapat menjalankan query terhadap properties MMAPI melalui String System.getProperty(String key). Key microedition.media.version supports.mixing Deskripsi Versi dari spesifikasi MMAPI yang diterapkan oleh device. Contoh : 1.1 Menghasilkan return value true jika device mendukung audio mixing : dapat memainkan minimal dua nada secara bersamaan, dapat memiliki minimal dua Pengembangan Perangkat Mobile 2

160 Key Deskripsi player yang memainkan audio secara simultan, serta dapat memainkan sebuah nada meskipun paling tidak satu Player memainkan audio pada waktu yang sama supports.audio.capture supports.video.capture supports.recording Menghasilkan return value true jika mendukung fitur audio capture, dan juga sebaliknya akan dihasilkan value false Menghasilkan return value true jika mendukung fitur video capture, dan juga sebaliknya akan dihasilkan value false Menghasilkan return value true jika mendukung fitur perekaman Pembuatan Nada Memainkan sebuah nada cukup dilakukan dengan memanggil static method Manager.playTone(int tone, int duration, int volume). Nilai yang valid untuk nada adalah antara 0 hingga 127. Durasi dalam memainkan nada diatur dalam ukuran millisecond. Parameter volume memiliki jangkauan antara 0 hingga 100. import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import javax.microedition.media.*; import javax.microedition.media.control.*; import java.io.*; public class ToneMIDlet extends MIDlet implements CommandListener{ private Command exitcommand, playcommand; private Form form; private Gauge volumegauge; private Gauge durationgauge; private Gauge tonegauge; private Display display; private int duration = 2; // seconds private int volume = 100; private int tone = ToneControl.C4; private static int MAX_VOLUME = 100; private static int MAX_TONE = 127; private static int MAX_DURATION = 5; public ToneMIDlet() { playcommand = new Command("Play", Command.OK, 1); exitcommand = new Command("Exit", Command.EXIT, 1); volumegauge = new Gauge("Volume", true, MAX_VOLUME, volume); tonegauge = new Gauge("Tone", true, MAX_TONE, tone); durationgauge = new Gauge("Duration",true,MAX_DURATION,duration); form = new Form("Tone Player"); form.addcommand(playcommand); Pengembangan Perangkat Mobile 3

161 form.addcommand(exitcommand); form.append(volumegauge); form.append(durationgauge); form.append(tonegauge); public void startapp() { display = Display.getDisplay(this); form.setcommandlistener(this); display.setcurrent(form); public void pauseapp() { public void destroyapp(boolean unconditional) { public void commandaction(command c, Displayable d) { if (c == exitcommand) { notifydestroyed(); if (c == playcommand){ try { volume = volumegauge.getvalue(); tone = tonegauge.getvalue(); duration = durationgauge.getvalue(); Manager.playTone(tone, duration*1000, volume); catch (MediaException mex){ Audio Playback Method Manager.createPlayer(String URI) memudahkan pembuatan sebuah Player yang akan memainkan data dari URI. import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import javax.microedition.media.*; import javax.microedition.media.control.*; import java.io.*; public class NetAudioMidlet extends MIDlet implements CommandListener{ private Command exitcommand, playcommand; private Form form; private Gauge volumegauge; private Display display; private int volume = 100; private static int MAX_VOLUME = 100; Player player; public NetAudioMidlet() { playcommand = new Command("Play", Command.OK, 1); exitcommand = new Command("Exit", Command.EXIT, 1); volumegauge = new Gauge("Volume", true, MAX_VOLUME, volume); form = new Form("Audio Player"); Pengembangan Perangkat Mobile 4

162 form.addcommand(playcommand); form.addcommand(exitcommand); form.append(volumegauge); public void startapp() { display = Display.getDisplay(this); form.setcommandlistener(this); display.setcurrent(form); try { player = Manager.createPlayer( " v"); player.realize(); // pre-fetch media untuk mengurangi latency player.prefetch(); catch (IOException ioex) { display.setcurrent(new Alert("IO Exception", ioex.getmessage(), null, AlertType.ERROR)); catch (MediaException mex) { display.setcurrent(new Alert("Media Exception", mex.getmessage(), null, AlertType.ERROR)); public void pauseapp() { public void destroyapp(boolean unconditional) { public void commandaction(command c, Displayable d) { if (c == exitcommand) { notifydestroyed(); if (c == playcommand){ try { VolumeControl control = (VolumeControl) player.getcontrol("volumecontrol"); if (control!= null){ control.setlevel(volumegauge.getvalue()); player.start(); catch (MediaException mex) { display.setcurrent(new Alert("Media Exception", mex.getmessage(), null, AlertType.ERROR)); catch (Exception ex){ display.setcurrent(new Alert("Exception", ex.getmessage(), null, AlertType.ERROR)); Pengembangan Perangkat Mobile 5

163 Anda juga dapat memainkan media yang berasal dari file JAR dengan membuat Stream dari resource file dan meneruskannya pada method Manager.createPlayer() import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import javax.microedition.media.*; import javax.microedition.media.control.*; import java.io.*; public class AudioMidlet extends MIDlet implements CommandListener{ private Command exitcommand, playcommand; private Form form; private Gauge volumegauge; private Display display; private int volume = 100; private static int MAX_VOLUME = 100; Player player; public AudioMidlet() { playcommand = new Command("Play", Command.OK, 1); exitcommand = new Command("Exit", Command.EXIT, 1); volumegauge = new Gauge("Volume", true, MAX_VOLUME, volume); form = new Form("Audio Player"); form.addcommand(playcommand); form.addcommand(exitcommand); form.append(volumegauge); public void startapp() { display = Display.getDisplay(this); form.setcommandlistener(this); display.setcurrent(form); public void pauseapp() { public void destroyapp(boolean unconditional) { public void commandaction(command c, Displayable d) { if (c == exitcommand) { notifydestroyed(); if (c == playcommand){ try { InputStream stream = getclass(). getresourceasstream("bong.wav"); player = Manager.createPlayer(stream, "audio/x-wav"); player.realize(); VolumeControl control = (VolumeControl) player.getcontrol("volumecontrol"); if (control!= null){ control.setlevel(volumegauge.getvalue()); player.start(); catch (MediaException mex) { display.setcurrent(new Alert("Media Exception", mex.getmessage(), null, AlertType.ERROR)); catch (Exception ex){ display.setcurrent(new Alert("Exception", ex.getmessage(), null, AlertType.ERROR)); Pengembangan Perangkat Mobile 6

164 10.4 Wireless Messaging API (WMA) Mengirim SMS Menggunakan Wireless Messaging API serupa dengan ketika menyambungkan via Socket dan Datagram. Dalam kenyataannya, hal tersebut menggunakan framework yang sama the Generic Connection Framework (GCF). Format koneksi URL yang digunakan adalah sms:// , dimana adalah nomor telepon yang ingin Anda kirimkan sebuah pesan. public void sendsms(string number, String message) throws Exception{ String url = "sms://" + number; MessageConnection connection = (MessageConnection) Connector.open(url); TextMessage msg = (TextMessage) connection.newmessage( MessageConnection.TEXT_MESSAGE); msg.setpayloadtext(message); connection.send(msg); connection.close(); Pengembangan aplikasi wireless pada NetBeans Mobility Pack 4.1 sangat nyaman. Anda tidak perlu untuk mencoba mengirim pesan SMS hanya untuk mengetes aplikasi Anda. NetBeans Mobility Pack hadir dengan J2ME Wireless Toolkit. Toolkit ini hadir dengan emulator di dalamnya. Dan juga terdapat tool-tool untuk tes mengirim dan menerima pesan SMS. Anda dapat mengkonfigurasikan nomor telepon dari telepon yang di-emulasikan dengan membuka pilihan pada WMA. Tools Java Platfrom Manager J2ME Wireless Toolkit 2.2 Tool dan Ekstensi : 1. Membuka Preferences -> WMA 2. Membuka Utility -> WMA: Open Console Pengembangan Perangkat Mobile 7

165 Pengembangan Perangkat Mobile 8

166 Pengembangan Perangkat Mobile 9

167 Pengembangan Perangkat Mobile 10

168 import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import javax.microedition.io.*; import javax.wireless.messaging.*; public class SMSMidlet extends MIDlet implements CommandListener, Runnable { private Command exitcommand, sendcommand; private Form form; private TextField addressfield, mesgfield; private Display display; public SMSMidlet() { sendcommand = new Command("Send", Command.OK, 1); exitcommand = new Command("Exit", Command.EXIT, 1); addressfield = new TextField( "Phone Number", " ", 32, TextField.ANY); mesgfield = new TextField( "Message", "hello, world!", 160, TextField.ANY); form = new Form("SMS Message"); form.append(addressfield); form.append(mesgfield); form.addcommand(sendcommand); form.addcommand(exitcommand); public void startapp() { display = Display.getDisplay(this); form.setcommandlistener(this); display.setcurrent(form); public void pauseapp() { public void destroyapp(boolean unconditional) { Pengembangan Perangkat Mobile 11

169 public void commandaction(command c, Displayable d) { if (c == exitcommand) { notifydestroyed(); if (c == sendcommand) { Thread thread = new Thread( this ); thread.start(); /** * Sends an SMS message to number. This method will throw an exception * if there is an error in connecting or sending the message. number message */ public void sendsms(string number, String message) throws Exception{ String url = "sms://" + number; MessageConnection connection = (MessageConnection) Connector.open(url); TextMessage msg = (TextMessage) connection.newmessage( MessageConnection.TEXT_MESSAGE); msg.setpayloadtext(message); connection.send(msg); connection.close(); public void run() { try { String address = addressfield.getstring(); String message = mesgfield.getstring(); sendsms(address, message); display.setcurrent(new Alert("SMS Message", "Message Sent\n" + "To: " + address + "\n" + "Message: " + message, null, AlertType.INFO)); Pengembangan Perangkat Mobile 12

170 catch (Exception ex) { display.setcurrent(new Alert("SMS Error", ex.getmessage(), null, AlertType.ERROR)); Pengembangan Perangkat Mobile 13

171 Pengembangan Perangkat Mobile 14

172 Pengembangan Perangkat Mobile 15

173 Pengembangan Perangkat Mobile 16

174 Menerima SMS Untuk menerima sebuah pesan teks, buka sebuah port yang spesifik dari MessageConnection. String protocol untuk pesan SMS adalah sms. Perintah ini akan menangkap kedatangan pesan SMS dari port 8888: conn = (MessageConnection) Connector.open("sms://:8888"); Kita harus mendaftarkan aplikasi Kita untuk menjadi sebuah Message Listener sehingga AMS akan memperhatikan MIDlet Kita dari pesan yang masuk. conn.setmessagelistener(this); NotifyIncomingMessage akan dipanggil oleh AMS ketika sebuah sebuah pesan diterima oleh perangkat. Kita akan membutuhkan pembuatan sebuah Thread yang terpisah untuk membaca pesan sehingga method panggilan ulang Listener dapat berakhir tiba-tiba. public void notifyincomingmessage(messageconnection messageconnection) { if (thread == null){ thread = new Thread(this); thread.start(); Pengembangan Perangkat Mobile 17

175 Dalam method run() Kita, Kita telah siap untuk mendapatkan sebuah pesan : public void run(){ try { // menunggu dan menerima pesan Message mesg = conn.receive(); // menerima pesan // Mengecek apakah pesan berbentuk Teks if (mesg!= null && mesg instanceof TextMessage) { TextMessage text = (TextMessage) mesg; addressfield.settext(text.getaddress()); mesgfield.settext(text.getpayloadtext()); datefield.settext("" + text.gettimestamp()); statusfield.settext("message received."); catch (Exception e) { statusfield.settext("error: " + e.getmessage()); thread = null; Berikut adalah listing program yang lengkap untuk penerima SMS : import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import javax.microedition.io.*; import javax.wireless.messaging.*; public class SMSReceiverMidlet extends MIDlet implements CommandListener, MessageListener, Runnable { private Command exitcommand, sendcommand; private Form form; private StringItem statusfield, addressfield, mesgfield, datefield; private Display display; Pengembangan Perangkat Mobile 18

176 private MessageConnection conn; private Thread thread; private String port = "8888"; public SMSReceiverMidlet() { exitcommand = new Command("Exit", Command.EXIT, 1); statusfield = new StringItem("Status:", ""); addressfield = new StringItem("From:", ""); mesgfield = new StringItem("Message:", ""); datefield = new StringItem("Timestamp:", ""); form = new Form("SMS Receiver"); form.append(statusfield); form.append(addressfield); form.append(mesgfield); form.append(datefield); form.addcommand(exitcommand); public void startapp() { display = Display.getDisplay(this); form.setcommandlistener(this); startreceiver(); display.setcurrent(form); public void pauseapp() { thread = null; public void destroyapp(boolean unconditional) { thread = null; if (conn!= null){ try { conn.close(); catch (Exception ex){ Pengembangan Perangkat Mobile 19

177 public void commandaction(command c, Displayable d) { if (c == exitcommand) { notifydestroyed(); private void startreceiver(){ try { String addr = "sms://:" + port; if (conn == null){ conn = (MessageConnection) Connector.open(addr); conn.setmessagelistener(this); statusfield.settext( "waiting for message at port " + port); catch (Exception ex){ statusfield.settext("cannot open connection on port " + port + ":" + ex.getmessage()); thread = new Thread(this); thread.start(); public void notifyincomingmessage(messageconnection messageconn){ if (thread == null){ thread = new Thread(this); thread.start(); public void run(){ try { Pengembangan Perangkat Mobile 20

178 // menunggu dan menerima pesan Message mesg = conn.receive(); // menerima pesan // mengecek apakah pesan berbasis teks if (mesg!= null && mesg instanceof TextMessage) { TextMessage text = (TextMessage) mesg; addressfield.settext(text.getaddress()); mesgfield.settext(text.getpayloadtext()); datefield.settext("" + text.gettimestamp()); statusfield.settext("message received."); else { statusfield.settext( "Non-text message received: " + mesg.getclass().tostring()); catch (Exception e) { statusfield.settext("error: " + e.getmessage()); thread = null; Pengembangan Perangkat Mobile 21

179 Pengembangan Perangkat Mobile 22

180 Pengembangan Perangkat Mobile 23

181 10.5 Penggunaan Bluetooth bagi komunikasi Wireless Gambaran Umum Bluetooth telah didesain bagi alat komunikasi personal yang mendukung komunikasi tanpa kabel(wireless) seperti pada mobile phone maupun PDA dengan jarak sampai 10 kilometer. Bluetooth adalah sebuah protokol komunikasi yang beroperasi pada frekuensi 2.4 GHz. Sinyal dari bluetooth adalah omni-directional yang dapat menembus tembok. Ia dapat menerima data dan juga suara. Device yang mendukung komunikasi bluetooth dapat dengan mudah menemukan koneksi dan juga berkomunikasi dengan device yang lain secara otomatis. Bluetooth dapat digunakan untuk mengirim file, membangun sebuah jaringan tertentu, sinkronisasi data, mengkoneksikan sekitar misalnya dengan hands-free kits dan gaming. Berikut ini adalah beberapa karakteristik dari Bluetooth: 1. Tiga penggolongan yang berbeda berdasarkan jangkauan: kelas 1: 100m, kelas2 = 20m, dan kelas 3=10m 2. Kecepatan 1Mb/s 3. Mengkonsumsi energi yang cukup rendah 4. Dapat mentransfer baik suara maupun data 5. Menggunakan signal Omni-direction GHz 2.482GHz band Jaringan Bluetooth Bluetooth devices dibagi lagi menjadi group-group kecil yang disebut piconet. Didalam piconet, ada sebuah master dan satu atau lebih slaves. Sampai 7 buah slaves bisa diterima didalam sebuah piconet. Sedangkan master unit adalah sesuatu yang memulai proses komunikasi. Ia akan menggunakan komunikasi point-tomultipoint. Sebuah device didalam sebuah piconet mampu berkomunikasi dengan bluetooth device didalam piconet yang lain. Sebuah slave didalam piconet tertentu mungkin dapat menjadi slave didalam piconet yang berbeda. Sebuah master didalam sebuah piconet dapat menjadi slave pada piconet yang lain. Komunikasi antar piconet tersebut dapat berasal dari jaringan manapun. Dalam rangka untuk pemeliharaan baterai, bluetooth memiliki tiga low modus operasi yang hemat energi: Pengembangan Perangkat Mobile 24

182 Pada modus sniff, sebuah slave device akan memperhatikan berkurangnya level energi, dimana ia tidak berpengaruh terhadap piconet. Pada modus hold, sebuah device tidak hanya mengirimkan data tetapi ia juga melakukan synkronisasi secara konstan dengan master. Ia bukanlah member aktif dari piconet, tetapi ia menyimpan alamat member yang aktif. Sebuah device pada modus park berlaku seperti device pada modus hold, akan tetapi ia tidak menyimpan alamat member yang aktif. Profile Bluetooth Profile dari bluetooth telah ditentukan dengan memperhatikan interoperability antara device dan aplikasi dari beberapa manufaktur. Sebuah profile mendefinisikan roles dan kemampuan yang dimiliki oleh tipe aplikasi tertentu. Sebuah device hanya dapat berkomunikasi dengan device yang lain apabila mereka memiliki profile yang sama. Semua bluetooth device harus menggunakan Generic Access Profile. Profile ini menentukan prosedure koneksi, device discovery, dan management link. Sebuah Service Discovery Profile mendefinisikan fitur dan prosedur bagi aplikasi bluetooth untuk mengenali segala servis yang telah ditentukan pada bluetooth device yang lain. Sebuah profile sinkronisasi menentukan hal-hal apa saja yang dibutuhkan pada dua atau lebih devices untuk mensinkronisasikan data. Profile bluetooth yang lain telah didefinisikan juga pada spesifikasi bluetooth. Akan tetapi tidak akan dibicarakan dalam materi ini. Keamanan pada Bluetooth Spesifikasi dari Bluetooth telah menyediakan spesifikasi untuk keamanan dalam tiga hal. Pertama dengan menggunakan frekuensi, yang diharapkan dapat membuat eavesdropper dari komunikasi bluetooth mengalami kesulitan. Limit pada koneksi autentikasi pada device tertentu. Enkripsi dengan secret key untuk membuat data tidak dapat dibaca oleh eavesdropper. Generic Access Profile telah mendefinisikan sebuah security model yang melingkupi tiga modus security: Mode 1: Sebuah modus yang tidak aman karena tidak adanya prosedur keamanan. Mode 2: Keamanan yang berada pada level servis. Tidak ada prosedur keamanan yang diinisialisasi sebelum channel komunikasi dibangun. Aplikasi mungkin mendapatkan kesulitan policy akses. Mode 3: Keamanan yang berada pada level link. Sebuah prosedur keamanan akan diinisialisasi sebelum menyelesaikan link-setup. Pengembangan Perangkat Mobile 25

183 Protocol Stack pada Bluetooth Berikut ini adalah ilustrasi dari Bluetooth protokol stack yang pertama. Application Java Bluetooth API JSR-82 OBEX Service Discovery RFCOMM L2CAP Host Controller Interface (HCI) Bluetooth J2ME optional package seperti telah didefinisikan pada pada JSR 82 akan mendukung Anda untuk mengontrol bluetooth device. Untuk mengirimkan data diantara device yang mendukung bluetooth, Anda mungkin dapat menggunakan satu dari tiga koneksi berikut ini: L2CAP, RFCOMM, dan OBEX. L2CAP untuk data packet RFCOMM satu layer diatas protokol L2CAP dan digunakan untuk data streaming. OBEX digunakan untuk data object Aplikasi RFCOMM Contoh aplikasi berikut ini menggunakan protokol serial RFCOMM untuk berkomunikasi dengan device bluetooth. Aplikasi ini adalah tulang punggung dari sebuah information server dan client-nya. Server pertama kali akan mendaftarkan service-nya: Pengembangan Perangkat Mobile 26

184 localdevice = LocalDevice.getLocalDevice(); localdevice.setdiscoverable(discoveryagent.giac); notifier = (StreamConnectionNotifier) Connector.open(URL); Kemudian ia akan menunggu koneksi: StreamConnection conn = notifier.acceptandopen(); Sekali sebuah koneksi diterima, kemudian ia akan membaca command dan menjawab dengan jawaban yang tepat dengan menggunakan method untuk koneksi serial. Client pertama kali akan mencari device yang tersedia untuk service tersebut: LocalDevice localdevice = LocalDevice.getLocalDevice(); discoveryagent = localdevice.getdiscoveryagent(); discoveryagent.startinquiry(discoveryagent.giac, this); Client akan meng-implement DiscoveryListener dan meng-override method yang diperlukan untuk menerima notifikasi dari device. Sekali device ditemukan dan proses pencarian servis sudah selesai dilaksanakan, kemudian command tertentu akan dibutuhkan. InfoServer.java: import javax.bluetooth.*; import javax.microedition.lcdui.*; import javax.microedition.io.*; import java.io.*; public class InfoServer implements Runnable { InputStream input; OutputStream output; StreamConnectionNotifier notifier; StreamConnection conn; LocalDevice localdevice; ServiceRecord servicerecord; Pengembangan Perangkat Mobile 27

185 public static String SERVICE_NAME = "chat"; public static UUID PORT = new UUID(0x0518); private boolean isrunning = false; private static String URL = "btspp://localhost:" + PORT + ";name=" + SERVICE_NAME + ";authorize=true"; public InfoServer() { isrunning = false; Thread thread = new Thread(this); thread.start(); public void run() { if (!isrunning) { try { conn = null; localdevice = LocalDevice.getLocalDevice(); localdevice.setdiscoverable(discoveryagent.giac); notifier = (StreamConnectionNotifier) Connector.open(URL); catch (BluetoothStateException e) { System.err.println("Bluetooth Exception: " + e.getmessage()); catch (IOException e) { System.err.println( "IO Exception: " + e.getmessage()); isrunning = true; while (true) { Pengembangan Perangkat Mobile 28

186 try { System.out.println("Waiting for connection...\n"); // Menunggu koneksi conn = notifier.acceptandopen(); // Membaca command String msg = BluetoothMidlet.read(conn); System.out.println("Received from Client: " + msg); // Mengirim balasan msg = "InfoServer: Your command was: " + msg; output = conn.openoutputstream(); output.write(msg.length()); output.write(msg.getbytes()); output.close(); catch (Exception ex) { System.err.println("Bluetooth Server Exception: " + ex); InfoClient.java: import javax.bluetooth.*; import javax.microedition.io.*; import java.io.*; class InfoClient implements DiscoveryListener { private DiscoveryAgent discoveryagent; private RemoteDevice[] remotedevices; private UUID[] UUIDSet; private String URL; public InfoClient() { try { Pengembangan Perangkat Mobile 29

187 LocalDevice localdevice = LocalDevice.getLocalDevice(); discoveryagent = localdevice.getdiscoveryagent(); discoveryagent.startinquiry(discoveryagent.giac, this); catch (Exception e) { System.out.println(e); public void devicediscovered(remotedevice btdevice, DeviceClass cod) { try { // Mendapatkan informasi dari device System.out.println("deviceDiscovered()"); System.out.println("Address: " + btdevice.getbluetoothaddress()); System.out.println("Major Device Class: " + cod.getmajordeviceclass()); System.out.println("Minor Device Class: " + cod.getminordeviceclass()); System.out.println("Friendly Name: " + btdevice.getfriendlyname(true)); UUIDSet = new UUID[1]; UUIDSet[0] = InfoServer.PORT; int searchid = discoveryagent.searchservices(null, UUIDSet, btdevice, this); catch (Exception e) { System.out.println("Exception: " + e); public void servicesdiscovered(int transid, ServiceRecord[] servrecord) { System.out.println("servicesDiscovered()"); for (int i=0; i<servrecord.length; i++) { Pengembangan Perangkat Mobile 30

188 URL = servrecord[i].getconnectionurl(0, false); public void servicesearchcompleted(int transid, int responsecode) { switch (responsecode) { case SERVICE_SEARCH_COMPLETED: System.out.println("SERVICE_SEARCH_COMPLETED\n"); System.out.println("Service URL: " + URL); StreamConnection conn = null; try { String msg = "INFO"; conn = (StreamConnection)Connector.open(URL); OutputStream output = conn.openoutputstream(); output.write(msg.length()); output.write(msg.getbytes()); output.close(); System.out.println(BluetoothMidlet.read(conn)); + ioe); catch (Exception ex) { System.out.println(ex); finally { try { conn.close(); catch (IOException ioe) { System.out.println("Error Closing connection " break; case SERVICE_SEARCH_ERROR: System.out.println("SERVICE_SEARCH_ERROR\n"); break; case SERVICE_SEARCH_TERMINATED: Pengembangan Perangkat Mobile 31

189 "); System.out.println("SERVICE_SEARCH_TERMINATED"); break; case SERVICE_SEARCH_DEVICE_NOT_REACHABLE: System.out.println("SERVICE_SEARCH_DEVICE_NOT_REACHABLE break; case SERVICE_SEARCH_NO_RECORDS: System.out.println("SERVICE_SEARCH_NO_RECORDS"); break; default: break; public void inquirycompleted(int disctype) { System.out.println("inquiryCompleted()"); BluetoothMidlet.java: import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import javax.microedition.io.*; import javax.bluetooth.*; import java.io.*; public final class BluetoothMidlet extends MIDlet implements CommandListener { 1); private final Command okcmd = new Command("Start", Command.OK, 1); private final Command exitcmd = new Command("Exit", Command.EXIT, private static final String[] commands = { "Server", "Client" ; private final List menu = new List("Bluetooth Application", List.IMPLICIT, commands, null); Pengembangan Perangkat Mobile 32

190 Display display; private InfoClient chatclient; private InfoServer chatserver; public BluetoothMidlet() { menu.addcommand(exitcmd); menu.addcommand(okcmd); menu.setcommandlistener(this); public void startapp() { display = Display.getDisplay(this); display.setcurrent(menu); protected void destroyapp(boolean unconditional) { protected void pauseapp() { public void commandaction(command c, Displayable d) { if (c == exitcmd) { destroyapp(true); notifydestroyed(); return; switch (menu.getselectedindex()) { case 0: chatserver = new InfoServer(); break; case 1: chatclient = new InfoClient(); break; default: break; ; Pengembangan Perangkat Mobile 33

191 public final static String read(streamconnection conn) { InputStream is = null; byte[] databytes = null; int len; try { is = conn.openinputstream(); len = is.read(); databytes = new byte[len]; len = 0; - len); while (len!= databytes.length) { int readlen = is.read(databytes, len, databytes.length if (readlen == -1) { System.err.println("Error reading data."); len += readlen; catch (IOException ex) { System.err.println(ex); finally { if (is!= null) { try { is.close(); catch (IOException ex) { return new String(dataBytes); Pengembangan Perangkat Mobile 34

192 10.6 Lokasi API Location-based Services Location based services memanfaatkan lokasi dari device untuk menyediakan informasi mengenai lokasi. Pertanyaan utama yang dijawab oleh Location Based Service adalah Dimana saya?. Untuk lebih spesifiknya adalah Dimana letak device?. Aplikasi yang lebih popular mengenai penginformasian lokasi adalah dengan menggunakan telepone genggam, orang tua dapat melacak dimana anaknya sekarang berada. Atau dengan telepone genggam tersebut dapat menemukan toko atau restoran yang paling dekat, mendapatkan informasi mengenai lalu lintas pada lokasi tertentu dan mendapatkan sebuah arahan menuju tempat tertentu. Penggunakan data mengenai lokasi untuk mendapatkan pengalaman yang lebih pada game dan juga bagi aplikasi-aplikasi social networking adalah beberapa contoh dari banyaknya kemungkinan aplikasi yang dapat memanfaatkan penginformasian lokasi. Lokasi dari device ditentukan oleh salah satu dari beberapa location service yang telah tersedia seperti Global Positioning System (GPS) atau informasi dari jaringan seluler itu sendiri (seperti site ID dari seluler). GPS memanfaatkan network dari satelit untuk digunakan dan dikontrol oleh Departemen pertahanan US. GPS dapat menjadi tidak efektif, apabila ia didalam bangunan atau diantara tumbuh-tumbuhan yang lebat. Akan tetapi, ia sangat akurat sampai 5-30 meter. Penginformasian lokasi dari dari seluler site dapat digunakan apabila aplikasi tidak membutuhkan banyak akurasi. Lingkup dari cell site sangat bervariasi, dari beberapa kilometer sampai dengan 20 kilometer. The Location API for J2ME (JSR 179) javax.microedition.location package memiliki class-class yang digunakan untuk mendapatkan informasi mengenai lokasi sebuah device. Beberapa method khusus digunakan untuk menentukan terminal dari lokasi device. API tersebut akan mengembalikan informasi-informasi berikut ini: 1. Garis Lintang 2. Garis Bujur 3. Keakuratan dari informasi mengenai garis lintang dan bujur 4. Timestamp pada saat penentuan sebuah lokasi Ketersediaan dari fitur-fitur diatas bergantung pada method yang digunakan untuk menentukan informasi lokasi: Pengembangan Perangkat Mobile 35

193 Ketinggian dari permukaan laut dan keakuratan dari pengukuran tersebut. Informasi mengenai kecepatan dan jalan raya Informasi mengenai alamat Proximity landmark pada event tertentu Sebagai kompas yang menunjuk ke arah utara sesuai dengan orientasi dari device Informasi mengenai pitch (puncak) dan roll Location Provider Location provider berfungsi sebagai sumber dari penginformasian lokasi. Aplikasi dapat menyediakan sebuah kriteria (dimungkinkan juga termasuk akurasinya) pada saat mendapatkan instance dari LocationProvider. Method yang mengakses informasi mengenai lokasi akan melalui SecurityException jika aplikasi tidak mendapatkan permission untuk mengakses informasi tertentu. Pengembangan Perangkat Mobile 36

194 Security Tabel Loc01 terdiri dari nama-nama permission dan method yang dilindungi oleh permission tersebut. Nama Permission javax.microedition.location.location javax.microedition.location.orientatio n javax.microedition.location.proximityl istener javax.microedition.location.landmarkst Method yang dilindungi LocationProvider.getLocation(), LocationProvider.setLocationListener() Orientation.getOrientation() LocationProvider.addProximityListener( ) LandmarkStore.getInstance(), Pengembangan Perangkat Mobile 37

195 ore.read Nama Permission javax.microedition.location.landmarkst ore.write javax.microedition.location.landmarkst ore.category javax.microedition.location.landmarkst ore.management Method yang dilindungi LandmarkStore.listLandmarkStores() LandmarkStore.addLandmark(), LandmarkStore.deleteLandmark(), LandmarkStore.removeLandmarkFromCatego ry(), LandmarkStore.updateLandmark() LandmarkStore.addCategory(), LandmarkStore.deleteCategory() LandmarkStore.createLandmarkStore(), LandmarkStore.deleteLandmarkStore() Landmarks Location API juga mendukung penyimpanan informasi mengenai landmark dengan menggunakan LandmarkStores. Device yang menggunakan JSR 179 memerlukan paling tidak satu LandmarkStore untuk menyimpan sebuah landmark. Sebuah landmark adalah sebuah lokasi yang nama-nya diketahui oleh user. Sebuah landmark juga dapat terdiri dari penjelasan-penjalasan (text), garis koordinat, dan informasi mengenai alamat (optional). Sebuah landmark direpresentasikan dengan Location API dalam class javax.microedition.location.landmark. Class ini hanya merupakan sebuah container dari informasi. LandmarkStore class terdiri dari method-method pada proses penyimpanan data, pengambilan kembali data yang sudah ada, dan juga menghapus sebuah landmark didalam sebuah persistent landmark store. Penggunaan dari Location API paling tidak memiliki sebuah landmark store, sebagai default. Implementasi yang lain dari Location API dimungkinkan untuk mendukung lebih dari sebuah landmark store dan kemudian semua data yang disimpan akan digunakan secara bersama-sama oleh beberapa aplikasi. Penamaan sebuah landmark sangat dibutuhkan dan nama tersebut akan dipresentasikan kepada user. Landmark dapat ditempatkan pada Category nol atau yang lain. Nama sebuah category haruslah unique didalam landmark store, akan tetapi nama sebuah landmark dimungkinkan untuk diduplikasi didalam sebuah landmark store. Location Listener Sebuah location listener tunggal dapat meregistrasikan dirinya kepada sebuah instance Landmark provider. Listener ini harus implement LocationListener interface. Method locationupdate() akan dipanggil berulang kali didalam sistem tergantung kepada interval yang diberikan oleh aplikasi. Pengembangan Perangkat Mobile 38

196 Sistem tidak akan menggaransi bahwa method tersebut akan dipanggil pada interval tertentu. Akan tetapi, dimungkinkan location provider memberikan informasi yang tidak akurat terutama apabila location provider tersebut tidak dapat memberikan informasi mengenai lokasi tersebut tepat waktu. Method providerstatechanged() juga akan dipanggil kemudian status dari location provider akan berubah. Implementasi dari method ini akan di-return seketika. Apabila method ini membutuhkan waktu yang cukup lama pada saat implementasi, maka aplikasi tersebut harus menggunakan thread secara terpisah. Proximity Listener Baik nol maupun lebih proximity listener harus didaftarkan pada object dari landmark provider. Method proximityevent() dari proximity listener akan dipanggil apabila device tersebut terletak didalam jangkauan koordinat yang telah didaftarkan. Sebuah proximity listener harus didaftarkan lagi (jika diperlukan) setelah pemanggilan sebuah method karena proses pendaftaran akan tertunda pada saat listener dipanggil. Pengidentifikasian Location API Sebuah aplikasi dapat mengetest eksistensi dan versi dari Location API dengan cara meng-query sistem property dengan kunci microedition.location.version. Method System.getProperty yang telah disediakan dengan kunci tersebut akan me-return versi string. Misalnya, implementasi dari JSR 179 pada versi 1.0 akan me-return string 1.0. Location API yang didukung oleh Sun Java Wireless Toolkit Pengembangan Perangkat Mobile 39

197 Pengembangan Perangkat Mobile 40

198 Sejak versi 2.3, Sun Java Wireless Toolkit memberikan dukungan pada Location API. Preference pada API dapat dimodifikasi dengan cara: Tools-> Java Platform Manager -> J2ME -> Sun Java Wireless Toolkit -> Tools and Extensions -> Open Preferences -> Location. Landmark dapat di-manage pada bagian Utilities dari Toolkit. Dari MIDlet window (pada saat Anda menjalankan aplikasi dari emulator), window External Events dapat diakses pada menu. Pada tab Location, Anda dapat mensimulasikan dan memodifikasi lokasi device saat ini. Location01.java: /* * LocationMidlet.java * */ package jedi; Pengembangan Perangkat Mobile 41

199 import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import javax.microedition.location.*; /** * jedi */ public class LocationMidlet extends MIDlet implements CommandListener, Runnable { 1); private final Command exitcmd = new Command("Exit", Command.EXIT, private final Command locationcmd = new Command("Location", Command.ITEM, 1); private Display display; private Form mainform = new Form("JEDI: Location Example"); private StringItem latitude = new StringItem("Latitude:", "", Item.PLAIN); private StringItem longtitude = new StringItem("Longtitude:", "", Item.PLAIN); private StringItem altitude = new StringItem("Altitude:", "", Item.PLAIN); private StringItem speed = new StringItem("Speed:", "", Item.PLAIN); private StringItem course = new StringItem("Course:", "", Item.PLAIN); private StringItem locmethod = new StringItem("Method:", "", Item.PLAIN); private StringItem timestamp = new StringItem("Timestamp:", "", Item.PLAIN); private StringItem status = new StringItem("Status:", "", Item.PLAIN); private StringItem version = new StringItem("Version:", "Unknown", Item.PLAIN); private LocationProvider locationprovider; public LocationMidlet() { mainform.addcommand(exitcmd); mainform.addcommand(locationcmd); mainform.setcommandlistener(this); Pengembangan Perangkat Mobile 42

200 on")); version.settext(system.getproperty("microedition.location.versi mainform.append(version); mainform.append(latitude); mainform.append(longtitude); mainform.append(altitude); mainform.append(speed); mainform.append(course); mainform.append(locmethod); mainform.append(timestamp); mainform.append(status); public void startapp() { display = Display.getDisplay(this); display.setcurrent(mainform); public void pauseapp() { public void destroyapp(boolean unconditional) { public void commandaction(command c, Displayable d) { if (c == locationcmd) { Thread thread = new Thread(this); thread.start(); if (c == exitcmd) { destroyapp(true); notifydestroyed(); return; public void run() { try { Pengembangan Perangkat Mobile 43

201 Criteria cr = new Criteria(); // Men-set akurasi Horisontal ke 1 kilometer cr.sethorizontalaccuracy(0); cr.setverticalaccuracy(0); LocationProvider provider = LocationProvider.getInstance(cr); // Timeout setelah 30 detik Location loc = provider.getlocation(30); Coordinates coord = loc.getqualifiedcoordinates(); if (coord!= null) { if (loc.isvalid()) { latitude.settext(coordinates.convert(coord.getlatit ude(), Coordinates.DD_MM_SS)); longtitude.settext(coordinates.convert(coord.getlon gitude(), Coordinates.DD_MM_SS)); )); ); ethod())); altitude.settext(float.tostring(coord.getaltitude() timestamp.settext(long.tostring(loc.gettimestamp()) speed.settext(float.tostring(loc.getspeed())); locmethod.settext(integer.tostring(loc.getlocationm course.settext(float.tostring(loc.getcourse())); status.settext("valid Location Information"); else { status.settext("invalid Location Information"); catch (LocationException e) { status.settext("exception:" + e.getmessage()); catch (InterruptedException e) { status.settext("timeout: " + e.getmessage()); Pengembangan Perangkat Mobile 44

202 Pengembangan Perangkat Mobile 45

203 10.7 Latihan Audio Player Buatlah sebuah MIDlet yang dapat memainkan file audio sebagai sebuah indefinite loop. Audio tersebut akan dibaca dari JAR file. Petunjuk: Anda harus menge-set properti dari player untuk mengontrol looping SMS Auto-Responder Buatlah sebuah MIDlet yang secara otomatis akan me-reply apabila ia menerima sebuah text message. Petunjuk: Anda dapat memodifikasi SMSReceiverMidlet dan menggunakan koneksi yang sama untuk me-reply pesan. Pengembangan Perangkat Mobile 46

204 Bab 11 Topik-topik Tambahan 11.1 Tujuan Setelah menyelesaikan bab ini, siswa diharapkan mampu: mengatur jadwal tugas menggunakan Timers meregister koneksi yang datang pada Push Registry 11.2 Timers Timer dan TimerTasks berfungsi agar Anda bisa melakukan penjadwalan tugas pada suatu waktu. Tugas dapat juga dijadwalkan untuk diulang-ulang sampai interval tertentu. Anda dapat membuat tugas dengan menurunkan (extending) TimerTask dan mengimplement method run(). Method run() akan dieksekusi berdasarkan jadwal yang ada pada Timer. class CounterTask extends TimerTask { int counter = 0; public void run() { System.out.println("Counter: " + counter++); Untuk menjadwalkan sebuah tugas, buat sebuah Timer dan gunakan method schedule() yang ada pada Timer untuk menjadwalkan jalannya tugas. Setiap Timer berjalan pada bagian yang terpisah. Method schedule() memiliki beberapa bentuk. Anda dapat mengatur waktu tugas untuk mulai dengan memberikan delay dalam mililiseconds atau dengan memberikan waktu absolut (java.util.date). Parameter ketiga pada method schedule() adalah periode pengulangan dari tugas. Jika nilai pengulangan diberikan, tugas akan dieksekusi dalam periode waktu tertentu. Timer timer = new Timer(); TimerTask task = new CounterTask(); Pengembangan Perangkat Mobile 1

205 // task akan dimulai dalam 8 detik dan diulangi setiap 1 detik timer.schedule(task, 8000, 1000); Anda dapat menghentikan timer dengan menggunakan method close(). Method ini dapat menghentikan timer dan mengabaikan tugas yang dijadwalkan. Perlu Anda catat, bahwa ketika Timer dihentikan, maka tidak dapat diulangi (direstart) kembali. void schedule(timertask task, Long delay) Melakukan penjadwalan tugas untuk dieksekusi sesudah menentukan delay yang diinginkan (dalam milliseconds) void schedule(timertask task, Long delay, long period) Melakukan penjadwalan tugas untuk dieksekusi berulang-ulang, dimulai sesudah delay yang ditentukan (dalam milliseconds) void schedule(timertask task, Date time) Melakukan penjadwalan tugas agar dapat dieksekusi pada waktu yang ditentukan. void schedule(timertask task, Date time, long period) Melakukan penjadwalan tugas untuk dieksekusi berulang-ulang, dimulai pada waktu yang ditentukan. void cancel() Menghentikan timer, mengabaikan tugas yang dijadwalkan. import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import java.io.*; import java.util.timer; import java.util.timertask; import java.util.date; public class TimerMidlet extends MIDlet implements CommandListener{ private Command exitcommand; private Form form; private StringItem textfield; private Display display; Pengembangan Perangkat Mobile 2

206 public TimerMidlet() { exitcommand = new Command("Exit", Command.EXIT, 1); textfield = new StringItem("Counter", ""); Timer timer = new Timer(); TimerTask task = new CounterTask(this); timer.schedule(task, 2000, 1000); form = new Form("Timer Test"); form.addcommand(exitcommand); form.append(textfield); public void startapp() { display = Display.getDisplay(this); form.setcommandlistener(this); display.setcurrent(form); public void pauseapp() { public void destroyapp(boolean unconditional) { timer.cancel(); public void commandaction(command c, Displayable d) { if (c == exitcommand) { destroyapp(true); notifydestroyed(); public void settext(string text){ textfield.settext(text); class CounterTask extends TimerTask { Pengembangan Perangkat Mobile 3

207 int counter = 0; TimerMidlet midlet; public CounterTask(TimerMidlet midlet){ this.midlet = midlet; public void run() { counter++; midlet.settext("" + counter); System.out.println("Counter: " + counter); 11.3 Push Functionality Push Registry berfungsi agar MIDlet bisa meregister koneksi yang masuk dengan Application Management Software (AMS). Jika program tidak berjalan, AMS akan mendengarkan koneksi pada alamat yang telah diregister oleh aplikasi. Hampir semua tipe koneksi didukung, termasuk ServerSocket dan MessageConnection. Anda dapat meregister koneksi yang masuk dengan Push Registry menggunakan dua cara: cara statis dengan menggunakan file application descriptor (JAD) atau dinamis selama proses runtime menggunakan PushRegistry API. Pada bab ini kita akan meregister secara statis push application kita pada application descriptor (JAD) kita. NetBeans Mobility Pack membantu kita untuk memodifikasi Application Descriptor dengan mudah termasuk pada Push Registry. Klik kanan pada Project name, selanjutnya klik Properties untuk membuka Properties Page pada project. Pengembangan Perangkat Mobile 4

208 Pilih bagian Push Registry: Klik "Add" untuk meregister koneksi yang masuk: Pengembangan Perangkat Mobile 5

209 Ulangi proses sebelumnya hingga semua koneksi yang masuk sudah teregister. Dalam kasus ini, kita melakukan koneksi sms pada port 8888 dan koneksi socket (socket connection) pada port 1234: Pengembangan Perangkat Mobile 6

210 Pilih bagian "API Permissions": Pilih "Add" untuk menambah ijin (permission) untuk aplikasi MIDlet. Kita harus menambahkan API javax.microedition.io.pushregistry untuk menginstall aplikasi. Kita juga harus menambahkan semua API yang digunakan oleh aplikasi: Pengembangan Perangkat Mobile 7

211 Hilangkan tanda pada bagian required untuk semua API: Pengembangan Perangkat Mobile 8

212 Pilih bagian "Signing" dan beri tanda "Sign Distribution" untuk mendaftarkan aplikasi MIDlet: Pengembangan Perangkat Mobile 9

213 Pilih bagian "Running" dan pilih "Execute through OTA (Over the Air Provisioning)". Hal ini merupakan proses instalasi dan eksekusi aplikasi pada device. Pengembangan Perangkat Mobile 10

214 Langkah selanjutnya adalah menjalankan aplikasi MIDlet. Pastikan build berjalan dan tidak ada error ketika melakukan instalasi device (via OTA provisioning). Pengembangan Perangkat Mobile 11

215 Untuk menjalankan aplikasi MIDlet, gunakan WMA console (Tools -> Java Platform Manager -> J2ME Wireless Toolkit 2.2 -> Open Utilities -> WMA: Open Console -> Send SMS...). Pilih nomor device, tentukan nomor port yang sudah ada pada PushRegistry, masukkan pesan dan klik "Send": Pengembangan Perangkat Mobile 12

Bab Tujuan. 2.2 Pengenalan. 2.3 "Hello, world!" MIDlet

Bab Tujuan. 2.2 Pengenalan. 2.3 Hello, world! MIDlet Bab 2 Memulai Pemrograman Mobile 2.1 Tujuan In this section, we will be delving into writing, building, using the emulator and packaging J2ME applications. The Integrated Programming Environment that we

Lebih terperinci

PENGEMBANGAN APLIKASI MOBILE

PENGEMBANGAN APLIKASI MOBILE PENGEMBANGAN APLIKASI MOBILE Tujuan Mengidentifikasi karakteristik dari perangkat mobile Menjelaskan arsitektur J2ME Mengetahui peran atau aturan configuration dan profile Mengidentifikasi API yang disediakan

Lebih terperinci

PRAKTIKUM 2 ANTAR MUKA TINGKAN ATAS

PRAKTIKUM 2 ANTAR MUKA TINGKAN ATAS Nama : Jamaludin NIM : E3209265 Kelas : TKK-B PRAKTIKUM 2 ANTAR MUKA TINGKAN ATAS 1. Dasar Teori MDIP user interface di desain untuk peralatan mobile. Aplikasi MDIP ditunjukan pada area limited screen.

Lebih terperinci

Bab Tujuan. 1.2 Perangkat Mobile

Bab Tujuan. 1.2 Perangkat Mobile Bab 1 Pengembangan Aplikasi Mobile 1.1 Tujuan Dalam bab ini, kita akan mendiskusikan karateristik dari perangkat mobile, dan bagaimana hal tersebut mempengaruhi pengembangan program untuk perangkat ini.

Lebih terperinci

Bab 3 High Level User Interface

Bab 3 High Level User Interface Bab 3 High Level User Interface 3.1 Tujuan Pada akhir pembahasan, para pembaca diharapkan dapat: Mengetahui keuntungan dan kerugian dengan menggunakan high-level dan low-level UI classes Mengetahui desain

Lebih terperinci

BAB II KAJIAN PUSTAKA

BAB II KAJIAN PUSTAKA BAB II KAJIAN PUSTAKA A. Perangkat Mobile Perangkat mobile memiliki banyak jenis dalam hal ukuran, desain dan layout, tetapi perangkat mobile memiliki kesamaan karakteristik yang sangat berbeda dari sistem

Lebih terperinci

Mobile Computing. Ramos Somya

Mobile Computing. Ramos Somya Mobile Computing Ramos Somya javax.microedition.lcdui Merupakan suatu desain user interface yang dikhususkan untuk perangkat dengan limited screen perangkat mobile. MIDP UI dirancang secara fleksibel sehingga

Lebih terperinci

Bab 1 Pengembangan Aplikasi Mobile

Bab 1 Pengembangan Aplikasi Mobile Bab 1 Pengembangan Aplikasi Mobile 1.1 Tujuan Dalam bab ini, kita akan mendiskusikan karateristik dari perangkat mobile, dan bagaimana hal tersebut mempengaruhi pengembangan program untuk perangkat ini.

Lebih terperinci

IF5093 Java ME. Achmad Imam Kistijantoro Semester II 2006/2007. IF-ITB/AI/Mar 07. IF5093 Java ME

IF5093 Java ME. Achmad Imam Kistijantoro Semester II 2006/2007. IF-ITB/AI/Mar 07. IF5093 Java ME IF5093 Java ME Achmad Imam Kistijantoro Semester II 2006/2007 IF5093 Java ME 1 Java ME overview Java ME (Micro Edition) adalah java platform untuk consumer devices seperti handphone, PDA, TV set-top boxes

Lebih terperinci

J2ME GUI dan Manajemen Event

J2ME GUI dan Manajemen Event J2ME GUI dan Manajemen Event Muhammad Zen S. Hadi, ST. MSc. Contents J2ME (Review) Manajemen Event GUI dalam J2ME Passing parameter di dalam J2ME 2 Arsitektur Jaringan dgn J2ME 3 Design Aplikasi vmiles

Lebih terperinci

BAB III JAVA 2 MICROEDITION (J2ME) definisi dari sun adalah sekumpulan teknologi pemrograman yang digunakan

BAB III JAVA 2 MICROEDITION (J2ME) definisi dari sun adalah sekumpulan teknologi pemrograman yang digunakan BAB III JAVA 2 MICROEDITION (J2ME) 3.3 Arsitektur Java Bahasa Java merupakan salah satu bahasa tingkat tinggi. Java berdasarkan definisi dari sun adalah sekumpulan teknologi pemrograman yang digunakan

Lebih terperinci

PEMOGRAMAN APLIKASI BERGERAK (Java ME) Yoannita

PEMOGRAMAN APLIKASI BERGERAK (Java ME) Yoannita PEMOGRAMAN APLIKASI BERGERAK (Java ME) Yoannita Daur Hidup MIDlet kehidupan MIDlet dimulai ketika di-instantiate oleh AMS. MIDlet pada awalnya masuk status Pause setelah perintah baru dibuat. AMS memanggil

Lebih terperinci

BONUS. Dasar Java Mobile. Mengenal Java Mobile Mengenal MIDlet Mobile Grafis Mobile Animasi Latihan Soal

BONUS. Dasar Java Mobile. Mengenal Java Mobile Mengenal MIDlet Mobile Grafis Mobile Animasi Latihan Soal BONUS Dasar Java Mobile Mengenal Java Mobile Mengenal MIDlet Mobile Grafis Mobile Animasi Latihan Soal Mengenal Java Mobile Dasar Java Mobile Java Mobile (J2ME) atau singkatan dari Java 2 Mobile Edition

Lebih terperinci

Untuk menampilkan proses pembuatan file JAR. Untuk menentukan nama file archive (file JAR)

Untuk menampilkan proses pembuatan file JAR. Untuk menentukan nama file archive (file JAR) Waktu Sisa : 0:47:34 1. Berikut diberikan contoh perintah untuk membuat file JAR. jar cvfm HelloMidlet.jar manifest.txt HelloMidlet.class Apakah arti dari parameter "f" pada perintah diatas? Untuk membuat

Lebih terperinci

DAFTAR ISI. ABSTRAK... i KATA PENGANTAR... ii DAFTAR ISI... iii DAFTAR TABEL... xi DAFTAR GAMBAR... xiv

DAFTAR ISI. ABSTRAK... i KATA PENGANTAR... ii DAFTAR ISI... iii DAFTAR TABEL... xi DAFTAR GAMBAR... xiv DAFTAR ISI ABSTRAK... i KATA PENGANTAR... ii DAFTAR ISI... iii DAFTAR TABEL... xi DAFTAR GAMBAR... xiv BAB I PENDAHULUAN 1.1 Latar Belakang Masalah... I-1 1.2 Identifikasi Masalah... I-3 1.3 Maksud dan

Lebih terperinci

BAB II LANDASAN TEORI

BAB II LANDASAN TEORI 5 BAB II LANDASAN TEORI 2.1 Metodologi Rekayasa Perangkat Lunak Pemodelan dalam perangkat lunak merupakan suatu yang harus dikerjakan di bagian awal dari rekayasa, dan pemodelan ini akan mempengaruhi perkerjaan

Lebih terperinci

11.1 Tujuan Timers

11.1 Tujuan Timers Bab 11 Topik-topik Tambahan 11.1 Tujuan Setelah menyelesaikan bab ini, siswa diharapkan mampu: mengatur jadwal tugas menggunakan Timers meregister koneksi yang datang pada Push Registry 11.2 Timers Timer

Lebih terperinci

APLIKASI KAMUS MATEMATIKA UNTUK HANDPHONE

APLIKASI KAMUS MATEMATIKA UNTUK HANDPHONE APLIKASI KAMUS MATEMATIKA UNTUK HANDPHONE Ismi Amalia Jurusan Teknik Mesin, Politeknik Negeri Lhokseumawe Nanggroe Aceh Darussalam Email : ismiamalia@gmail.com ABSTRAKS Penelitian ini bertujuan untuk merancang

Lebih terperinci

PEMOGRAMAN APLIKASI BERGERAK (Java ME) Company LOGO

PEMOGRAMAN APLIKASI BERGERAK (Java ME) Company LOGO PEMOGRAMAN APLIKASI BERGERAK (Java ME) Company LOGO LIST 2 OBJEK LIST Objek List dapat dibuat dengan tipe Pilihan : Choice.EXCLUSIVE, Choice.MULTIPLE, dan Choice.IMPLICIT. Pilihan jenis Choice.POPUP tidak

Lebih terperinci

DateField adalah objek yang dapat digunakan untuk menampilkan atau mengedit objek yang bertipe Date.

DateField adalah objek yang dapat digunakan untuk menampilkan atau mengedit objek yang bertipe Date. Seri User Interface DateField chocolove_mic@yahoo.co.uk http://www.mycgiserver.com/~chocolove2003 Lisensi Dokumen: Seluruh dokumen di IlmuKomputer.Com dapat digunakan, dimodifikasi dan disebarkan secara

Lebih terperinci

MODUL 9 J2ME (Java 2 Micro Edition)

MODUL 9 J2ME (Java 2 Micro Edition) MODUL 9 J2ME (Java 2 Micro Edition) A. Tujuan : 1. Memahami konsep GUI Pilihan di J2ME. 2. Memahami konsep pembuatan command 3. Memahami passing parameter (manajemen event) INTERNET PROGRAMMING PENS-ITS

Lebih terperinci

MODUL 11 J2ME (Java 2 Micro Edition)

MODUL 11 J2ME (Java 2 Micro Edition) MODUL 11 J2ME (Java 2 Micro Edition) A. Tujuan : 1. Memahami konsep interkoneksi client server 2. Memahami passing parameter antara client dan server INTERNET PROGRAMMING PENS-ITS B. Dasar Teori Interkoneksi

Lebih terperinci

PEMOGRAMAN APLIKASI BERGERAK (Java ME)

PEMOGRAMAN APLIKASI BERGERAK (Java ME) PEMOGRAMAN APLIKASI BERGERAK (Java ME) Company LOGO YOANNITA LIST 2 OBJEK LIST Objek List dapat dibuat dengan tipe Pilihan : Choice.EXCLUSIVE, Choice.MULTIPLE, dan Choice.IMPLICIT. Pilihan jenis Choice.POPUP

Lebih terperinci

Bab 2 Tinjauan Pustaka 2.1 Penelitian Terdahulu

Bab 2 Tinjauan Pustaka 2.1 Penelitian Terdahulu Bab 2 Tinjauan Pustaka 2.1 Penelitian Terdahulu Pada penelitian Aplikasi Kamus Bahasa Jepang - Indonesia Pada Perangkat Genggam Mengunakan J2ME (Murthi, Tommy Adhi Kresna, 2010), perancangan sistem ini

Lebih terperinci

Yoannita Company LOGO

Yoannita Company LOGO PEMOGRAMAN APLIKASI BERGERAK (Java ME) Yoannita Company LOGO TEXTFIELD 2 Textfield Constructor Konstruktor dari class TextField adalah: public TextField(String title, String text, int maxsize, int constraints)

Lebih terperinci

Kode tereksekusi dengan baik sehingga mendapatkan output "JENI Java Education Network Indonesia" yang diikuti oleh "Hello Jeni"

Kode tereksekusi dengan baik sehingga mendapatkan output JENI Java Education Network Indonesia yang diikuti oleh Hello Jeni Waktu Sisa : 0:9:24 1. Perhatikan kode berikut ini! Mengapa pada kode diatas teks "Selamat Pagi Jeni" tidak dapat ditampilkan ke layar? Terdapat kesalahan pada saat pendefinisian object dari StringItem

Lebih terperinci

BAB II TINJAUAN PUSTAKA DAN DASAR TEORI. Dalam pembahasan tentang chatting menggunakan J2ME ini

BAB II TINJAUAN PUSTAKA DAN DASAR TEORI. Dalam pembahasan tentang chatting menggunakan J2ME ini BAB II TINJAUAN PUSTAKA DAN DASAR TEORI 2.1. Tinjauan Pustaka Dalam pembahasan tentang chatting menggunakan J2ME ini pernah dibahas dalam skripsi yang berjudul APLIKASI CHATTING MENGGUNAKAN J2ME dengan

Lebih terperinci

Nilai Properti Constrains pada TextField

Nilai Properti Constrains pada TextField Seri User Interface Tipe Masukan pada TextField chocolove_mic@yahoo.co.uk http://www.mycgiserver.com/~chocolove2003 Lisensi Dokumen: Seluruh dokumen di IlmuKomputer.Com dapat digunakan, dimodifikasi dan

Lebih terperinci

MODUL 10 J2ME (Java 2 Micro Edition)

MODUL 10 J2ME (Java 2 Micro Edition) MODUL 10 J2ME (Java 2 Micro Edition) A. Tujuan : 1. Memahami konsep GUI Pilihan di J2ME. 2. Memahami konsep penanganan GUI pilihan INTERNET PROGRAMMING PENS-ITS B. Dasar Teori B.1. Bekerja dengan Form

Lebih terperinci

APLIKASI KAMUS BAHASA JEPANG - INDONESIA PADA PERANGKAT GENGGAM MENGUNAKAN J2ME

APLIKASI KAMUS BAHASA JEPANG - INDONESIA PADA PERANGKAT GENGGAM MENGUNAKAN J2ME 1 APLIKASI KAMUS BAHASA JEPANG - INDONESIA PADA PERANGKAT GENGGAM MENGUNAKAN J2ME Tommy Adhi Kresna Murthi 1, Aghus Sofwan, S.T, M.T 2 3, Eko Handoyo, S.T, M.TT Jurusan Teknik Elektro Fakultas Teknik Universitas

Lebih terperinci

AUTHMODE_PRIVATE hanya bisa diakses oleh MIDlet suite yang menciptakan record store tersebut

AUTHMODE_PRIVATE hanya bisa diakses oleh MIDlet suite yang menciptakan record store tersebut Waktu Sisa : 1:31:50 1. Pernyataan tentang AUTHMODE berikut ini yang benar adalah... AUTHMODE_ANY bisa diakses dari MIDlet suite manapun seperti mengakses AUTHMODE_PRIVATE AUTHMODE_PRIVATE hanya bisa diakses

Lebih terperinci

Low Level User Interface

Low Level User Interface PENGEMBANGAN APLIKASI MOBILE MODUL PRAKTIKUM Low Level User Interface JAVA EDUCATION NETWORK INDONESIA 1. Tujuan Memahami event handling level rendah dalam MIDP Menggambar dan menampilkan teks, gambar,

Lebih terperinci

mlab : Aplikasi Perangkat Bergerak untuk Mengakses Sistem Informasi Laboratorium berbasis SMS dan J2ME

mlab : Aplikasi Perangkat Bergerak untuk Mengakses Sistem Informasi Laboratorium berbasis SMS dan J2ME mlab : Aplikasi Perangkat Bergerak untuk Mengakses Sistem Informasi Laboratorium berbasis SMS dan J2ME Iwan Handoyo Putro 1, Indar Sugiarto 2, Hestin Kezia Octalina Klaas 3 1,2.3 Jurusan Teknik Elektro,

Lebih terperinci

Bab 9. Mengetahui teknik yang berbeda dalam optimisasi aplikasi mobile

Bab 9. Mengetahui teknik yang berbeda dalam optimisasi aplikasi mobile 9.1 Tujuan Bab 9 Optimisasi Setelah menyelesaikan bab ini, pelajar diharapkan menguasai : Mengetahui teknik yang berbeda dalam optimisasi aplikasi mobile 9.2 Optimisasi Sebelum benar-benar melakukan setiap

Lebih terperinci

BAB II DASAR TEORI. menggunakan gelombang radio di atas frekuensi 1 GHz. Suatu sistem transmisi

BAB II DASAR TEORI. menggunakan gelombang radio di atas frekuensi 1 GHz. Suatu sistem transmisi BAB II DASAR TEORI 2.1. Sistem Transmisi Microwave Sistem transmisi microwave adalah suatu sistem transmisi dengan menggunakan gelombang radio di atas frekuensi 1 GHz. Suatu sistem transmisi microwave

Lebih terperinci

MOBILE PROGRAMMING (VI-SK)

MOBILE PROGRAMMING (VI-SK) MOBILE PROGRAMMING 162015 (VI-SK) Selasa Kelas A(08.00-10.15), Kelas B (16.30-18.30) Ruang,.. Dosen Lie Jasa Prasyarat Jaringan Komputer Algoritma dan Pemrograman (java) Tujuan Mahasiswa dapat memiliki

Lebih terperinci

P4 Bab 4 User Interface

P4 Bab 4 User Interface P4 Bab 4 User Interface 4. Tujuan 4. Materi Mahasiswa mengerti dasar-dasar mobile computing dan mampu memprogramnya.. User Interface. Struktur GUI dalam MIDP. Paket javax.microedition.lcdgui 4. Arsitektur

Lebih terperinci

1. Tujuan. 2. Latar Belakang. 3. Percobaan. Modul Praktikum MMAPI. Setelah mempelajari bab ini, Pelajar diharapkan mampu untuk :

1. Tujuan. 2. Latar Belakang. 3. Percobaan. Modul Praktikum MMAPI. Setelah mempelajari bab ini, Pelajar diharapkan mampu untuk : 1. Tujuan Setelah mempelajari bab ini, Pelajar diharapkan mampu untuk : Memahami dan menggunakan Player Dapat menggunakan method-method dalam class player. Dapat membuat dan memainkan audio (*.wav dan

Lebih terperinci

PENDAHULUAN TENTANG NETBEANS

PENDAHULUAN TENTANG NETBEANS PENDAHULUAN TENTANG NETBEANS Yuliana Setiowati Politeknik Elektronika Negeri Surabaya 1 TOPIK Pendahuluan IDE Netbeans Membuat Project Baru. 2 Konsep Netbeans Netbeans sebagai IDE ditujukan untuk memudahkan

Lebih terperinci

29 Februari Introduction Of Java

29 Februari Introduction Of Java 29 Februari 2012 Introduction Of Java Sejarah Java Dikembangkan oleh tim Pemimpin: James Gosling Company: Sun Microsystem Agustus 1991, bernama Oak Januari 1995, berganti nama Java Dapat dijalankan di

Lebih terperinci

APLIKASI RESELLER PULSA ELEKTRIK DENGAN MENGGUNAKAN TEKNOLOGI LCDUI J2ME. Roslina 1, Ulfa Yulitha 2

APLIKASI RESELLER PULSA ELEKTRIK DENGAN MENGGUNAKAN TEKNOLOGI LCDUI J2ME. Roslina 1, Ulfa Yulitha 2 APLIKASI RESELLER PULSA ELEKTRIK DENGAN MENGGUNAKAN TEKNOLOGI LCDUI J2ME Roslina 1, Ulfa Yulitha 2 1,2 Program Studi Manajemen Informatika Politeknik Negeri Medan 1 os_saulan@yahoo.com, 2 Yu_leetha@yahoo.co.id

Lebih terperinci

Mobile Computing. Fery Updi,M.Kom

Mobile Computing. Fery Updi,M.Kom Mobile Computing Fery Updi,M.Kom Tentang Mata Kuliah Mobile Computing Kredit: 2 SKS Dosen: Fery Updi, M.Kom Kelas: Rabu, 10.00-12.00 WIB Komposisi Penilaian Aspek Penilaian Prosentase Tugas Mandiri - Jurnal

Lebih terperinci

Pemrograman dengan Java

Pemrograman dengan Java Pemrograman dengan Java Java sebagai salah satu bahasa pemrograman baru menjanjikan banyak kemudahan bagi programer junior maupun senior. Tutorial ini akan membawa Anda mengenal lebih jauh bahasa ini melalui

Lebih terperinci

BAB 2 LANDASAN TEORI. Istilah komputer (computer) berasal dari bahasa latin computere yang berarti

BAB 2 LANDASAN TEORI. Istilah komputer (computer) berasal dari bahasa latin computere yang berarti BAB 2 LANDASAN TEORI 2.1 Pengertian Komputer Istilah komputer (computer) berasal dari bahasa latin computere yang berarti menghitung. Dalam bahasa Inggris komputer berasal dari kata to compute yang artinya

Lebih terperinci

SILABUS. Print to PDF without this message by purchasing novapdf (http://www.novapdf.com/) STIKI Silabus Mata Kuliah 1/10

SILABUS. Print to PDF without this message by purchasing novapdf (http://www.novapdf.com/) STIKI Silabus Mata Kuliah 1/10 SILABUS Mata / Kode : Pemrograman Berorientasi Objek (PBO) / TI09KB51 Prasarat/cosarat : - / - Bobot SKS/ Smt : 3 / 5 Standar Kompetensi : Pada akhir perkulihaan Mahasiswa mampu mengimplementasi masalah

Lebih terperinci

KAMUS INGGRIS-INDONESIA BERBASIS J2ME

KAMUS INGGRIS-INDONESIA BERBASIS J2ME KAMUS INGGRIS-INDONESIA BERBASIS J2ME Lenny Ike C. M., Wiratmoko Yuwono, ST, Kholid Fathoni, S.Kom Jurusan Teknologi Informasi Politeknik Elektronika Negeri Surabaya Institut Teknologi Sepuluh Nopember

Lebih terperinci

Rencana Pelaksanaan Pembelajaran

Rencana Pelaksanaan Pembelajaran PERTEMUAN : 1 Kompetensi Dasar : Mahasiswa mampu memahami konsep dasar pemrograman Java. : 1. Mahasiswa dapat menerangkan tentang dasar pemrograman Java. 2. Mahasiswa dapat menuliskan kembali penggunakan

Lebih terperinci

Aplikasi Pelaporan Berita Emergensi Secara Visual dan Tekstual Lewat Telepon Selular

Aplikasi Pelaporan Berita Emergensi Secara Visual dan Tekstual Lewat Telepon Selular Aplikasi Pelaporan Berita Emergensi Secara Visual dan Tekstual Lewat Telepon Selular Leo Willyanto Santoso, Sukanto Tedjokusuma, Marcel Renaldy Soetanto Jurusan Teknik Informatika Fakultas Teknologi Industri

Lebih terperinci

APLIKASI MOBILE-CHATTING MENGGUNAKAN FASILITAS BLUETOOTH DENGAN J2ME

APLIKASI MOBILE-CHATTING MENGGUNAKAN FASILITAS BLUETOOTH DENGAN J2ME APLIKASI MOBILE-CHATTING MENGGUNAKAN FASILITAS BLUETOOTH DENGAN J2ME Satyani Karina Eka Putri Teknik Informatika Universitas Gunadarma akarin_chan86@yahoo.com ABSTRAK Saat ini teknologi komunikasi menggunakan

Lebih terperinci

DASAR PEMROGRAMAN MOBILE DENGAN JAVA MOBILE EDITION (J2ME)

DASAR PEMROGRAMAN MOBILE DENGAN JAVA MOBILE EDITION (J2ME) MODUL WORKSHOP DASAR PEMROGRAMAN MOBILE DENGAN JAVA MOBILE EDITION (J2ME) DISUSUN OLEH : Y.YOHAKIM MARWANTA, S.KOM SEKOLAH TINGGI MANAJEMEN INFORMATIKA DAN KOMPUTER AKAKOM YOGYAKARTA 2008 Hal - 1 KATA

Lebih terperinci

Pengantar Pemrograman dengan Bahasa Java

Pengantar Pemrograman dengan Bahasa Java Pengantar Pemrograman dengan Bahasa Java IF2123 Aljabar Geometri Oleh: Rinaldi Munir Sekolah Teknik Elektro dan Informatika ITB 1 Sejarah Bahasa Java Bahasa java dibuat oleh James Gosling saat masih bergabung

Lebih terperinci

SILABUS MATA KULIAH PEMROGRAMAN APLIKASI BERGERAK

SILABUS MATA KULIAH PEMROGRAMAN APLIKASI BERGERAK PEMROGRAMAN APLIKASI BERGERAK A. IDENTITAS MATA KULIAH Program Studi : Sistem Informasi (S-1) Mata Kuliah : Pemrograman Aplikasi Bergerak (Pilihan) Kode : SI 427 Bobot : 4 (empat) sks Kelas : SI6A, SI6B,

Lebih terperinci

yang signifikan. Pada tahap ini dijelaskan hal-hal apa saja yang terdapat pada

yang signifikan. Pada tahap ini dijelaskan hal-hal apa saja yang terdapat pada BAB III ANALISIS KEBUTUHAN 3.1 Metode Analisis Proses analisis dilakukan dengan menggunakan alat dan teknik yang disesuaikan dengan kebutuhan sistem. Pada sistem yang akan dikembangkan, analisis yang digunakan

Lebih terperinci

BAB 2 LANDASAN TEORI

BAB 2 LANDASAN TEORI BAB 2 LANDASAN TEORI 2.1 Pengertian Komputer Istilah komputer (computer) berasal dari bahasa latin computere yang berarti menghitung. Dalam bahasa inggris dari kata computer yang berarti menghitung. Dapat

Lebih terperinci

PRAKTIKUM 1 DASAR PEMROGRAMAN JAVA

PRAKTIKUM 1 DASAR PEMROGRAMAN JAVA PRAKTIKUM 1 DASAR PEMROGRAMAN JAVA 1. TUJUAN a. Mahasiswa dapat melakukan instalasi dan konfigurasi path beberapa program yang digunakan untuk membuat program Java b. Mahasiswa dapat membuat program Java

Lebih terperinci

Pengenalan JAVA. Farhat, ST., MMSI., MSc

Pengenalan JAVA. Farhat, ST., MMSI., MSc Pengenalan JAVA Tim sun Microsystems (dipimpin oleh James Gosling) bahasa komputer kecil (chipchip embedded) Proyek bernama Green. Pascal (diciptakkan oleh Niklaus Wirth) Bahasa yang portable kode intermediate

Lebih terperinci

Pembuatan Aplikasi Pembelajaran Bahasa Inggris Pada Handphone dengan J2ME

Pembuatan Aplikasi Pembelajaran Bahasa Inggris Pada Handphone dengan J2ME Jurnal Informatika Mulawarman Vol 5 No. 3 September 2010 18 Pembuatan Aplikasi Pembelajaran Bahasa Inggris Pada Handphone dengan J2ME Yusni Nyura Jurusan Teknologi Informasi, Politeknik Negeri Samarinda

Lebih terperinci

Pengantar Pemrograman dengan Bahasa Java

Pengantar Pemrograman dengan Bahasa Java Pengantar Pemrograman dengan Bahasa Java IF2123 Aljabar Geometri Oleh: Rinaldi Munir Sekolah Teknik Elektro dan Informatika ITB 1 Sejarah Bahasa Java Bahasa java dibuat oleh James Gosling saat masih bergabung

Lebih terperinci

BAB IV IMPLEMENTASI DAN ANALISA

BAB IV IMPLEMENTASI DAN ANALISA BAB IV IMPLEMENTASI DAN ANALISA 4. Implementasi dan Analisa Pada bagian ini akan dijelaskan langah-langkah pembuatan aplikasi dengan menggunakan Bahasa pemrograman Java untuk Android, proses implementasi

Lebih terperinci

1. Pilih BAB IV IMPLEMENTASI DAN PENGUJIAN. kebutuhan sistem yang meliputi emulator Java2 Micro Edition(J2ME) dan telepon

1. Pilih BAB IV IMPLEMENTASI DAN PENGUJIAN. kebutuhan sistem yang meliputi emulator Java2 Micro Edition(J2ME) dan telepon Keterangan: 1. Pilih Back : berfungsi untuk kembali ke menu form daftar Tajwid. BAB IV IMPLEMENTASI DAN PENGUJIAN 4.1 Implementasi Setelah melakukan analisis dan perancangan terhadap aplikasi Pembelajaran

Lebih terperinci

BAB II LANDASAN TEORI

BAB II LANDASAN TEORI 6 BAB II LANDASAN TEORI II.1 Pendahuluan Dalam bab ini akan dijelaskan tentang landasan teori yang akan digunakan sebagai acuan dalam analisis dan perancangan Pengembangan Aplikasi Mobile Ticketing untuk

Lebih terperinci

Konsep Pemrograman Berorientasi Obyek. Maria Ulfah S Nurochman

Konsep Pemrograman Berorientasi Obyek. Maria Ulfah S Nurochman Konsep Pemrograman Berorientasi Obyek Maria Ulfah S Nurochman Kompetensi Menjelaskan paradigma pemrograman berorientasi obyek Membedakan antara paradigma pemrograman berorientasi obyek dan pemrograman

Lebih terperinci

POLITEKNIK TELKOM BANDUNG

POLITEKNIK TELKOM BANDUNG MOBILE APPLICATION POLITEKNIK TELKOM BANDUNG 2009 Tim Penulis: Budi Laksono Putro Dedy Rahman Wijaya Dilarang menerbitkan kembali, menyebarluaskan, atau menyimpan baik sebagian maupun seluruh isi buku

Lebih terperinci

BAB II LANDASAN TEORI. bahasa. Bahasa adalah sistem tanda bunyi yang disusun berdasarkan kesepakatan

BAB II LANDASAN TEORI. bahasa. Bahasa adalah sistem tanda bunyi yang disusun berdasarkan kesepakatan BAB II LANDASAN TEORI 2.1 Peranan Bahasa untuk Anak Usia Dini Dalam kehidupan sehari-hari manusia tidak dapat melepaskan diri dari bahasa. Bahasa adalah sistem tanda bunyi yang disusun berdasarkan kesepakatan

Lebih terperinci

BAB II TINJAUAN PUSTAKA

BAB II TINJAUAN PUSTAKA BAB II TINJAUAN PUSTAKA II.1. Searching Pencarian (searching) merupakan proses yang sering digunakan dalam pengelolaan data. Proses pencarian adalah menemukan nilai (data) tertentu di dalam sekumpulan

Lebih terperinci

Sistem Client untuk Mobile Device berbasis pada Teknologi Java

Sistem  Client untuk Mobile Device berbasis pada Teknologi Java Sistem Email Client untuk Mobile Device berbasis pada Teknologi Java Bernard Renaldy Suteja Jurusan Teknik Informatika, Fakultas Teknologi Informasi, Universitas Kristen Maranatha Jl. Surya Sumantri 65

Lebih terperinci

Chapter 1 Buat aplikasi kita menggunakan VisualMidlet

Chapter 1 Buat aplikasi kita menggunakan VisualMidlet Chapter 1 Buat aplikasi kita menggunakan VisualMidlet 1. Buatlah project J2ME baru di Netbeans, beri nama SimpleGame dan tentukan tempat penyimpanan project 2. Ganti CLDC dan MIDP sehingga sesuai dengan

Lebih terperinci

Profil Dedy ed Alamsya M slem Asli ma m de d -in Tanger ger ng Pergu er r gu u r a u n Tinggi Raha h rja r (S ( TMI M K I Raha h rja r )

Profil Dedy ed Alamsya M slem Asli ma m de d -in Tanger ger ng Pergu er r gu u r a u n Tinggi Raha h rja r (S ( TMI M K I Raha h rja r ) Introduction to Java ME Dedy Alamsyah Full Day Java and Android Seminar Tangerang,, 11 Desember 2011 Tangerang Profil Dedy Alamsyah Moslem Asli made-in Tangerang Perguruan Tinggi Raharja (STMIK Raharja)

Lebih terperinci

JURNAL TEKNOLOGI INFORMASI & PENDIDIKAN ISSN : VOL. 7 NO. 2 September 2014

JURNAL TEKNOLOGI INFORMASI & PENDIDIKAN ISSN : VOL. 7 NO. 2 September 2014 APLIKASI MOBILE PENCARIAN INFORMASI FASILITAS UMUM DI KOTA PADANG Titi Sriwahyuni 1 ABSTRACT This research aims to provide an information system to search for public fasility in Padang. The public facility

Lebih terperinci

Mobile Computing. Ramos Somya

Mobile Computing. Ramos Somya Mobile Computing Ramos Somya CLDC mempunyai kelas-kelas yang diturunkan dari J2SE dan kelas-kelas yang spesifik pada CLDC, yaitu GCF. MIDP menggunakan Generic Connection Framework (GCF) dari CLDC untuk

Lebih terperinci

1.Mengatur jadwal tugas menggunakan Timers 2.Mengetahui bagaimana membaca file dari aplikasi mobile sederhana

1.Mengatur jadwal tugas menggunakan Timers 2.Mengetahui bagaimana membaca file dari aplikasi mobile sederhana 1.Tujuan 1.Mengatur jadwal tugas menggunakan Timers 2.Mengetahui bagaimana membaca file dari aplikasi mobile sederhana 2. Latar Belakang Timer dan TimerTasks berfungsi agar Anda bisa melakukan penjadwalan

Lebih terperinci

BAB 3 Mengenali Lingkup Pemrograman Anda

BAB 3 Mengenali Lingkup Pemrograman Anda BAB 3 Mengenali Lingkup Pemrograman Anda 3.1 Tujuan Dalam bagian ini, kita akan membahas tentang bagaimana menulis, mengkompilasi dan menjalankan program Java. Terdapat dua cara dalam melakukannya, yang

Lebih terperinci

1. Desktop Microsoft Windows

1. Desktop Microsoft Windows 1. Desktop Microsoft Windows Icon Shortcut Quick Launch Taskbar Taskbar Shortcut Pada umumnya, taskbar ialah bagian yang terletak pada bagian bawah dari desktop. Tombol Start, tombol program-program aktif,

Lebih terperinci

MEMBANGUN APLIKASI MOBILE TERJEMAH INDONESIA JAWA DENGAN J2ME

MEMBANGUN APLIKASI MOBILE TERJEMAH INDONESIA JAWA DENGAN J2ME MEMBANGUN APLIKASI MOBILE TERJEMAH INDONESIA JAWA DENGAN J2ME Naskah Publikasi diajukan oleh Feri Prastiyo 07.11.1375 Kepada SEKOLAH TINGGI MANAJEMEN INFORMATIKA DAN KOMPUTER AMIKOM YOGYAKARTA 2011 BUILD

Lebih terperinci

BAHASA PEMROGRAMAN JAVA

BAHASA PEMROGRAMAN JAVA MI1274 Algoritma & Pemrograman Lanjut Genap 2015-2016 BAHASA PEMROGRAMAN JAVA Disusun Oleh: Reza Budiawan Untuk: Tim Dosen Algoritma & Pemrograman Lanjut Hanya dipergunakan untuk kepentingan pengajaran

Lebih terperinci

Diperkenalkan pertama oleh tim Sun System yang dipimpin Patrick Naughton dan James Gosling tahun 1991 dengan code

Diperkenalkan pertama oleh tim Sun System yang dipimpin Patrick Naughton dan James Gosling tahun 1991 dengan code PENGANTAR JAVA A. Asal Mula JAVA B. Kelebihan JAVA C. Ciri Khas JAVA D. Perangkat Lunak E. Penerapan JAVA F. Java Virtual Machine G. Pengembangan Program Java A. Asal Mula JAVA Diperkenalkan pertama oleh

Lebih terperinci

BAB 2 LANDASAN TEORI. Istilah komputer ( computer ) berasal dari bahasa latin computere yang berarti

BAB 2 LANDASAN TEORI. Istilah komputer ( computer ) berasal dari bahasa latin computere yang berarti BAB 2 LANDASAN TEORI 2.1 Pengertian Komputer Istilah komputer ( computer ) berasal dari bahasa latin computere yang berarti menghitung. Dalam bahasa Inggris berasal dari kata computer yang artinya menghitung.

Lebih terperinci

1 - Pengenalan Java PENDAHULUAN

1 - Pengenalan Java PENDAHULUAN 1 - Pengenalan Java PENDAHULUAN Java merupakan salah satu bahasa pemrograman yang mendukung konsep OOP secara penuh. Pada awalnya Java dikembangkan oleh Sun Microsystem pada tahun 1995. Beberapa tokoh

Lebih terperinci

Pada akhir pembahasan, peserta diharapkan dapat :

Pada akhir pembahasan, peserta diharapkan dapat : Pengenalan Java tujuan Pada akhir pembahasan, peserta diharapkan dapat : Menjelaskan fitur-fitur teknologi Java seperti, Java Virtual Machine(JVM), garbage collection, dan code security. Menjelaskan perbedaan

Lebih terperinci

SIMULASI KATALOG BUKU PADA DIGITAL LIBRARY MENGGUNAKAN APLIKASI JAVA 2 PLATFOM MICRO EDITION (J2ME) Hamidah Suryani Lukman

SIMULASI KATALOG BUKU PADA DIGITAL LIBRARY MENGGUNAKAN APLIKASI JAVA 2 PLATFOM MICRO EDITION (J2ME) Hamidah Suryani Lukman SIMULASI KATALOG BUKU PADA DIGITAL LIBRARY MENGGUNAKAN APLIKASI JAVA 2 PLATFOM MICRO EDITION (J2ME) Hamidah Suryani Lukman Mahasiswa Program Studi Matematika, FMIPA UNISBA, Bandung E-mail : hamni_alkhawarizmi@yahoo.co.id

Lebih terperinci

Pemrograman Berbasis Objek. Pengenalan Java. Entin Martiana. Politeknik Elektronika Negeri Surabaya

Pemrograman Berbasis Objek. Pengenalan Java. Entin Martiana. Politeknik Elektronika Negeri Surabaya Pengenalan Java Entin Martiana Sejarah Java (1) 1991, Sun dipimpin Patric Naughton dan James Gosling ingin merancang bahasa computer untuk perangkat consumer seperti cable TV Box. Karena perangkat itu

Lebih terperinci

Review C/C++ & Intro to Java. Pemrograman Berorientasi Obyek IT209

Review C/C++ & Intro to Java. Pemrograman Berorientasi Obyek IT209 Review C/C++ & Intro to Java Pemrograman Berorientasi Obyek IT209 Pemrograman Terstruktur Pemrograman terstruktur adalah suatu proses untuk mengimplementasikan urutan langkah untuk menyelesaikan suatu

Lebih terperinci

INFORMASI DAERAH WISATA MELALUI PEMANFAATAN TEKNOLOGI MOBILE PHONE BERBASIS ANDROID

INFORMASI DAERAH WISATA MELALUI PEMANFAATAN TEKNOLOGI MOBILE PHONE BERBASIS ANDROID Makalah Nomor: KNSI-411 INFORMASI DAERAH WISATA MELALUI PEMANFAATAN TEKNOLOGI MOBILE PHONE BERBASIS ANDROID Sherly Permatasari Wollah 1, Anita Wasutiningsih 2, Maria Y. Aryati 3 1,3 Jurusan Manajemen Informatika,

Lebih terperinci

BAB III LANGKAH-LANGKAH PENGEMBANGAN. Dalam penelitian pengembangan produk Panduan Shalat ini, ada beberapa

BAB III LANGKAH-LANGKAH PENGEMBANGAN. Dalam penelitian pengembangan produk Panduan Shalat ini, ada beberapa BAB III LANGKAH-LANGKAH PENGEMBANGAN Dalam penelitian pengembangan produk Panduan Shalat ini, ada beberapa langkah yang harus dilalui. Jenis atau model pengembangan yang peneliti lakukan menggunakan model

Lebih terperinci

LAPORAN TUGAS AKHIR APLIKASI KALKULATOR BERBASIS JAVA

LAPORAN TUGAS AKHIR APLIKASI KALKULATOR BERBASIS JAVA LAPORAN TUGAS AKHIR APLIKASI KALKULATOR BERBASIS JAVA Diajukan untuk memenuhi salah satu tugas dari matakuliah Pemrograman III Oleh : Nama : Ai Titin Npm : 1142228 STMIK AMIK BANDUNG BANDUNG 2012 Latar

Lebih terperinci

PEMOGRAMAN APLIKASI BERGERAK (Java ME) Yoannita

PEMOGRAMAN APLIKASI BERGERAK (Java ME) Yoannita PEMOGRAMAN APLIKASI BERGERAK (Java ME) Yoannita 2 COMMAND Event Handling with Commands Overview Displayable, the parent of all screen displays, supports a very flexible user interface concept, the command.

Lebih terperinci

BAB IV IMPLEMENTASI DAN PENGUJIAN

BAB IV IMPLEMENTASI DAN PENGUJIAN BAB IV IMPLEMENTASI DAN PENGUJIAN 4.1 Implementasi Setelah melakukan analisis dan perancangan terhadap aplikasi permainan Koneksi-4 yang akan dikembangkan, tahapan selanjutnya adalah implementasi dan pengujian.

Lebih terperinci

Program Kalkulator Sederhana Menggunakan Java Netbeans

Program Kalkulator Sederhana Menggunakan Java Netbeans Program Kalkulator Sederhana Menggunakan Java Netbeans Membuat kalkulator sederhana menggunakan Java Netbeans cukup mudah. Karena program yang di tulis tidak terlalu rumit, tapi memang perlu sedikit kesabaran

Lebih terperinci

BAB II LANDASAN TEORI. Platform Java dibagi dalam 3 (tiga) edisi dimana masing-masing dari

BAB II LANDASAN TEORI. Platform Java dibagi dalam 3 (tiga) edisi dimana masing-masing dari BAB II LANDASAN TEORI 2.1 Java 2 Micro Edition (J2ME) Platform Java dibagi dalam 3 (tiga) edisi dimana masing-masing dari edisi tersebut mempunyai segmen pasar yang berbeda. Ketiga edisi dari Java tersebut

Lebih terperinci

APLIKASI UNTUK PERANGKAT BERGERAK MENGGUNAKAN JAVA 2 MICRO EDITION (J2ME)

APLIKASI UNTUK PERANGKAT BERGERAK MENGGUNAKAN JAVA 2 MICRO EDITION (J2ME) APLIKASI UNTUK PERANGKAT BERGERAK MENGGUNAKAN JAVA 2 MICRO EDITION (J2ME) Ilham M. Said Staff Pengajar Jurusan Teknik Informatika Universitas Muhammadiyah Gresik ABSTRAKS Penggunaan aplikasi model layanan

Lebih terperinci

I. PENDAHULUAN 1.1 Latar Belakang

I. PENDAHULUAN 1.1 Latar Belakang I. PENDAHULUAN 1.1 Latar Belakang Di jaman teknologi dan serba praktis seperti sekarang, sebuah informasi akan selalu dituntut untuk selalu lebih cepat dan jelas, tanpa harus mengurangi esensi dari informasi

Lebih terperinci

Pendahuluan Dasar Pemrograman Java

Pendahuluan Dasar Pemrograman Java Pendahuluan Dasar Pemrograman Java Tujuan Instruksional Khusus Memahami tentang lingkungan java Memahami tentang aplikasi program java sederhana Memahami tentang proses input dan output Sejarah Java Bahasa

Lebih terperinci

Rekomendasi Min Perangkat Keras. Prosesor dual core 1.5 GHz RAM 2 GB Monitor 10 " VGA Onboard Keyboard PS2 Mouse PS2

Rekomendasi Min Perangkat Keras. Prosesor dual core 1.5 GHz RAM 2 GB Monitor 10  VGA Onboard Keyboard PS2 Mouse PS2 Netbeans IDE Netbeans merupakan IDE (Integreted Development Environment) yang powerfull untuk membangun sebuah aplikasi berbasis Java, PHP, C/C++, Ruby dan lainnya. Netbeans awalnya diciptakan hanya untuk

Lebih terperinci

Gambar 3.1 Perancangan Sistem

Gambar 3.1 Perancangan Sistem BAB III PERANCANGAN SISTEM Bab ini akan membahas tentang perancangan sistem monitoring yang terbagi menjadi dua bagian, sistem bagian pertama adalah objek yang akan dimonitor, sistem bagian kedua merupakan

Lebih terperinci

Menggunakan Microsoft Access (perhatikan untuk red text)

Menggunakan Microsoft Access (perhatikan untuk red text) Menggunakan Microsoft Access (perhatikan untuk red text) 1. Membuat Database dan Tabel Materi ini akan menjelaskan bagaimana membangun database, tabel dan field. Akan dijelaskan pula mengenai format dan

Lebih terperinci

BAB III PERANCANGAN SIMULASI

BAB III PERANCANGAN SIMULASI BAB III PERANCANGAN SIMULASI 3.1. Batasan dan Karakteristik Modifikasi LZW Dalam pembuatan simulasi dengan menggunakan tehnik modifikasi LZW (Lempel, Ziv, and Welch) ini, penulis menggunakan beberapa class

Lebih terperinci

BAB IV HASIL DAN UJI COBA

BAB IV HASIL DAN UJI COBA BAB IV HASIL DAN UJI COBA IV.1. Tampilan Hasil Kamus bahasa Arab-Indonesia yang telah dirancang merupakan kamus mobile, dimana kamus mobile tersebut dapat dijalankan pada handphone yang mendukung atau

Lebih terperinci

Praktikum Pemograman Berorientasi Objek

Praktikum Pemograman Berorientasi Objek Praktikum Pemograman Berorientasi Objek Pertemuan ke-1 A. Konsep PBO Pemrograman Berorientasi Objek (Object Oriented Programming) merupakan teknik pemograman dengan pendekatan berorientasi kelas dan objek.

Lebih terperinci

BAB I PENDAHULUAN. semua kalangan masyarakat memiliki telepon seluler, personal digital assistant

BAB I PENDAHULUAN. semua kalangan masyarakat memiliki telepon seluler, personal digital assistant BAB I PENDAHULUAN 1.1. Latar Belakang Teknologi mobile telah menjadi bagian kehidupan kita sehari-hari. Hampir semua kalangan masyarakat memiliki telepon seluler, personal digital assistant (PDA) atau

Lebih terperinci

INSTRUKSI PENCABANGAN

INSTRUKSI PENCABANGAN INSTRUKSI PENCABANGAN Sebagai pengembang (programmer) sudah pasti mengetahui jenis operasi instruksi. Salah satu yang perlu dipelajari atau dimengerti adalah operasi instruksi pencabangan. 3.1 Pencabangan

Lebih terperinci