Anda di halaman 1dari 243

Sffi rre

@TnAHATLMU

Pemrograman
EirnaFt [rhclnGr
Menssunakan $lll( fin$fOid
dan Hac[ing flndroid

Prof. Jazi Eko lstiyanto, Ph.D


PEMROCRAMAN SMART PHONE MENGGUNAKAN SDK ANDROID DAN
HACKING ANDROID
oreh .. prot.Jaziu,olr,ivun,gffi [
1 *u* PerPu^r'talicsl
rdPas
I
I
Edisi Perrama I ** Kee
cetakan Pertama.2013 I J
"."fr*-t:":I*t"
rxrf ePEr f/26r. '
nuris. ,$
Hak Cipta dilindungi undang-undang. Dilarang memperbanyak atau memindahkan seba-
gian atau seluruh isi buku ini dalam bentuk apa pun, secala elektronis maupun mekanis,
termasuk memfotokopi, merekam, atau dengan teknik perekaman lainnya, tanpa izin Kata Pengantar
tertulis dari penerbit.

GRAHA IIMU
Ruko Jambusari No. 7A
Yogyakarta 55283
Telp. : 0274-889836;0274-889398
Fax. : 02'14-889057
E-mail : info@grahailmu.co.id

Alhamdulillah buku "Pemrograman Smart phone Menggunakan SDK


Android dan Hacking Android" telah dapat terselesaikan.
Buku ini memuat dasar-dasar pemrograman java pada platform Android.
Pembaca juga akan mempelajari bagaimana kita dapat mengakses sensor dan
perangkat keras yang tertanam pada smartphone berbasis Android.
Istlyanto, Jazi Eko, Prof., Ph.D.
PEMROGRAMAN SMART PHONE MENGGUNAKAN SDK ANDRO]D DAN Seluruh aplikasi pada buku ini telah diujikan pada perangkat Samsung
HACKING ANDROID/ Jazi Eko Istj-yanto, Ph'D.
Prof. Galaxy i5503 (atau dikenal sebagai Galaxy 5) , meskipun demikian aplikasi smart
phone Android menggunakan plaform bahasa Java yang bersifat woRA (write
-Edisi Pertama - Yogyakarta; Graha I1mu, 2013
x + 478 hlm, 1 Ji1. : 23 cm. once Run Anywhere) maka dapat lupa berjalan pada perangkat dari berbagai
tipe dan produsen lainnya seperti Sony Ericcsson, HTC, LG, Asus, Huawei, dan lain
ISBN: 918-919-156 9- sebagainya.
l1? ILIK sebaik-baiknya contoh-contoh tidak hanya untuk dijalankan saja tetapi
Barlan l'uprclak*-*a
harus diperlukan pemahaman agar pembaca dapat menjadi pengembang aplikasi
{, r}A l(ea rsrpaa Android profesional.
1. Komputer Propinsi Jtwa 'i'i;:rrrr Judul
Ucapan terima kasih kepada Mochamad sofyan M, s.si. yang telah mencoba
dan menguji program-program pada buku ini.

ff:""**'**-q'.*. -"'

I msrufft-ur?."rrii i
I " It'"Arl'.,:'i',rtrJrll I*t ' r'
i
Ucapan terima kasih iuga saya sampaikan kepada lurusan llmu Komputer
dan Elektronika FMIPA UGM yang telah mendanai penelitian memanfaatkan
Android, Arduino, yang telah memberikan pengalaman bagi penulis sehingga
sebagian hasilnya dituangkan ke dalam buku ini.
Ucapan terima kasih juga penulis haturkan kepada penerbit Graha llmu
yang telah sangat kooperatif sehingga buku ini dapat terbit'

Yogyakarta, November 2011

Prof. Jazi Eko lstiYanto, Ph.D.


Daftar lsi

KATA PENGANTAR v
DAFTAR I5I vii
BAB 1 TEKNOTOGI SMART PHONE 1
Latar Belakang Android 4
Perangkat Mobile Berbasis Android 5
Distribusi Aplikasi Android t4
Fragmentasi Android 16
Popularitas Aplikasi Mobile 16

BAB 2 SOFTWARE STACK ANDROID 19


Kernel Android 72
Filesystem Android 23
Standar Lisensi Android 25
Konsep dan Fungsi Level API pada Aplikasi Android 26
Fungsi Level API pada AplikasiAndroid 28
BAB 3 INSTAIAS!JDK, sDK ANDROID DAN ADT 29
Android SDK Manager dan Spesifikasi Hardware 29

Pemrograman Smart Phone Menggunakan SDK Android dan Hacking Android


lnstalasi JDK dan Eclipse 34 Komponen Aplikasi (Ap plicoti on Com pone nt) L2t
lnstalasi SDK Android 37 User lnterface 127
lnstalasi Package SDK Android 42 lntent (Component Aktif) L29
URL Repositori Add-on 50 Shutdown Component t29
lnstalasi dan Update ADT 51 Activity dan Task 130
Konfigurasi Variabel Environment Windows XP dan 7 55 Sikl us (trlecycle) Component t32
Siklus Activity 132
BAB 4 !NSTALASI KIES DAN KONFIGURASI PERANGKAT ANDROID 59
Penyimpa nan State Activity 136
lnstalasi Plugin, Runtime, dan NET Framework 60 Siklus Service L37
lnstalasi Kies 64 Siklus Broadcast Receiver 139
Konfigurasi Smartphone Android 68 Hierarki Proses dan Siklus 139
7L Project Aplikasi Android 140
BAB 5 DASAR-DASAR SDK ANDROID
Direktori Project Android t47
Android Virtual Device (AVD) 77
File Manifest 142
Proses Pembuatan AVD 72
Filter lntent 146
Emulator Android 77
78
Konfigurasi Andro ldMan i f e s t . xml 148
Kontrol Emulator Android Direktori Resource
79 151
Opsi Startup Emulator Berbasis Konsol Direktori Binary
86 158
lmage Disk Emulator Direktori Assets
86 158
lmage Runtime Data dan SD Card Direktori Gen
87 158
lmage Data User Direktori Source
88 1s9
lmage Temporary Android.jar dan Maps.jar
88 1s9
Shell Emulator atau Perangkat Android
Emulasi Geo-location 91 BAB 7 PROJECT DASAR APTIKASIANDROID 161
Emulasi Event Hardware 93 Aplikasi HaloAndroid (Ul Tanpa Layout XML) 161
Emulasi Perubahan Level Baterai Perangkat Android 94 Modifikasi Ut dengan layout XML 166
Pemantauan Status Jaringan 94 Waktusaatlni - Aplikasi penerapan Widget Android L70
Keterbatasan Emulator 95
96
BAB 8 TOCATION SERVICE DAN GOOGTE MAPS 181
lnstalasi Aplikasi Android
Uninstall Aplikasi Android 98 Project CariLokasi - Penerapan lntent Google Maps 181
Emulasi SD Card pada Emulator 99 lmplementasi API Geocoder 186
99 Geocode - lmplementasi Apl Geocoder
Membuat dan Modifikasi lmage SD Card 188
100 Teknologi Geo Location
Membuat dan Modifikasi File lmage Disk 198
101 Fungsi Geo-Lokasi pada Aplikasi Android 202
Monitoring Aplikasi Android
101 Konfi gu rasi Geo-Location 205
Command Tool ADB
105 Registrasi API Map
Dalvik Debug Monitor Server (DDMS) 207
108 Project Ceklokasi - lmplementasi Apl Google Maps
FitUr DDMS
dan Geo-Location 208
BAB 6 DASAR PEMROGRAMAN ANDROID tL7
BAB 9 APLIKASI RSS FEED 229
Package Core Android 118
Tipe Data Primitive pada Android t20 RSS Feed lnformasi Cuaca 230
120 Proses Parsing Berkas XML
Komponen Dasar Penyusun Aplikasi Android 233

I );tllirt l:it
viii Pemrograman Smart Phone Menggunakan SDK Android dan Hacking Android ix
Data RSS Feed dan Aplikasi Parser XML 234
Class ContohParserSAX. j ava 237
Class weather. j ava 249
Aplikasi RSSCuaca 254
SQLite 328
Method Akses Database SQLite 328
Modifi kasi Database SQLite 330
SQLiteOpenHelper 332
Service dan BroadcastReceiver RSSCuaca 338
Penerapan Event Listener pada Service 353
Aplikasi RSS Feed USGS dan API Google Maps 35s Teknologi Smart Phone
Aplikasi RSS-USGS 356

BAB 10 APLIKAS! SENSOR ANDROID 409


Tipe Sensor pada Android 409
Project AccelerometerDemo 412
lntegrator Verlet 432
Tool SensorSimulator 445

BAB ll TROUBIESHOTING SDK ANDROID 451


BAB 12 HACKING ANDROID 455
Rooting Android 455
Upgrade Firmware Android Samsung 450

DAFTAR PUSTAKA 455


TAMPIRAN 469
RIWAYAT PENULIS 47s

smartphone (ponsel cerdas) merupakan salah satu wujud realisasi ubiquitous


-oo0oo- computing (ubicomp) di mana teknologi tersebut memungkinkan proses
komputasi dapat terintegrasi dengan berbagai aktifitas kese6arian manusia
dengan jangkauannya yang tidak dibatasi dalam satu wirayah atau suatu
scope area.
saat ini Kita telah memasuki masa ubicomp yang didukung beberapa faktor.
Pertama, dukungan ketersediaan jaringan infrastruktur-nirkabei dengan
cakupan yang luas untuk komunikasi data atau komunikasi audio dan video
digital. Kedua, teknologi mikroprosesor yang semakin canggih. Ketiga, faktor
gaya hidup user yang saat ini mulai bergantung pada perangkal mobile
sebagai alat komunikasi di socia/ network, akses layanan e-ma"il, chatting,
irtau telekonferensi.
Komunikasi digital nirkab.el suda.h sangat dibutuhkan pada berbagai bidang,
sr'perti edukasi, bisnis, hiburan, kesehatan atau keamanan. Sehingga, sangat

Pemrograman Smart Phone Menggunakan SDK Android dan Hacking Android


diperlukan ketersediaan perangkat mobile yang dapat mendukung aktivitas - Rendahnya dukungan multimedia untuk berbagai fomat audio dan
pengglrna di berbagai lingkungan dengan fleksibilitas tinggi, perangkat yang video. Karena, saat itu perangkat mobile maupun telepon seluler lebih
lebih praktis dan kemudahan dalam penggunaan. tidak mengedepankan kebutuhan entertainment selain itu umumnya
Satu dasawarsa lalu, teknologi mobile seperti PDA, telepon seluler l-.rersi'tem tidak dapat di-update. (Sumber: Wikipedia.org).
operasi Symbian, dan Komputer Tablet berbasis Windows. Telapi seluruh - Belum tersedia perangkat yang bersifat All-ln-One untuk memenuhi
gadget tersebut bukanlah perangkat mobile yang sesungguhnya, karena br:lunr berbagai kebutuhan dan segmen user, misalnya untuk edukasi,
terrealisasinya teknologi khusus untuk mobile seperti efisiensi konsumsi perkantoran, hingga kebutuhan outdoor contohnya fungsi LBS (Location
listrik, maupun komunikasi nirkabel berkecepatan tinggi. Based Service), berbasis CPS dan pengintegrasian sejumlah sensor.
(Sumber: Wikipedia.org).
Pada sisi sistem operasi, juga adanya ketidakcocokan OS berbasis PC
diterapkan ke perangkat mobile, dengan sistem antarmuka tidak didesain - Keterbatasan kontrol interface, perangkat mobile dan telepon seluler
untuk akses layar sentuh sesungguhnya (harus menggunakan stylus). umumnya hanya menyediakan tombol Nomor dan D-Pad (directional
pad) sehingga menyulitkan user saat menulis pesan SMS atau E-Mail,
Dari beberapa faktor keterbatasan perangkat mobile generasi pertama atau keharusan penggunaan pena stylus. (Sumber: Wikipedia.org).
maka dikembangkanlah smart phone dan komputer tablet generasi baru Dari berbagai masalah dan keterbatasan dari perangkat mobile generasi
untuk memenuhi kebutuhan pasar berikut adalah faktor-faktor yang
sebelumnya, kemudian sejumlah perusahaan teknologi informasi terkemuka
melatarbelakan gi pen gem ban gan tekno logi smartphone :
bekerja sama dengan perusahaan elektronika menciptakan sistem operasi
- Perangkat mobile belum mendukung kontunikasi data berkecepatan baru dikhususkan untuk perangkat mobile dengan disertai dukungan paket
tinggi. Meskipun saat itu infrastrukturnya telah memadai tetapi tool SDK agar aplikasi lainnya dapat dikembangkan oleh pihak ketiga.
konsumsi bandwidth masih didominasi dari pengguna internet berbasis (Android Development Documentation, 201 0 dan Meier, 2010).
PC di tingkat personal, pebisnis maupun tingkat korporasi. (Sumber: Beberapa perusahaan tersebut diantaranya: Apple /nc. dengan produk
Wikipedia.org). luaran terbarunya iPhone 4 membenamkan sistem operasi iOS 4. Nokia
- lnefisiensi konsumsi daya listrik o/eh CPU, RAM, ROM, dan rendahnya sebagai pengembang sistem operasi Symbian 540, 560, dan MeeCo untuk
kapasitas baterai yang berdampak pada performa sistem operasi dan sejumlah tipe ponsel Nokia. Coogle sebagai pengembang sistem operasi
ketidaknyamanan penggunaan karena harus selalu men-charge setiap 2 Android. Microsoft lnc. yang mengembangkan windows Mobile 7 dalam
iarn. (Sumber: Wikipedia.org). ponsel Samsung Omnia 7 (Cambar 1.1). Samsung secara mandiri juga
- Sistern Operasi maupun paket SDK (Standard Development Kit) mengembangkan sistem operasi Badayang digunakan pada ponsel Samsung
yang bersifat tidak open source seperti OS Windows Mobile dengan W ave. (http://viewgadgets. net, 20 1 0)
jangka waktu rilis update dan penambahan versi OS yang lama dan
tidak menentu, disebabkan pengembangan yang hanya sepihak oleh
Microsoft itu sendiri. (Sumber: Wikipedia.org).
- Perangkat mobile Hanya dapat menjalankan aplikasi single task,
contohnya handphone berbasis j2ME (menggunakan KVM, kilo-byte
virtual macl'rine). VNl tersebut tidak dapat mengeksekusi sejumlah
aplikasi secara multitasking. (Sumber : Sun Developer network, 2003).
- Aplikasi perangkat mobile belum mendukung slstern komputasi awan
(cloud networking) rnemungkinkan user memanfaatkan berbagai
layanan untuk kemudahan user (seperti Akses File Hosting, dan data )
dari berbagai web service. (Sumber: Wikipedia.org).
- Belum adanya portal unduhan aplikasi sebagai pusat distribusi dari (b) (c)
pendeveloper aplikasi, untuk menyederhanakan sistem distribusi,
dan mengurangi risiko pembajakan atau penyusupan virus. (Sumber: Gambar 1.1 Ponsel cerdas (a) iPhone 4 (b) Nokia C7 (c) Samsung Omnia Z
Wikipedia.org).
( httpl/viewqadqets. net)

Pemrograman Smart Phone Menggunakan SDK Android dan Hacking Android llAl't I lckrrolollr Iirrr,rrl l)lronl
Dari berbagai sistem operasi perangkat mobile dan telepon seluler yang
Rich Miner, Nick Sears, dan Chris White berpindah ke Coogle. Pada saat itu,
ada, pada buku ini hanya difokuskan untuk sistem operasi Android dan
OS Android dikembangkan hanya untuk kebutuhan internal oleh Coogle dan
pengembanganaplikasinya. Karena Android memiliki banyak keunggulan
belum berlisensi open source.
dari sistem operasi lainnya.
Salah satu keunggulan OS Android yaitu mendukung cloud computing
Untuk memperkuat adopsi teknologi Android, perkembangan Coogle
(komputasi awan) di mana pengguna dapat memproses informasi yang membentuk Open Handset Alliance (OHA). OHA adalah grup konsorsium
dengan anggota lebih dari 34 perusahaan dari bidang hardware, software, dan
dibutuhkan menggunakan jaringan internet dan berkomunikasi dengan
telekomunikasi. Diantaranya HTC, lntel, Motorola, Qualcomm, T-Mobile,
server sebagai penyedia layanan disebabkan sistem operasi ponsel cerdas
dan Nvidia, Asus.
Android dikembangkan langsung oleh Coogle yang dirancang tidak hanya
dapat berintegrasi dengan berbagai layanan Google (Cmail, Google Maps, Android dirilis perdana dengan standar open source pada 5 November 2007
CTalk, Picasa, YouTube) juga dapat mendukung layanan dari Yahoo, bersama OHA, penjelasan lebih lanjut standar lisensi Android dapat dilihat
Facebook, eBay melalui aplikasi eksternal meskipun layanan Google masih pada sub-bab Standar Lisensi Android.
memiliki popularitas terbesar jika dibandingkan dengan Update Service yang
Alasan Coogle merilisAndroid secara open source, yaitu untuk penetrasi pasar
ditawarkan Yahoo, Apple, dan Nokia.
produk berbasis Android dan juga mempermudah user dqlam mengakses
Perangkat mobile Android dapat dianalogikan sebagai suatu handheld PC layanan Coogle dan juga Android digunakan sebagai media baru penayangan
(komputer genggam) karena memiliki arsitektur identik dengan perangkat PC. iklan yang dapat menambah reyenue (pendapatan) Google, yang sebagian
Untuk rincian spesifikasinya ditunjukkan sebagai berikut : pendapatan tersebut untuk pengembangan OS dan aplikasi Android. Model
periklanan dalam Android memiliki style yang sangat berbeda dengan iklan
1 . Prosessor ARM (umumnya produksi dari lntel atau Qualcomm) dengan
lrerbasis web yaitu Coogle AdSense. Pada Android yaitu menggunakan
clock antara 500 MHz hingga di atas 1 CHz single core maupun multi-
AdMob (Advertising Mobile) yang ditayangkan lebih interaktif di dalam suatu
core.
aplikasi. (Gambar 1.2).
2. RAM bertipe DDR2 atau DDR3 (non-upgreadable) antara 128 MB
hingga 1 CB.
3. Flash Memory non-volatile berkapasitas 150 MB hingga 512 MB yang
difungsikan sebagai media penyimpanan sistem operasi, kernel image,
dil.
4. Dukungan komunikasi audio, video dan data nirkabel (WiFi, Bluetooth,
C PRS/HS DPA/HSU PA, CDMA)
Gambar 1.2 Banner lklan AdMob pada AplikasiAndroid
5. Button keyboard dengan fitur touch screen (single-tap atau multr-tap).
6. Memiliki banyak fitur native (CPS, Radio, Kamera, Accelerometer, \islr:m Operasi Android memiliki 2 jalur distribusi. Jalur distribusi pertama
Compass, Gyroscope)
rlirlukung oleh Coogle atau Coogle Mail Services (CMS). Jalur kedua OS
rrrcnggunakan pola distribusi secara bebas tanpa dukungan langsung Google,
7. Slot kartu memori MicroSD, sebagai media penyimpanan aplikasi atau
1,,rngdikenal sebagai Open Handset Distribution (OHD).
data user.
N4r'skiltun saat itu Android sebagai OS pertama yang bersifat open source
B. Berbasis kernel linux yang telah dikustomisasi dan didukung sejumlah
librari tambahan. 1,,rrl.r basis mobile embedded, banyak pihak beranggapan Android hanya
',,'lru,rlr perangkat lunak untuk telepon seluler. Meskipun kini Android
',,'nr,rkin sukses di pasaran, yang pengembangan Android tidak hanya dalam
Latar Belakang Android rrr.rrrri lingkup sistem operasi, tetapi juga pada level pengembangan aplikasi
rrr,,rrlilirrnakan 5DK Android.
Pada tahun 2000, jauh sebelum produk ponsel cerdas beredar di pasaran,
Coogle mengakuisisi perusahaan bernama Android. Perusahaan tersebut lrrrlilgirry,r oplirnisme sejumlah produsen yang tergabung dalam grup OHA
merupakan pendatang baru berfokus untuk pengembangan sistem operasi ,lr;r.rr1l.rrrrhi rlari senrakin meningkatnya popularitas perangkat berbasis os
embedded dan software untuk perangkat mobile. Kemudian setelah Android ,\rrrlrrirl sclrinlig.t nrr:rubah dominasi pasar produk perangkat mobile yang
lnc. menjadi grup Coogle, para pendiri Android diantaranya Andy Rubin, ,,,.lrclrrrrrrry,r rrr,rsilr rliktr.rsai oleh Nokia dan Apple.

Pemrograman Smart Phone Menggunakan SDK Android dan Hacking Android llAll I lr,krrolr11r l,rrr,rrl l'ltrrrrr,
Perangkat Mobile berbasis Android peripheral lainnya berbasis komunikasi Bluetooth
Sejak awal tahun 2009 hingga saat ini, Coogle telah merilis sejumlah versi o Tampilan menu didukung animasi, virtual keyboard layar sentuh
produk ponsel cerdas Android dalam periode waktu yang singkat. Berikut o Dapat mengubah display dalam mode portrait atau landscape
adalah rincian versi-versi OS Android yang telah dirilis oleh Coogle dan tipe Perangkat dengan OS versi ini diantaranya HTC Hero dan Motorola
produk-produknya: Backflip. (Cambar 1.4).

1. Android versi 1.1


Versi perdana ini dirilis pada 9 Maret 2009, versi ini dilengkapi dengan
tampilan estetika Ul (User lnterface) yang cukup baik. Juga adanya
aplikasi pendukung seperti jam, alarm, voice search, pengirim pesan
menggunakan Gmail dan E-Mail. Produk peftama yang menggunakan
OS Android versi 1.1 yaitu ponselcerdas HTCT-Mobile C-1 (Cambar
'1.3) yang merupakan produk hasil dari pengembangan oleh Google
dan produsen HTC. Meskipun demikian, perangkat ini dengan versi
OS tersebut belum menyediakan fungsi upgrade sistem operasi atau
apl ikasi.

(a) (b)
.l

Gambar 1.4 (a) HTC Hero dan (b) Motorola Backllip (Sumber : http://www.gsmarena.com)

l:,'

ti
3. Android versi 1.6 (Donut)
Dirilis pada September 2009 dengan penambahan fitur pencarian
Coogle lebih baik dari versi sebelumnya, adanya indikator baterai.
Dan beberapa fitur lain yakni :

Gambar 1.3 Ponsel cerdas HTC I Mobile G 1 (sunber : http://vntw.gsnarena.com)


o Tampilan file Caleri thumbnail untuk kemudahan memilih file,
terintegrasi dengan file gambar dari kamera atau rekaman video
2. Android versi 1.5 (Cupcake) o MendukungJaringan CDM{EVDO, 802.1x, applet kontrol VPN
Pada pertengahan Mei 2009 diluncurkan Android versi 1.5 dan juga (V i rtu al
P r iv ate N etwo rk)

pertama dirilisnya paket SDK untuk deve/oping aplikasi Android. o Sensor gesture (gerakan), dan Konverter lext-to-spcech (teks ke
Versi ini merupakan perbaikan dari versi 1.1 dengan penambahan ucapan)
beberapa fitur, diantaranya :
o Kontak telepon, resolusi display VWGA
o Fitur rekam atau pemutar video pada modus kamera Mobile device yang menggunakan Android versi ini yaitu Sony
o Mengunggah video langsung ke Youtube atau file gambar ke Ericsson Xperia X10 dan X10 Mini Pro.
Picasa
o Bluetooth dengan fitur Advanced Audio Distribution Profile
(A2DP) dan dapat terhubung dengan headset dan perangkat

Pemrograman Smart Phone Menggunakan SDK Android dan Hacking Android ItAll I llktrokrlit l,trr,rtl l'lrorrr,
Gambar 1.6 (a) Samsung Galaxy 5 (GT 1550x), (b) LG Optinus dan (c)Acer Liquid Strean

(a) (b) (Su mber : http //www. g sna rena. con)

Gambar 1.5 Sony Ericsson (a) Xperia X|0, dan (b) X70 Mini Pro
(Sunber : http.//vtww.gsmarena. con)
5. Android versi 2.2 (Froyo)
Versi ini diluncurkan pada bulan Mei 201 0, berikut fitur yang dimiliki:

4. Android versi 2.1 (Eclair)


o Mendukung aplikasi 3D dengan OpenGL ES 2.0
Versi 2.1 dirilis secara bertahap, yang versi finalnya diluncurkan o Dukungan Compiler JIT (lust-in-time) yang dapat meningkatkan
Desember 2009. Beberapa fitur diantaranya: performa framerate VM Dalvik dan WebKit browser 2 hingga 5x
dari versi Eclair
o Optimalisasi perangkat hardware
o API Service yang dapat melakukan pengiriman pesan dari
o Update Google Maps menjadi versi 3.1.2 jaringan cloud ke device
o Perbaikan tampilan L)l (User lnterface) dan daftar kontak o API backup manager, untuk fungsi backup dan restore data saat
o Browser mendukung HTML5 dan WebKit proses update
o Blitz kamera, digital zoom o Dapat dijadikan sebagai poftable HotSpot
o Bluetooth versi 2.1 Produk yang menggunakan OS Android Froyo diantaranya Samsung
Contoh perangkat yang dibenamkan OS versi ini yaitu Samsung Calaxy Tab dan HTC Desire. (Cambar '1.7)
Calaxy 5 (Corby i5500), LG Optimus, dan Acer Liquid Stream.
(Gambar 1.6)

IiiILIK I
EaCra pcrpusfakau
i
daa f,earsJ,pan I
Propinsi Jann Timnr

ItAlt I lr,krrokrllr lirrr,rrl l'lrrrrrr,


Pemrograman Smart Phone Menggunakan SDK Android dan Hacking Android
(a) (b)

Gambar 'l.t Samsung (a) Galaxy Tab dan (b) HTC Desire
1.8 Ponsel Nexus S dengan OS Android Gingerbread (Sumber : wvw.geeky gadgets.con)
(Sunber : httpl/ www. geeky-gadgets.com)
7. Android versi 3.0 (Honeycomb)
Android Honeycomb dirilis kuartal pertama 2011 sebagai versi yang
6. Android versi 2.3 (Gingerbread)
dioptimasi untuk perangkattablet. Waktu rilis Honeycomb bersamaan
Versi ini dirilis pada Desember 2010, beberapa fitur yang dimiliki
dengan produk tabrlet Motorola Xoom, Android versi Honeyconrb
versi C i n gerbread d iantaranya:
bersifat universal yang dapat pula dinstalasi pada perangkat smart
a. Optimalisasi JIT dengan framerate yang lebih baik dari versi phone. Beberapa penambahan fitur diantaranya Ul, API Video call,
Froyo dan kualitas video full Hi-Definition. (Cambar .l.9)
b. Mendukung file video format WebM dan file gambar berformat
WebP yang dapat mereduksi ukuran file hingga 40% dari format
JPC pada kualitas sama
c. Kemudahan input teks, dengan fitur auto-co mplete multibahasa
menggunakan kamus internal dan fitur kontrol select copy-paste
(serupa dengan iPhone).
d. Application Manager, untuk memantau resource memori dan
CPU tiap aplikasi
e. Sensor NFC (Near Field Communication) (tergantung dari
dukungan hardware NFC)
f. UI dengan tampilan lebih kompak dan sederhana
C. Telepon internet/VolP, melalui jaringan 3G atau WiFi
dikonfigurasi melalui 5/P (Session lnitiation Protocol)

Salah satu produk Android versi ini yaitu Nexus (Cambar 1.8). Gambar 1.9 Tablet Motorola Xoon dengan OS Android Honeyconb (Sunber : www.geeky_
gadgets.com)

llrrr1l1i,r s.r.rl irri sistr:m operasi versi Android terus diperbarui, seiring
pctttL'vt'lopt'r nr,tsih prrlrluklif dalam mengembangkan software stack Anr.lroiii

10 Pemrograman Smart Phone Menggunakan SDK Android dan Hacking Android IJAIJ I lckrtokrrlr lirrr,rrl l'lrorrr, 11
Microsoft
untuk meningkatkan performa atau penambahan dukungan hardware terbaru.
Hampir seluruh produk yang beredar umumnya dapat diupgrade ke OS versi
yang lebih baru. Hal ini menjadi pengalaman baru userdalam meng-upgrade
iPhone Apple
sistem operasi perangkat mobile. Karena pada perangkat mobile generasi
L4,6y"
sebelumnya jarang mendukung titur upgrade.
Pada Gambar 1.10 ditunjukkan grafik piechart persentase perbandingan
sejumlah versi Android yang beredar di pasaran, data ini diperoleh dari
website developer.android.com bulan Oktober 2011. Dari piechart tersebut
terlihat di pasaran ponsel Android telah didominasi OS Android versi 2.2.

Honeycomb Android 1.5 Android 1.6


{3.0) Android 2.1
1,8 LL,7 Y, Gambar 1.11 Grafik persentase ponsel cerdas di pasar AS di kuaftal 4 tahun 201 0 (Sumber : ulyvw.

canalys.con)
(2.3) Dari Cambar'1.11 terlihat data persentase shipping (pengapalan) berbagai
38,7 "A hdroid 2.2 smartphone yang beredar di pasar Amerika Serikat pada kuartal ke-4 tahun
45,396, 2010, ponsel berbasis berbasis OS Android menguasai pasar dengan tingkat
pertumbuhan (growth rate) 615,1"/". Hal ini didukung dari beberapa faktor :
. Faktor open source baik dari Ievel kernel, sistem operasi hingga
SDK. Sehingga mempercepat proses rilis produk ponsel cerdas dan
dukungan peripheral hardware terbaru, dampak positif dari open-
source memungkinkan cepatnya penanganan bug, pengurangan ongkos
produksi, serta dukungan aplikasi yang variatif dari pihak ketiga;
Gambar '1.10 Piechart persentase perbandingan versi-versi Android yang beredar di pasaran
. Dukungan Coogle Services. Konsumen dan produsen diuntungkan
(Sunber : www. canalys.com)
dengan adanya tambahan fitur layanan komputasi awan Google Service,
dan didukung ratusan ribu aplikasi yang tersedia dalam Coogle Market
(yang kini telah berganti nama Coogle Play);
Dari Gambar 1.10 terlihat setiap dirilisnya produk mobile Android terbaru, . Dukungan sejumlah perusahaan elektronika dan telekomunikasi yang
akan digunakan Android versi terbaru karena memiliki performa yang lebih tergabung dalam Open Handset Alliance (OHA) yang berpotensi besar
baik juga adanya perubahan spesifikasi perangkat keras seperti prosessor, menguasai pasar ponsel;
chip sensor, dan LCD layar sentuh. . Pengembangan kernel Linux, kernel linux yang telah lama dikenal
Selanjutnya dari grafik piechart Cambar 1.1 1 ditunjukkan data hasil analisis memiliki kompatibilitas tinggi di berbagai platform prosesor, baik single
pasar dari Canalys Research (Sumber: www.canalys.com). core atau multi-core dan juga mendukung akselerasi grafis 3D.

Berikut sejumlah perusahaan handset yang tergabung dalam grup OHA,


rnasing-masing produsen telah memasarkan produk gatget berbasis Android :

. Acer lnc . Kyocera


. Alcatel . Lenovo Mobile
. ASUSTeK . LG Electronics
. CCI . Motorola

12 Pemrograman Smart Phone Menggunakan SDK Android dan Hacking Android liAlI I krklxrlogr Srrr;rrl [)horrc 13
Dell . NEC Corporation
Foxconn lnternational Holdings . Samsung
Garmin . Sharp Corporation
Haier Telecom . Toshiba Corporation qT r:::.1:."*"'
HTC Corporation . ZfE Corporation u+
".s
. S[ 1o'rtsrt
HuaweiTechnologies Sony Ericsson *:l;lllt r:rlll
E r:o:i::"'"*
# ffi lEt
Saat ini peminat Android di pasar internasional masih terus meningkat, di .5 Eil
lndonesia telah banyak distributor produk Android tanpa sistem bundling * lYi"l, ffi.
11tl
HT !,6,!i 1*
.,rr.i.
Effi
(unlocked), seperti HTC, Sony Ericsson, Acer, Samsung, LC. Sejumlah
fu lstnorllcurnrlrr rrr! 6XXt
operator telekomunikasi lndonesia juga memasarkan produk Android dalam
bentuk paket bundli ng (locked). Diantaranya Telkomsel bekerja sama dengan
(a) b)
produsen Nexian yaitu A9B0 Journey dan Bakrie Telecom yang mem-bundling
Gambar 1.12 (a) Market (Google Play) pada Android (b) Website Market atau Google Play
Android Huawei IDEOS C8150.
(Sumber : https://market.android.com)

Distribusi Aplikasi Android Market atau Coogle Play merupakan portal distribusi aplikasi resmi Android
Setiap perangkat Android terdapat sejumlah aplikasi yang dipisahkan di-maintain oleh Coogle. Sistem retail Coogle Play serupa AppStore milik
men.iadi 3 kelompok berdasarkan pola distribusi. Pertama, aplikasi native Apple. Sebelum aplikasi didistribusikan ke publik diperlukan proses registrasi
sebagai aplikasi fungsi dasar dan dukungan untuk Coogle Services, seperti dan kartu kredit untuk biaya pendaftaran 25 US $ (biaya ini berlaku pada
Phonebook, SMS, Gmail, Ctalk, Coogle Maps, Coogle Calendar, dan Market bulan Maret 2011), setiap aplikasi berbayar yang terjual Google Play akan
yaitu aplikasi yang akan mengakses data katalog aplikasi dari pihak ketiga mentransfer uang ke pengembang melalui akun tersebut. Tetapi untuk aplikasi
pada http:llmarket.android.com (URL tersebut masih bisa diakses, YanE gratis, pengembang tetap dapat memperoleh keuntungan melalui AdMob
otomatis mengalihkan ke domain baru : https:llplay.google.com) tanpa atau untuk penayangan iklan, sehingga iklan yang dibuka user menguntungkan
dapat melalui browser PC. bagi pengembang, Coogle, dan pihak yang mengiklankan produknya.
Kedua, aplikasi tambahan yang dikembangkan oleh produsen atau provider Tanpa Google Play aplikasi Android sangat rentan disusupi virus atau
dirancang untuk mendukung hardware spesifik suatu produk, sepefti aplikasi malware yang dapat melakukan pencurian data pribadi, karena aplikasi yang
Layar khusus produk Android Samsung, atau User lnterface Sense untuk didistribusikan Coogle Play melalui proses pengawasan dan filtering untuk
produk luaran HTC. Kedua jenis aplikasi di atas secara default telah ter- menghindari virus dan Malware . User dapat memberikan komentar aplikasi
bundling pada perangkat Android dan tidak akan hilang meskipun dilakukan yang diunduh, juga tingkat popularitas aplikasi tergantung dari skor masukan
factory reset. tiap user. Untuk menghindari resiko terkena virus/malware, sebaiknya hindari
mengunduh aplikasi dari pengembang belum terkenal dan berskor tinggi.
Ketiga, aplikasi yang dibuat oleh pengembang third-party, baik menggunakan
Karena skor tinggi dapat juga diperoleh dari komentar hoax (tipuan). Juga
SDK Android maupun SDK lainnya yang dapat di-publish pada Market (atau
hindari mengunduh aplikasi yang membutuhkan banyak permission (seperti
Coogle Play) setelah pengembang melakukan proses sign-in (pendaftaran). mengakses data sms, phonebook, atau e-mail).
User dapat pula mengunduh aplikasi Android pada website pengembang.
Sctelah pengunduhan APK selesai, instalasi akan berjalan secara otomatis
Awalnya Market hanya dapat diakses melalui Aplikasi APK Market yang secara
y;rng secara defaultakan tersimpan dalam direktori /system/app (memori
defaulttelah terinstalasi pada perangkat Android (Cambar 1.12a). Tetapi, kini
internal) atau dapat dipindahkan ke kaftu memori eksternal (untuk versi Froyo
melalui website Market Android (Cambar 1.12b), pada URL: http:llmarket.
.rtau android versi terbaru).
android.com atau https:llplay.google.com kita dapat mengunduh aplikasi
secara remote melalui browser Android, kemudian saat perangkat Android Menjadi pengembang aplikasi berbasis Android memiliki prospek cukup
sudah terhubung jaringan CPRS/3C/HSDPAA//i-Fi secara otomatis Market <r'rah, karena Android telah menjadi trend baru sebagai sistem operasi
mengirimkan aplikasi yang telah di-request ke perangkat Android target pt'rangkat mobile. Bahkan beberapa produsen telah menciptakan kulkas,
(diasumsikan satu akun user hanya memiliki satu perangkat Android). llrcrnr<lstat, dan sistem keamanan dengan OS Android.

14 Pemrograman Smart Phone Menggunakan SDK Android dan Hacking Android llAll I krkrrokrgr llrrr;rrl I'lrorrc 15
Fragmentasi Android mobile. Selain itu, sangat diperlukan kemampuan pemrograman berbasis
OS Android, karena platform ini memiliki perbedaan yang sangat signifikan
Semakin populernya OS Android di pasaran mengkibatkan semakin besar dengan aplikasi berbasis PC. Juga perancangan kode-kode aplikasi harus
permasalahan pada fragmentasi Android. Fragmentasi terjadi karena disesuaikan pada dukungan fungsi dari API target, hal ini lebih lanjut akan
perbedaan yang mencolok spesifikasi perangkat keras dari tiap produsen dijelaskan pada bab-bab selanjutnya.
(prosessor, ukuran display, atau tipe sensor), juga penerapan pustaka
proprietary (tidak open source) dan antarmuka Ul yang tidak seragam' Sebelum melanjutkan ke bab berikutnya. Perlu diingat bahwa saat buku ini
Sehingga terjadi perbedaan performa dan kompatibilitas aplikasi. Beberapa
ditulis, versi OS Android masih selalu diperbarui. Sehingga saat instalasi
kasus yang sering terjadi seperti aplikasi tidak dapat mengakses salah satu
SDK Android atau plugin yang dijabarkan mungkin tidak sama dengan
hardware atau display yang tidak berjalan normal.
versi terbaru yang telah kita unduh. Meskipun demikian, SDK dan API
dari versi sebelumnya tetap akan di-maintain oleh repositori Android dan
Untuk meminimalkan resiko fragmentasi dan inkompatibilitas, diprioritaskan bahasa pemrograman pada SDK Android akan tetap sama (berbasis bahasa
pengembang menggunakan API terendah dengan build proiect target pemrograman java).
padi platform versi paling rendah. Tetapi hal ini berdampak pada tidak
berfungsinya fitur API dari OS terbaru, salah satu contoh API yang jarang -oo0oo-
digunakan pengembang adalah API sensor Orientasi atau Gyroscope. Untuk
platform Android Honeycomb (3.0)telah tersedia too/ Android Compatibility,
merupakan perpanjangan dari API Fragments, untuk kemudahan
pengembangan porting ke perangkat Honeycomb. Honeycomb mendukung
desain Ul yang lebih dinamis dan fleksibel untuk perangkat dengan ukuran
dan resolusi display yang berbeda seperti tablet dan smart phone. API ini
berfungsi pula sebagai solusi dari masalah segmen Activity.

Popularitas Aplikasi Mobile


Di masa depan sistem operasi Android berpotensi sangat besar. Untuk itu,
diperlukan strategi agar aplikasi yang telah kita buat dapat lebih populer
diantara sejumlah aplikasi sejenis dari kompetitor. Berikut beberapa faktor
pertimbangan untuk realisasi pembuatan aplikasi :

1. Faktor Kecepatan, tingkat efisiensi aplikasi dalam menyajikan data,


proses dan memberikan output data secara cepat sesuai keinginan
konsumen;
2. Aspek Produktivitas, kebermanfaatan aplikasi dalam peningkatan
produktivitas user mencakup alasan penggunaan aplikasi untuk
mengatasi masalah yang sering dihadapi user;
3. Kreativitas desain, nilai tambah yang dapat menarik minat user
menggunakan aplikasi tersebut. Diantaranya kemudahan penggunaan
(user friendly) dan penyesuaian untuk segmen user tertentu yang
d i klasifikasi kan berdasarkan usia, pend id i kan, atau kalangan d ifabel.

Flel<sibilitas dan kehanda/an solusi alternatif dari keterbatasan aplikasi


agar dapat berfungsi normal pada segala kondisi. Beberapa masalah
yang sering muncul dalam aplikasi mobile diantaranya keterbatasan
kecepatan prosessor, baterai, jaringan, dan bandwidth.
Faktor-faktor di atas dapat menjadi dasar strategi merancang aplikasi-aplikasi

llAlt I lr,krrolollr lirrr;rrl l'ltorrr,


r1r rLrK I 17
16 Pemrograman Smart Phone Menggunakan SDK Android dan Hacking Atttlroid I'trpu...llkror
B:ir!;ln I
rier f,c,rriper
I
Software Stack Android

Android merupakan suatu software stack yang terdistribusi open source.


Terdiri dari sistem operasi, middleware, dan key application (aplikasi dasar).
Sistem operasi Android didesain untuk perangkat mobile dan merupakan
turunan sistem operasi berbasis kernel Linux, beberapa bagiannya juga
identik dengan sistem operasi CNU-Linux, diantaranya kernel, pustaka atau
librari, framework, dengan penambahan Dalvik virtual machine. Dengan
kata lain, OS Android sangat identik dengan OS Linux.
OS Android tidak memiliki sistem native X-Window seperti pada OS Linux
rlan tidak mendukung librari standar GNU seperti librari CNU C. Aplikasi
yang berjalan pada OS CNU-Linux tidak akan dapat dijalankan pada
lrcrangkat Android.
Scjumlah fitur yang dimiliki software stack Android (Meier, 2010) diantaranya
i,rl.rh:
Dukungan application framework, sejumlah fungsi API tersedia untuk lmage-image tersebut tersimpan pada flash memory non-volatile, yang
kemudahkan pengembang Android; lrersifat read only (diistilahkan sebagai ROM). Meskipun terkadang flash
rnemori akan ditulis ulang saat proses upgrade atau update sistem operasi.
Dalvik VM (Virtual Machine), VM sebagai intepreter aplikasi Android.
Dalvik VM mendukung eksekusi aplikasi secara multitasking dengan Dari referensi developer Android, seperti yang dijelaskan pada blok diagram
instance (obiect) virtual machine berjalan terpisah, dan konsumsi (lambar 2.'l merupakan bagian penyusun sistem operasi Android. Seluruh
resource prosesor dan memori rendah; lilesystem tersimpan dalam image system. Sedangkan untuk aplikasi Android
(berekstensi *.apk) berjalan pada layer teratas, disertai sejumlah aplikasi
lntegrated browser, dengan web browser berbasis WebKit dan dapat
diintegrasikan dengan aplikasi lainnya dengan mengaktifkan intent dari rrative dan third-party yang seluruhnya menggunakan librari API yang
sama dan dijalankan dalam runtime Android. Secara default, Android juga
browser tersebut;
rrrengijinkan user menginstalasi aplikasi selain dari market.
Optimasitampilan grafis, tersedia sejumlah pustaka untuk fungsi grafis
2D dan 3D berbasis OpenCL;
Database relasional SQ[ite, format standar query sama seperti bahasa Phone.apk Phonebook.apk Email.apk Browser.apk '.apk
SQL lainnya, ringan dan powerful;
Dukungan berbagai format media audio, video, dan file gambar seperti
Framework Aplikasi
MPEC4, H.264, MP3, OCC, AAC, AMR, JPC, PNC, dAN GIF;
Mendukung komunikasi percakapan telepon atau SMS menggunakan Manajemen Manajemen Content System
jaringan GSA//CDMA; Activity Window Provider Mew

F leksibilitas jari ngan, mendukung berbagai teknologi n irkabel seperti


Manajemen Mana.iemen Manajemen Manajemen Manajemen
Bluetooth, ANT+, WiFi, CSM, CDMA, WCDMA, EDCE, EVDO, Package Telepon Sumberdaya Lokasi Notifikasi
HSDPA, HSUPA;
Menduku ng dev ice native,seperti C PS, A-C PS, Compass, Accelerometer,
Magnetometer (tergantung dari spesifikasi hardware); Librari-librari Runtime Android

Dapat diintegrasikan dengan tool-tool developing diantaranya tool


emulator, tool debugging, tool profiling memori, dan too/ plugin IDE
Manajemen' Framework
SQLite ffi
W
Eclipse. <---+
Dalvik
OpenGL€S FreeType WebKit I Virtuat uacnine

Pada perangkat Android terdapat sejumlah image yang serupa dengan sistem
operasi GNU-Linux dengan penambahan beberapa partisi image disesuaikan SGL SSL Ubc

fitur dan spesifikasi masing-masing perangkat Android (Steele, J., Neelson, T.,
201 1) diantaranya

Wffi{MffiW
:

. lmage bootloader, untuk fungsi inisiasi loading boot image saat proses
start up perangkat
.
.
lmage Boot, image ini sebagai media penyimpanan kernel linux dan
RAM disk
lmag,e System, berisikan sistem operasi yang berbasis UNIX dan
sejumlah aplikasi native
WWWWW
Gambar 2.1 Blok diagram 0S Android (Sunber: hftpl/developer.android.con)
lmage Data, untuk penyimpanan data di level user
Recovery lmage, berisikan sejumlah file untuk proses recoverY yang l',rrl.r lr,vr'l {r;tmawork Android terdapat sejumlah class untuk digunakan
akan mereset konfigurasi sistem operasi ke state defaultfactory ,rlrlrk.rsi Arr<lroi<1, yang menyediakan abstraksi hardware generik dan
Radio tmage. image yang berisikan sejumlah file untuk level stack radio l)r,n,,i,rlur,ln [rrnlisi man;rjemen Ul dan re.source. Sehingga aplikasi dapat

20 Pemrograman Smart Phone Menggunakan SDK Android dan Hacking Android


ItAll l' liollwirrc lil,rlk Arrdrorrl 21
mengakses ke hardware.
Filesystem Android
OS Android memiliki ciri khas yaitu adanya run time Android yang di dalamnya
Sclain Android mengadopsi kernel Linux, Android juga memiliki struktur
terdapat core library dan VM Dalvik sebagai penyedia sistem dasar untuk l.rierarki filesystem yang berbasis UN/X. Gambar 2.2-menunjukkan garis
framework aplikasi. Core Library menggunakan basis bahasa Java, tetapi tidak besar struktur direktori filesystem pada Android.
identik dengan Java VM yang akan dijelaskan pada bab selanjutnya. Dalvik
VM merupakan virtual machine berbasis register yang telah dioptimasikan
agar dapat menjalankan sejumlah instance dalam waktu yang sama secara
efisien dan seluruh proses diandalkan pada kernel Linux sebagai penyedia
proses threading dan manajemen low level memory.
Pada librari di levelsistem operasiterdapat sejumlah librari lib, media untuk
kontrol audio dan video, surface manager untuk manajemen surface, librari
untuk hardware sensor gesture dan GPS, librari grafis yang mendukung grafis
2D dan 3D, librari SQLite untuk dukungan fungsi database yang dibutuhkan
aplikasi, Webkit SSL untuk fungsi internet dan security.
Sedangkan untuk level terendah Kernel Linux sebagai penyedia service driver
hardware, process, manajemen memory, dan fungsi lainnya.
Dari hierarki tersebut tampak level Aplikasi tidak bersentuhan dengan leve/
systern Android sehingga memilikitingkat kestabilan pada sistem operasi yang
lebih baik seperti resiko penyusupan virus yang dapat melakukan modifikasi
file system. Garbtr ZZ Stuklur direktwi tilesystem Android

Rincian fungsi masing-masing direktori adalah sebagai berikut:


KernelAndroid . / : merupakan ujung dire,ktori pada fitesystem UNIX_like, yang
Kernel Android merupakan kernel turunan linux versi 2.6 disesuaikan untuk dikenal sebagai "root" untuk acuan direktori, sub direftor[
kebutuhan spesifik perangkat mobile Android, yang terpisah dari kernel tree. dan seluruh file yang berkaitan dengan sistem operasi.
Sistem pendistribusian kernel linux Android juga tidak menggunakan jalur . /cache : direktori ini sebagai penyimpanan file cache, misalnya pada
konvensional. aplikasi browser berupa file image, halaman web, ilash
video, dan lainnya.
Setelah perusahaan Android lnc. diakuisisi Coogle, Google tidak meneruskan
pengembangan source code kernel hasil dari percabangan kernel linux yang
. ,/config berisikan
fi le.fi le konfigu rasi untuk perangkat Android.
telah dikerjakan sebelumnya. Kernel tree saat ini dirilis mandiri dengan '/d merupakan simbol link direktori / sys / kernel /debug
pemisahan kode yang d i implementasi kan kernel Li n ux sebel umnya. Meski pun yilC menyediakan sejumlah informasi untuk fungsl
perangkat Android tersebut menggunakan kernel linux sebagai dasar sistem debuging kernel.
operasinya, tetapi bukan tipe kernel Linux embedded disebabkan perbedaan . /data sebagai penyimpanan file database SeLite dari tiap aplikasi,
standar utilitas sepefti X-Window dan librari CNU-C. Kernel teftanam pada masing-masing database te.rsimpan dalam sub direktori yang
berbagai produk Android juga tidak saling kompatibel untuk digunakan terpisah dengan nama direktori mengacu dari nama paci<agE
pada perangkat lainnya, disebabkan kernel yang ada di satu perangkat hanya dari aplikasi, misalnya database aplikasi phone book akin
dioptimasi untuk hardware spesifik. Setiap versi Android digunakan versi
turunan kernel Linux yang berbeda, diantaranya :
tersimpan dalam direktori com. android . phonebook)
. ' /dev berisikan sejumlah character devices yang tertanam pada
Android 1.5 menggunakan kernel Linux versi 26.27 perangkat Android, misalnya GpS, accelerometer, kompas,
. Android 1.6 hingga versi 2.1 menggunakan kernel Linux versi 26.29 grafis video, CPU, sensor suhu, kamera, dan perangkai
. Android 2.2 menggunakan kernel Linux versi 26.32
lainnya.
' /eLc merupakan simbol link direktori /system/etc berisikan

22 Pemrograman Smart Phone Menggunakan SDK Android dan Hacking Android IlAll 2 liollw;rrr, lil,rr k Arrrlrorri 23
sejumlah file konfigurasi untuk semua aplikasi atau 5 lc -l
lr -l
konfigurasi driver yang berhubungan dengan sistem operasi druxruxrut root rcDt zAtO-12-2'] I2 :50 sqlit€_stnr_-iotmdls
rlr'x*---- mot mo{t 2t}t0-l?-2? 11 :51 conf is
Android, diantaranya file konfigurasi mount point (identik (lnxryx-** flrtcn cacl* 2,A1f,-12-2? 11 :51 .dchr
d--rryr-x :y!teG sdcardJ0 2*1W12-2? l2:35 $dcaKl
file f stab), wifi, bluetooth. lturuxM rcot mot 29lq-12-2? 11 :51 d -) ./$ya/}arnsl,/d.bus -
. /sdcard lrwxEx Eot ruot 2g1g-12..2? ,1!51 crc *> Ttgstcatctc
: direktori yang digunakan untuk mount point perangkat yang dturyx--x slEtca slEtcR 2BlO'12-2? l1 :51 Dcrsi.t
dMtslFx Fot ?oot 2f}ltg-tz-z2 1l :sl iyrtctr
memiliki slot untuk kartu memori microSD. dt,urxr-x foit ruot 19?6-8r-01 g?rw sv.
dMr-x--- Fot mot lrHl-er m:B sLin
' /system direktori yang menyimpan file-file binary, sepertitool untuk dr-xru-x
drys-x
Eat
Eot
not
frot
r9?G{l-gr t?:E prcc
1979-G1-61 e?:m llb
level shell (seperti 1s , chmod, chown, dll), librari OS, m-x-- Fot Hot 11685 ltffir-Ol 6?;8 Lolr-re
aplikasi Android (*.apk), tont default, Dalvik VM, dan
urx--- mct rcot 2381 19Hl-ei 87:ffi init-qcqr.ch
-rex--- lOOt mot 1243 L9'l{i-{l-ol 8?:ffi lnit.qcoe-rc
-l*r-r--- re6t root ,7iS li?o.{i'^-Ol t?:m init.dcoa.mst boor-sh
lainnya. urz-- reot nst lU{ t9Hr-Ol tr7:il init.doldfish.ii
-m-x--- Eot rcot L9fi12 r9ft-A1-81 67:8 lnit -
/ sys berisikan file sistem dan konfigurasi untuk kontrol hardware, -rH--
dpxre-x
rcot
*lxtee
rcot
slptc,
r13 l!?g-S1-O1 m:m dcfault,prcp
2StS-12-2? 11:51. data
diantaranya sistem catu daya, RTC, CPU, memori, jaringan. -rrt-* lloot sot 12CC.t l?zwl-et W.X EUBOpT[-rk
im------ rcot reot 2&e-i0-15 mor
/sbin berisikan daemon untuk komunikasi dengan ADB dan dlffi
I
mot Eot 2glg-L2-2? 1.1:f,1
'.2:,t6 d.v
aplikasi level server (administrator)
Gambar 2.4 Sejumlah dtrektori dan frle yang terdapat pada root filesystem Android
/proc direktori menyediakan sejumlah informasi di level
ini
hardware, sistem operasi dan virtual machine. Diantaranya
cpuinfo, meminfo, ioport, diskstats, vminfo yang dapat l'ada sistem direktori os Android kernel Linux tidak terlihat, sedangkan pada
diakses dengan perintah cat. ()S CNU-Linux umumnya tersimpan pada direktori ol". Hal ini disebabkan
I cd prec kt'rnel linux tersimpan pada image terpisah secara fisik juga tersimpan pada
bd rrcc
I c.t ctBlnfo rnemori non-volatil sehingga kernel meniadi tidak tampak.
icet ctuinfo
Prcccssor : nnlill26EJ-S Ec 5 (uSl)
Eosonlns | 129 -9.
Ferturcc : tvp helf th(r5 f.stElt ufp cdsp Jaua
CPll irnlexntar : ,x{1
CPl, rfhlt6ct.s: S'EI Standar Lisensi Android
CFU eciilt 6*
PPU p.rt 6dr26
GPll EU li lon 5 Sistem operasi Android berstandar lisensi terbuka dengan source code
Gach. tgpe sltc-t hruqgh s<rftware stack terdistribusi secara open source. sehingga siapapun baik
f,rcha cloan not Equird
llachr locldom not i8lrlElt6d
i:acl- fomt llrruard lx'rsonal, institusi, hingga perusahaan perangkat mobile atau telekomunikasi
lI el<a {&,6 rlapat berkontribusi mengembangkan os Android dimulai dari level kernel,
:I rssoc 1l
rl lln. lcngth t2 lilrrari sistem operasi hingga aplikasi native.
lI rat* t2
b st2c 65535
D msoc
D lino lcngrth
1
,2 ()S Android dan kernel menggunakan standar lisensi Apache 2.0, sebagai
p rrtr st2 standar lisensi yang telah banyak diimplementasikan oleh komunitas open
hcrdsn fpldf trh
Bcu laloo m \( \t rce. Lisensi Apache mengij inkan pengembang menggabungkan pustaka
5crl.1 .rt.ru aplikasi komersial (c/osed source) dengan aplikasi open source. Untuk
I
,rlrlikasi. Android (yang berekstensi APK) yang dibuat pengembang pihak
Gambar 2.3 lnfornasi CPU nenggunakan Wrintah cat cpuinf o kctiga dapat didistribusikan melalui Market dengan kebebasan penggunaan
st.rndar lisensi, baik lisensi open source (CNU CpL, Apache, dll.J, ,tru
. init. * : file.file ini berisikan sejumlah shell command yang akan
t lost:d source diantaranya aplikasi native Cmail, CTalk, dan Coogle Maps.
l!.rgian aplikasi dari tool sDK, diantaranya modul, file framework, dan libiari
menjalankan aplikasi service atau daemon saat start-
.kstcrnal memiliki standar lisensi yang berbeda diantaranya GNU cpL v2
up Android, file tersebut identik dengan file yang ada di
,rl.rrr BSD.
direktori / eLc/ inlt. d/ pada OS CNU-Linux.

24 Pemrograman Smart Phone Menggunakan SDK Android dan l-lacking Android llAll,' liollw,rrr. iil,rr k Arrrlrorrl ?5
Konsep dan Fungsi LevelAPl pada Aplikasi Android I .vel .APl - . merupakan satuan nilai integer yang digunakan untuk
rrrengidentifikasi versi framework Apl. Dalam satu perangkalAndroid hanya
Salah satu dasar pengetahuan yang diperlukan untuk menjadi programmer rrremiliki dukungan satu level APl, seperti yang telahditunjukkan pada contoh
Android yaitu perlunya pemahaman fungsi level API yang didukung tiap pcrangkat-perangkat Android di bab pertama.
perangkat Android. Hal ini sangat penting karena level API mendefinisikan
stratu tetap dapat berjalan secara normar meskipun aplikasi tersebut
dasar kompatibilitas antara aplikasi Android ke sejumlah perangkat. rli r;rncang menggunakan API yang lebih rendah dari versi Api yang
Perbedaan level API yaitu pada penambahan c/ass dan method ditujukan didukung
untuk mengatasi masalah security atau peningkatan performa API yang 1r.r<la perangkat. Hal ini disebabkan pada Apl versi di atasnya tJtap meng-
rrrr,/ude-kan method versi sebelumnya (tidak terhapus r"."r" mutlak ata-u
umumnya perbedaannya tidak signifikan.
lronggantian method secara deprecate) dan pada versi terbaru diberikan
Pada sistem Android, Ievel API merupakan besaran integer yang 1x'nambahan method dan class. sedangkan uniuk Apl yang tidak ter-update
mengidentifikasikan revisi dari framework API dan ditunjukkan sebagai versi t t'tap d i-inc/ude.kan tanpa modifikasi.
dari platform Android, masing-masing platform menyediakan framework API
untuk diimplementasi oleh aplikasi Android. Framework API tersebut terdiri
dari beberapa bagian, yaitu:
. Paket-paket dan class-class yang tergabung dalam satu core set
. Atribut-atribut untuk pendeklarasian file manifest, yang tersusun dalam
satu set element XML (Extensible Markup Language)
. Atribut-atribut untuk pendeklarasian, akses resource, dan satu set
element XML
. Satu set Intent
. Set permission untuk digunakan aplikasi, termasuk pengaturan
permission dari sistem

Pada Tabel 2.1 ditunjukkan korelasi versi, level APl, dan sebagian fitur-
fiturnya.
Garsa 25 rlustrasi kanwatibitibs a$tarbverApr, dari tiq perarykatAfiroid
Tabel 2.1 Platfwm Android. LevelAPl, dan Fitur yang dimiliki Suatu aplikasi tidak dapat dijalankan pada perangkat yang memiliki level Apl
k'bih rendah dari level APIaplikasi, disebabkan aptitcasi rienerapkan method
Level rlan fitur yang tidak dimiliki level Apr di bawahnya. Meskipun demikian, user
Versi Platform Fitur-fitur API
API rlapat mengatasj
Android 3.0 10 Video call, HD Video, drag dan drop (sys clipboard) {engan cara meng-update os perangkat ke versi terbaru
y.rng telah disediakan produsen atau kornunitas pengembang Android.
Android 2.3 9 Elesain Ul baru, API NFC, Cyroscope, SIP VolP
I lnkompatibilitas antara. .p"1iF dengan perangkat cukup jarang terjadi
Android 2.2 Compiler JlT, backup dan policy manager i
karena seperti_yang telah dijelaskan seberumnya, perbedaan level
Android 2.1 7 Live wallpaper, opaque display, API Webkit ipr t"nin
Android 2.0.I 6 Perbaikan bug, Perubahan minor sebagian API r..ngarah pada penambahan fitur bukan perubahan method-method dasar
Android 2.0 5 Komunikasi device remote, Thumbnail view media s.h i ngga dalam membuat.apl ikasi pengembang dapat mengi mplementas
i kan

Android 1.6 4 Penambahan framework pencarian, Cesture, text-to- rncthod API yang serendah mungkin.
speech
Android 1.5 3 Penambahan framework Widget, Ul, Speech Recognition
Android 1.1 2 Lavout marouee. funesi method densan UID soesifik

Pemrograman Smart Phone Menggunakan SDK Android dan Hacking Android


llAll,' liollw;rrr' !il,rr k Arrrlrrrrrl
?7
26
Fungsi Level API pada Aplikasi Android
Level API sangat diperlukan untuk memberikan kemudahan user dan
pengembang aplikasi pada beberapa hal, diantaranya:
. Menginformasikan dukungan revisi maksimal dari framework API
. Memungkinkan pemantauan versi revisi frameworkAPl yangdibutuhkan
. Memungkinkan negosiasi saat instalasi ke perangkat user untuk
mengu rangi resi ko i nkompati bi I itas ap I i kasi dengan peran gkat And roid.
Pada perangkatAndroid dengan versi platform tertentu memilikidata identifier
level API secara internal pada sistem. Yang level API aplikasi didefinisikan
pada elemen manifest. Hal ini akan dijelaskan lebih rinci pada bab 6, sub-
Instalasi JDK, SDK Android
bab File Manifest.

dan ADT
-oo0oo-

Android SDK Manager dan Spesifikasi Hardware


Aplikasi sDK ManagerAndroid (cambar 3.1) merupakan aplikasi dasar untuk
rr('/n.rnage sejumlah package yang tersedia pada repositori coogle, atau
rr'prsitori dari perusahaan yang memproduksi produk mobile berbasis os
Arrrlr<lid-

28 Pemrograman Smart Phone Menggunakan SDK Android dan Hacking Android


rrl!{::::i:lri:l lllriil::' .lFix o Keyboard (TombolQWERTY, D-Pad)
ef esias lx}{* ttald Ofrd!6lo&:&d rt {: Erje& }{ 5ct&*}}*n5ffixC 5o{rxr!a' s(i:'","d o Sound dengan dukungan audio input dan output
ir::-l o Partisi Flash memory (yang diemulasikan berupa file image yang
! }ndli-t.:
! (eocrrr:7
! FiA!,
r.dw l.t
:]sgr f ir irjeirr :rJ ta:f tersimpan pada direktori development machine)
,rro,oid !-2
B+l o modem CSM (emulasi koneksi 3C), dan simulasi SIM Card
F':*:l I rnulator mendukung fungsi kustomisasi menggunakan command-command
m: y.rrrg dijabarkan pada bagian selanjutnya.
- ddms (Dalvik Debug Monitor Server), yang ditampilkan pada Gambar
3.2 merupakan aplikasi middleman berbasis CUl, sebagai penghubung
antara aplikasi IDE (Eclipse atau lainnya) dengan aplikasi yang berjalan
pada emulator atau perangkat Android. Fungsi utama ddms untuk
monitoring dan kontrol perangkat mobile atau emulator sehingga
developer dapat secara rinci menganalisa aplikasi dapat berjalan normal.
Beberapa fungsi ddms lainnya untuk emulasi penerimaan telepon/SMS,
i f ii{d**ddlrtdenif. i:,1 erc**.*rr*lC*}C.0airrl
dan penentuan koordinat GPS.
X r.ii1iii,,*rdDrilc tra*i*d eir.a d*ilctirit'ux?&irr.

Garbar 3.1 Tanpilan window aplikasi yang bersunber dari website Android (hfipl/developer.

android.con) : SDK Android dan AVD Manager

Selain SDK Android berfungsi sebagai application manager untuk mengunduh,


meng-update, atau menghapus package, juga menyediakan menu konfigurasi
pembuatan AVD (Android Virtual Device). Berikut rincian sejumlah tooltool
yang tersedia dalam paket SDK Android :
- Android sebagai tool terpenting dalam pengembangan aplikasi
Android. Tool ini berfungsi untuk membuat, mengedit, dan menghapus
suatu project atau AVD (Android VirtualDevice).
- adb (Android Debug Bridge) adalah aplikasi manajemen dan
perantara antara emulator dan aplikasi developing seperti ADT (Android
ri li!i ::l
DevelopmentTools). Aplikasi ini terdiri dari 3 level : pada level client
sebagai input dari shell command, level server untuk menjalankan
komunikasi di latar belakang (background) antara client dan daemon
yang berjalan untuk tiap emulator atau perangkat Android.
- emulator merupakan aplikasi berbasis QEMU, untuk virtualisasi
Gambar 3.2 Tanpilan aplikasi DDMS
perangkat mobile berbasis prosesor ARM. Emulator digunakan
untuk menjalankan aplikasi Android agar memberikan tampilan dan
ADT (Android DevelopmentTools) merupakan aplikasi plugin tambahan,
environment sama pada perangkat Android fisik. Beberapa fitur yang
bagian dari package SDK Android. ADT hanya dapat digunakan pada
dimiliki emulator diantaranya ialah :
ll)t Eclipse.
o Mengemulasikan CPU ARM v5 yang mendukung memory- I trrrgsi Lrlama ADT untuk menyediakan fungsi dan menu tambahan
management unit (MMU)
tlr.vr'lolring .rplikasi Arrdroid, membuat dan modifikasi U!, debugging
o Emulasi display LCD touch screen berresolusi 16-bit rrrr,l.rlrri I)l)MS rl.rlarn ling,kungan IDE Eclipse, dan ekspor aplikasi

30 Pemrograman Smart Phone Menggunakan SDK Android dan Har:king Android lrr'.l.rl,r't ll'1.',lrli Arllrr,,,l,1.,,, n,,, 31
android (file -apk) yang telah ter-signed atau un-signed. \'.rng menjadi pertanyaan adalah mengapa diperlukan ruang harddisk yang
Meskipun demikian, kita dapat membuat aplikasi Android tanpa r rrkup besar untuk SDK nndroid, hal ini dikarenakan dalam SDK dibutuhkan
rnenggunakan IDE Eclipse dan plugin ADT. Yaitu menggunakan st'jumlah package pendukung yang masing-masing dapat berukuran besar
aplikasi teks editor, misalnya notepad, Notepad+ + dan lainnya. (rata-rata di atas 40 MB).
Tetapi, membangun aplikasi dengan cara tersebut akan mempersulit Meskipun rekomendasi spesifikasi di atas termasuk high-end, tetapi masih
pengembang karena tidak mendukung fungsi auto-carrect atau rnemiliki kekurangan. Yaitu berbasis display framerate emulator yang sangat
pengecekan kesalahan penulisan pada package atau method.
rr.ndah saat menjalankan aplikasi 2D atau 3D. Hal ini bukan disebabkan
karena performa hardware, melainkan terbatasnya emulasi QEMU (Cambar
|.3a menunjukkan state emulasi QEMU sesaat setelah pengaktifan emulator).
Dalam proses pengembangan Android diperlukan spesifikasi minimal
Karena itu, setiap pengembang tetap membutuhkan perangkat Android fisik
hardware agar SDK Android dapat berjalan secara normal, berikut adalah
rrntuk menguji apakah aplikasi dapat berjalan normal atau tidak, khususnya
rinciannya:
rrntuk aplikasi berbasis grafis 2D atau 3D. Pada Gambar 3.3b tampak animasi
1. Prosesor Pentium 4 dengan clock 2,0 CHz, cache memori lMB atau lnoting sistem operasi Android.
yang setara-
2. DDR RAM 1,5 CB.
3- Space harddisk sekitar 2,6 CB (untuk aplikasi JDK, Eclipse + ADT, SDK,
dan AVD)-
4- VGA (mendukung OpenCL), dengan memori 64 MB
5- Sound Card Kompatibel (Onboard/PC!).
6- Port USB, Koneksi lnternet (menggunakan LAN, WiFi, Modem, atau
lainnya).
7- Sistem operasi Microsoft Windows XP, Windows 7, Linux, atau Mac
os x.

Meskipun demikian, pada spesifikasi hardware di atas akan membutuhkan


waktu cukup lama saat loading Emulator atau upload aplikasi ke emulator.
Disebabkan Emulator menggunakan resource processor dan memori yang
cukup besar. Oleh karena itu, untuk mengatasinya penulis memberikan
rekomendasi spesifikasi perangkat keras yang dapat digunakan SDK Android,
berikut rinciannya:
l. Prosessor lntel Core 2 Duo 2,5 GHz atau AMD Athlon X2 2,5 CHz Gambar 3.3 Tampilan layar enulator saat (a) Loading emulni QEM|I dan (b) booting sistem

2. RAM 2 GB DDR2 operast

3. Space Harddisk 15 GB (untuk aplikasiJDK, Eclipse+ADT, SDK, dan Mcskipun digunakan SDK versi terbaru, Emulator masih belum dapat
AVD) rrrr.rrjalankan aplikasi dengan look and feel yang sama pada perangkat
Arr<lroid. sedangkan jika menjalankan aplikasi mobile Java berbasis Jiur
4- VCA lntegrated on-board atau PCl-Express (ATl atau nVidia), dengan
t.urrpak sedikit perbedaan framerate display antara ponsel berbasis Java dan
VRAM 256 MB
r.rrrulator ponsel Java.
5. Compatible Sound Card (Onboard atau PCI)
6- Port USB 2.Q Koneksi lnternet (menggunakan Modem HSUPA atau
ll.rl ini disebabkan emulator membutuhkan resource prosessor dan RAM
y.urg r:ukup besar, disarankan aplikasi SDK tidak dijalankan pada Net-Book
broadband)
k.ur.rr.r memiliki kinerja yang lebih rendah dari laptop biasa.
7. Sistem operasi Microsoft Windows 7

32 Pemrograman Smart Phone Menggunakan SDK Android dan Hacking Android ItAll I Lt,,l,rl,r,,r ll)K, :il)KArrtlrorrl rl,rnAl)l 33
lnstalasi JDK dan Eclipse seperti compiler dan debugger. SDK Android juga tidak kompatibel
Pada Sub-bab ini akan dibahas proses instalasiJDK, Eclipse, SDK, dan plugin
dengan JDK versi open source (openJDK) dan hanya kompatibel
Eclipse ADT untuk sistern operasi Microsoft Windows XP dan Windows 7. dengan IDK versi 1.5 (Edisi 5) ke atas.
Antara kedua versi tersebut terdapat beberapa perbedaan proses instalasi 2. Setelah package JDK terunduh, lakukan proses instalasi JDK dengan
yang akan dijabarkan secara terpisah. Diawali dengan menginstalasi /DK meng-klik Next dua kali (Cambar 3.5) dan diakhiri dengan meng-lilik
$ava Development Kit) sebagai runtirne agar aplikasi SDK Android dan IDE Fin ish.
Eclipse dapat berjalan. Pada aplikasi IDE Eclipse akan digunakan sebagai
development environment untuk pemrograman aplikasi. Berikut rincian
proses instalasinya:
1. Unduh paketJDK dari Oracle, pada link URL: hup:llwww.oracle.coml
technetwork liavaliavase/downlaadslindex.html. Alamat unduhan
JDK saat ini telah beralih ke website Oracle karena Sun Microsystem
diakuisisi Oracle pada Januari 2010. Penulis menggunakan.f DK versi
6 update 22 untuk digunakan pada sistem operasi windows XP dan S.hct 6$tm.l &.ar8 b rl3d im trp I't bdon. Vo.r 5* drdea yo.r dtrfer cf ftrkru rffrr
h*tnaU$ bV uiarg $re ldd$errcre prqfus *Sty tr te Cs*a-parg
7. Dengan nama file 1dk-6u22-windows-i5B6.exe, versi ini
kompatibel untuk prosesor berbasis intel 586 (32bi0, seperti: Celeron, ft*r,cOc*cl&n
l*ra$1,!) E $el*pr;nt nti
Celeron M, pentiunr 4, Pentium D, Dual Core, Core2 duo, Core i7, t&dnE :2{ hdr*rn!{ylE X€
dan kompatibel dengan prosesor AMD, seperti Sempron, Athlon, dll. 61,ts&* 3a ti*illrsq"aE
S'Amyurhrd*tit.
trE@
..q
Cf,r{ACLE'

J!9.!t!!!f,!x?t

l3i{rt
5-!i.dlWe .9:1:- d .,ryr* 6s=a* Ilrllo.rrd ltll,
t
5*dh*
..- _.:
JEr.Lsii&J
Jarfi* Javr af Oqffitil$ I &E:.r{ txr&r
sti ld
.lnal:
rai.l! s Mibllr tMf,
h*.:!t
J*!i* i re.tr,l
ttue
{Brds it r!*}
**rup *m I tk.lrrs.l
le Gambar 3.5 Menu instalasiJDK Standard Edition edisi 6 update 22
,a! ,86
i f"* !r&.a*B
*xa.fiEffiF* t h{iqs)Ifi
BrFlde!ffffr l>*.qx
!E{t
-.(albd-fitS6-JS & I ea4rc
Selanjutnya, unduh Aplikasi IDE Eclipse Pulsar versi 3.5 (Calileo) pada
iafi dce'3orq ffilgt !a ia:q
kJf, LlHrh:*n-.8
dr*qtsEryr#rlriF.
tkn irt *,kr.*,.r.r
i**U*.&
d t sni website eclipse (Cambar 3.6a ) dengan URL: hap:/lwww.eclipse.orgl
@ -
+& *4rtus:eL:6mdI?-otFoffitlE tlr.e'lffi
dow n I oad s I p ackages I p u I sa r-mob i I *j av a-devel opers/ gal i r eo s r 2/atau
fr Ermrrt"il.4.i-.raJ+rorfr, tu..l,+ "i
ri{dd$affil.l6 -
lr$ t l.lia
h ltOri{ext}r.4t'.&r
dapat digunakan repositori Universitas lndonesia icambar 3.6b) URL:
http://kam bi n g. u i.ac. idlecl ipse/techn ology/ epp/ down Ioads/release/
Gambar 3.4 Halaman uduhan JDK pada Website Oracle (Sumber: httpl/www.oracle.con) galileo/SR2/
Pulsar merupakan IDE versi khusus untuk pengembangan project
Mobi le laua, diantaranya J2ME meskipun kita dapaipula mingguna'kan
Untuk paket installerJRE (Java Runtime Edition) tidak dapat digunakan t<'lipse selain package Pulsar.
untuk menjalankan SDK Android, hal ini disebabkan JRE tidak
menyediakan sejumlah file yang diperlukan untuk development, ll)l- yang dapat diunduh diantaranya Eclipse versi 3.Slpulsar dan
w'rsi .1.(t/l
/r'/ir.r.s yang k.mpatibel dengan plugin ADT. Tetapi, penulis

34 Pemrograman Smart Phone Menggunakan SDK Android rlan ll;tr:kttttl Arttlrorrl llAll I lrr',l,rl,t',r lltK. :,1)K Arrrlrorrl rl,rrr AI)l 35
sarankan gunakanlah versi Pulsar. Karena versi tersebut cenderung
lebih ringan dibandingkan versi Helios.
ki lndex of
/eclipl€ / te.hnology,/eFp/doantoad! J,ele.re lgalileo,'SR2/
OPukrd$srhJ*ro<sE

(a) (b)

Gambar 3.6 Halaman unduhan Eclipse Pulsar (a) pada eclipse.org (b) repositorikanbing.ui.ac.id

Setelah file eclipse-pulsar-ga1il-eo-SR2-win32. zip


(paket untuk OS Windows XPNistalT dan tipe prosessor 32 bi$
terund u h, selanj utnya ekstraksi kan fi le tersebut menggu nakan apl ikasi
Zip Extractor seperti WinZip, WinRAR atau sejenisnya pada direktori Ganba 3-7 Tanptlan w*ome sueen Eclipse Pulsar
C: \program fil-es\ atau direktori yang kita inginkan.
Setelah diekstraksi, jalankan eclipse.exe, yang kemudian akan
tampak window welcome screen (Cambar 3.7) Untuk memulai lnstalasi SDKAndroid
project, pilih go to Workbench. I'ada tahap ini.akan proses instalasiaplikasi sDK Android dan paket dukungan
l,innya. .lika digunakan sDK yang disertakan pada suplemen buku ini mika
t.rhap ini dapat kita lewati meskipun demikian versi tersebut bukanlah versi
t.rbaru..Proses-.yang akan dijabarkan bukan merupakan proses instaiasi,
r ukup ekstrak file kompresi yang ada di dalam suplemen ke Harddisk kita.
llerikut rincian proses pengunduhan dan instalasi paket sDK Android:
l - Unduh sDK dan ADT versi terbaru pada website Deveroper Android
pada.link http:lldeveloper-android.com lsdkl i ndex.html dan http / /
:

develqer-android.comlsdk l*,lips*adt.html dengan tampilan


halaman web ditunjukkan pada Gambar 3.Ba dan 3.8b.

36 Pemrograman Smart Phone Menggttnakan SDK Androirl datt ll;tlkttt11 Atrrlrrrrrl 3t


* fts;dl r.:..::::. :-:-'..:- -.:i
g:ffi.#r
2. Jika diunduh installer androld-sdk r08windows. exe,
eksekusi file tersebut (untuk OS windows -proses instalasi harus
#e*ir&8
* iqSIS.- kY *: l:' q menggunakan mode administrator) kemudian klik Next, untuk
memulai proses instalasi (Gambar 3.10).
Eid#Siiffi
{ait&ffi*ffikM

lt: t::- i
Itderp ro llro rtrx!.rd S&l( Ioule
SalrryfiIiud
tlr a*d ia lrrrr e *r:r{fi }r n:.iftry !, *r}#
5{k6
!l rEr*ft! !r! n ;* J;lq orcl*sf+q
(a) (b) *lrr *rbt hrr rr- .* *rr f rwie lq.*.lt
*'Niih &r *ta t&v t,ril-r" F
ri*e:
Gambar 3.8 Tampilan tataran wndan (a) SDK ttan (b) ADT pada websiteAndroid (Sunber :
:,.t*.dbffi
Wtltutt@.android.com)

Berikut beberapa file yang harus diunduh:


a. File android-sdk r0Twindows. zip (Gambar 3.9a) merupakan
file archive zip sDK Manager yang dapat dijalankan tanpa memerlukan !.G]i
proses instalasi. Repositori Android luga menyediakan versi installer .-!:|r .

b"ng"n nama file android-sat-rOgwindows.exe (Cambar orrillallrcait


Eis t lrhr r"E brrtd.d m td i{
3.Sb"). Xedua file tersebut dirancang untuk sistem operasi windows L&
XP, Vista atau 7. Tetapi pada buku ini, penulis hanya membahas untuk qr5-
penggunaan paket alchive tandroid-sdk rOTwindows ' zip)'
Ie!{!#rr*ld:frli*li F ftrlaillilb, r iltlrr {&, rta
!€.att*tr r,6ry fraia, l:l,ilarabui.fp
iradikedua paket tersebut terdapat aplikasi tool-tool dasar SDK Android,
yang belum termasuk package AVD, dokumentasi, dan API Coogle'

I installcr-r$ -rxin dows.ste ffifith

w (a)
6aogle lnc.
0.6.0.c

(b)
f E!'r? fftr*r6&!-*aa€

*.{}$.tsf {e iiN
ltr F*CJe'I r!$
s&C Ir-*,:;lrfi-..-i

!..:r4 ii hr,:] 1, Fd l
Gambar 3.9 (al Fb afiirc dan A) File insaller SDK Manager
Gambar 3.10 Proses lnstalasi menggunakan installer SDK Manager

Untuk paket non installer (android-sdk_r0Twindows . zip)


b. FileADT-0 . g - 9 -zip, yangmerupakan paket plugin sDKAndroid IDE <lekompresikan ke direktori C: \Program Files\Android-
Eclipse versi 3.5 dan versi'3.6 (Helios) dikhususkan untuk SDK tool versi s;clk wj-ndows (meskipun demikian kita mengekstraksi ke lokasi
07, sedangkan pada aplikasi installer versi 08, hanya kompatibel,dengan l.rinnya), direktori ini sebagai referensi untuk proses selanjutnya. .f ika
packageeof-'8.0.0. zip atauADTversiyaitu ADT-B ' 0 ' 1' zip' kitir mcnggunakan SDK versi installer, SDK akan otomatis tersimpan
rli rlireklori (l : \ Program Fi Ies\Android\Android-sdk
w i rrr jr,wr; .

lrr,,l.rl.r,.r ll)l\ ',1)l( Atrrlrrxl rl.rrr Al)l 3!)


3B Pemrograman Smart Phone Menggunakan SDK Android dan Hacktnl: Atttlrtttrl
4. Untuk mempermudah mengakses aplikasi setup SDK (tahap ini tidai<
mutlak diperlukan). Buatlah shortcut file SDK Setup. exe yang
ada di dalam direktori android-sdk-windows pada desktop
window. Dengan meng-klik kanan file SDK Setup. exe, klik copy
(Cambar 3.1 1a), kemudian pada desktop klik kanan pilih paste shortcut
(Cambar 3.1 1b).
jf.j{r, li.y.r::r:: Sry i::f,

lfirEr x
:l r} a}$frs Fa*J
!-C L a6obi Gambar 3.12 Menu SDK manager pada start menu windows 7
It Cr:rt$di**{i|(l.i6
i:l;J!dd-@
ta i.:f, *E
!3: r.; daifbrc
ii: i-] *r{r€ ulL6b-c -r:!:i--:-a.-yi;;-i.,ia:-i- : : ffi sebelum memasuki proses instalasi selanjutnya, diperlukan perubahan
'beserta
al u* konfigurasi view untuk menampilkan nama file ekstensinya
& ijr iroli
ll, ;3 !:rb-d.lw pad_a windows explorer, yang tahapannya ditunjukkan pada Gambar
il ! "t ri*Qfu,r-r6.- 3.13:
o Untuk windows XP, buka windows explorer dengan meng-klik
menu Iools --> Folder Options, sedangkan padi Windows Z,
buka windows explorer, kemudian tekan tombol AL't + f (untuk
membuka menu bar Tools), lalu klik Folder Options.
o Klik Tab View dan hilangkan check-box pada opsi Hide
extensions for known file types.

.*Ioq
[.1ry ldrffi.ldry!_
Dreffito*ffitdrill
rtc
OpE frE Crtq-

Fol*deptiffi*

(b) (c)

|} ll b.rElr.L* r+
Gambar 3.11 Pembuatan shoficut SDK Setup ke desQop Wndows

5. Jalankan Aplikasi SDK Setup melalui shortcut yang telah dibuat


pada desktop. Atau jika Anda menggunakan SDK versi installer klik
Start Menu -+ All Programs -+ Android SDK Tools + SDK Manager
(Cambar 3.12). {hl (c}

Gambar 3.13 Menu Tab windows explorer pada;

(a) windows 7, (b) windows Xp, dan (c) menu Fotder Option

40 Pemrograrnan Smart Phone Menggunakan SDK Android dan Hacktng Android l:i\11 I ll ,l,ll,t.,l ll tl.',1 )h/\rrrJr,,i,l rl,rrrAl )l 41
Market. Diantaranya mendukung pembatasan distribusi untuk aplikasi
lnstalasi Package SDK Android yang terintegrasi dengan server Market dan fungsi obfuscating.
untuk
Setelah instalasi SDK selesai, dilanjutkan tahap. selanjutnyapackage Darl tiap versi package memiliki nama file yang berbeda hal ini
,*gi"t,ri"ti sej umlaf, pr.d8; yang diperlukan' Berikut tipetipe ditujukan untuk kemudahan identifikasi versi paket. Misalnya, untuk
yang-tersed ia pada repositori And roid: package update too/s edisi revision 7 memiliki nama file tool-s
rO?-windows. zi-p dan nama file package Google API versi B
. Android SDK Tools, merupakan package tool dasar
yang secara default
adalah google_apis- B_r0 2 - zrp.
SDK.'.Berisikan
telah ter-instrfl Uieiru ii-include dalam package installer
tool-tooluntukdeve/opingaplikasiAndroid(diantaranyaadb'ddms'
'sqIite3) yang seluruhnya berada di
emulator, .r."J"!f8, Untuk menginstalasi package tersebut, berikut dijabarkan proses-prosesnya:
dalam direktori \toor s'
. Documentation for Android sDK, berisikan dokumentasi manual SDK 1. Jalankan SDK Manager, saat proses starting SDK Setup akan muncul
informasi pop-up window Refresh Sources (Cambar 3.14a) yang otomatis akan
Jalm for*"t html yang diantaranya panduan deve/oping'sederhana' me-refresh list package terbaru yang tersedia ke repositori Android.
package API ata; librri.l,ss, conioh pembuatan
"plif.q:i Developer Jika proses refresh list telah selesai klik C/ose untuk menutup window
Dokumentasi inisr*i dengan versi update pada website jika saat kita membuka aplikasi SDK Manager Android dalam kondisi
dokumentasi tersebut
n"J.ia, nup,ru"iutipi;.^xaroia{om. sel uruh offline, secara otomatis proses fetching list repositori akan gagal).
tersimpan dalam direktori \docs '
.sDKplatformAndroid,packageiniterdiridaribeberapaversi.Masing-
2. Jika tampak pop-up window Choose Package to lnstall yang akan
yang didukung memverifikasi proses pengunduhan atau update package. Proses
masing u"rri ,"*iliki'packas"e class versi API Android update dapat dibatalkan dengan meng-klik button Cancel (Gambar
dan aplikasi urrfitoi dalai] format bytecode (*iar)' dan contoh-
versi API paket' Versi^yang tersedia 3.14b). Atau jika Anda hanya memerlukan instalasi atau update dari
iont"f.l aptikasi Vuniai*t,aikan salah satu package, klik radio button Accept untuk mengunduh atau
diantaranya API'Rn?roid versi 1 '5, 1'6, |ingg3 versi 2'3' Beberapa
Reject untuk mengabaikan pada salah satu package tersebut.
vendor juga merilis package secara terpisah pada repositori-tersendiri'
contohnya sr.tunl'puc[ige etn't"toi untuk pengembangan
aplikasi 3. KIik menu Available Packages pada window SDK Manager untuk
memilih package secara manual akan diunduh dan di-install (Cambar
untuk CalaxY Tab.
3.14c).
. Coogle APt by Coogle /nc, package ini terbagi menjaditeberapa i
versi
4.
net,l,rng tersimpan"pada direktori \ add- on s \ goo g le_aP s - x_ Klik button lnstall Se/ected untuk memulai proses pengunduhan,
selanjutnya akan muncul kembali pop-up window Choose Package to
rxx. Berisi ,t.flr" it,ti *tp" j ava'untuk penerapan API Google
AlD. lnstall, klik /nsta// untuk memulai pengunduhan yang kemudian akan
Maps, yans ,"rv"airf, n difauli im.aqe
liloa$- T:llc,:lili: melakukan proses instalasi secara otomatis (Gambar 3.15a dan 3.15b).
Pacloge rnr Juga
emulator agar dapat menjalankan .net C99Sle Maps'
;;;y;i"6, a"[r.""iJti ia*b"h'n API-Google Maps dan contoh
aplikasi.
. package samples for sDK, package terbagi meniadi .beberapa versi
8. Berisikan source
disesuiikan ai-ngan versi APl,'diantiranya API 7 atau
i"Uih lengkap' Package ini tersimpan pada direktori
contoh-contoft v""ng
\ samPles\android-x'
.UsBDriverPackage,paketiniberisikandrivergenericu.ltu!perangkat
Verizon Droid'
Android yrng pop"rlui aiint'onya HTC T-uo6ile C1'
dan Nexus O"-J-piif.ige ini ditempatkan pada direktori \usb-
,ntrk perangkat dari prod.usen lainnya
o.i.r"., seda,igkan-Jri're,
perangkat
(samsung, so"v,'ic, attl aL"rt"trn dalam-paket pembelian
iti, a"pli diunduh pada masing-masing website'
.MarketLicensing?ackage,packageiniberisikandokumentasiuntuk
implementasi ;:ri ,;l;frtur, *"t[od lisensi aplikasi
Android pada

lrr',l,rl,r',r ll )l'. l,l )l\ Atrrltotrl rl,rrt Al)l 43


Androirl rlatl ll;tr ktttt: Attrltottl
42 Pemrograman Smart Phone Menggunakan SDK
:J
9i-{1*', dFn*
'"!.}'-::rs '':i#s
Ie
Don!!' lp.dqqc i!d!d.
ririiiiinirirunmlrrt lrrrtrm',rTt I i

I
mrrilmmt.UtftilIilrrfllrfliln |ffitr j

o@nnddr{ !C{( F6rfrn &ndod .:, t, rPl ?. rer,*on ?


ir! lr*&{ sax }s& rr t t*&c 2, 1r apl 7, .a*eitr I
lru.aFcC S0r FiErfdn &riBd 2.1, API 7, ft.iffl 2

l&m
t -., ,-*,* --,
I
j
I

(b) Pop'up window yang menampilkan


Gambar 3.14 (a) Pop-up window refresh source lisl
(c) list package di menu Availabte Packages
sejumlah paket yang tersedia pada repositori Android
tdr-dns.
tM,brefi&fee:
I gxk&:t,4rt&4.sl
Setelah pengunduhan selesai, package yang telah
ter-insta// dapat $*..C- l, u e r,,..* r
5. fcelri.rragrn, &Ut.e )

aic"t prb" Menu /nstalied Packages (Cambar 3'15c)' { s&rn*{dnlsr,'mr


At "st'(,Etgr,*r
,i@*Mr!ra6aF k. &ds ;.iM r
* fr&ffib-r 6i !d r
*C..* qt ir tn * k. ti*d *{ !. ffi 1

a' g crk* !*!dt6s !, 'ffi t &.li)


oli i sl*-&r,.n1lu.,l.st

oo*rJ**drg sff lro'.*m Arr&n?j 1 i. *fi i, rlscl is% Efr * ''


-2
.l
" T:*H
t_
[[+.]l
i

,i !!,r .1a:toi.r, a.i {".; i


.i!.4i.1

(c)
Gambar 3.15 (a) proses pengunduhan dan (b) instalasi package tanbahan
(c) daftar package yang telah ter-install

Icrkadang saat proses pengunduhan dapat sering mengalami kegagalan


s.ral kecepatan jaringan lambat atau tidak stabil (Cambar 3.16a). Untuk
rrrr.ngatasinya dapat digunakan beberapa trik berikut ini :
o Aktifkan check box Force https:/l to be fetched using http:// opsi
ini untuk menggunakan protokol non-secure (HTTP)
r, f ikir lorhubung pada jaringan melalui proxy. Masukkan setting

1rr<rxy Pada menu Settings, lP Proxy dan nomor port

44 Pemrograman Smart Phone Menggunakan SDK Android


dan Har:kirtfl Arrrlrorrl
l1l\li I hl.,l,ll,t.,t ll)K.:il)K Arrrhotrl rl,rrr Al)l
#i.,Ll-:_
dr! (corr,1r1*
45
S,r
lritrtttisdf d{r.drffitrtEffi*rt.d Ir*!' tta Ult Fi

rri*xnwll5w3
?*G::,T=r ri.Fiti:'l${e pFtrr sfcxifc*3*tEt6*: q"' ,:.i
r 01 ;r4dlrrds.t,r:: i.i..er --.-re-t
*1. si; i!':

. f,l i. :s{ia*sr:,. 'ilr6 raF <rdd


!#,.J*i.liali ffi !*<r: 1_,r-.r. :

t*rd F*rftirel-rl

**- i ,.,...., " | g*rf&i. Url rgsl

Gambar 3.17 URL repositori SDK Android

Klik icon Add URL pada aplikasi lDMan, masukkan /ink


URI dari package Tree dari window SDK Manager (Gambar
[;6wffi1ry* I tizn.:. t 3.17) menggunakan protokol HTTP, (Cambai:.tg) pada
lrc: Irnk repositori Android : http:/ldl-ssl.google.comlandroidl

1***- repositoryl

1,..: .*- *--'*;"'-*;-': ;"-


i,lll!1**.a.'**r*--::1,,:*'--;'
: f, F ErtE$..-!rrc| Ei. hftt tE!iE9-g...
'F hrrErcQrtl
,i

(b)

Proxy
Gambar 3.16 (a) Pengunduhan packag yang gagal (b) setting disable koneksi HTTPS dan

o Agar saat pengunduhan package SDK yang dapat di-pause dan


di-resume, gunakan metode alternatif berikut ini :
i. Gunakan aplikasi download manager yang memiliki fitur Gambar 3.18 lnput llRL repositori ke aptikasi tDMan

resume download, salah satunya lnternet Download


Manager (tDMan), yang dapat diunduh pada http://www'
inrcrnltdownloadmanager.com. Atau dapat digunakan iv. Saat proses pengunduhan, file temporary tersimpan pada
aplikasi download manager lain yang mendukung resume' subdirektori \temp di
dalam direktoii SDK'Android.
ii. fierikan centang pada check-box dari salah satu package, Kemudian buka direktori \temp menggunakan windows
misalnya package SDK emulator Android 2 '1 API explorer dengan path lengkap,-misalriy-a C: \eroqiam
7 revisior, 2- Selanjutnya klik /nsta// Se/ected untuk tri f es \android-sdk-windows \iemp. Lihat -nama
memulai proses pengunduhan package tersebut (Cambar fik' lerscbut (Gambar 3.19) yaitu androld-_2. t r02_
w i rr,lr,wr; ., ip).
3.17).

rlrtl ll:tr ktttl: Atrrltrrrrl


ItAlt I hr.,l,rl,r,,r Jlth, lil)l( Arrrlrrrrrl rl,rrr Al)l 47
46 Pemrograman smart Phone Menggunakan SDK Androirl
vi. Perlu cjiingat, saat nrembaca nama file dari package, proses
pengunduhan SDK Manager harus tetap berjalan. Saat
. Br{q pengunduhan gagal atau di-cancel otomatis file unduhan
tersebut terhapus.
vii. Setelah proses unduhan pada aplikasi lDMan berjalan,
a**aFra.*t{.tr-i " r.i r
i;]rs f*e.&IFrrr& 45d.1,?rt ri;li barulah pengunduhan package di SDK Manager dibatalkan
(klik button cancelpada window lnstalling Archives).
, s.frdlri
a Piskts.bh viii. Jika pengunduhan pada IDMan telah selesai, kopikan file
a,] tEtnkk hasil unduhan ke direktori \temp yang ada di dalan-r
direktori SDK Android (Cambar 3.20).
I ji;d* rr:iit, ri:rlilr*:
ix. Ulangi kembali tahap nomor (ii) di atas, untuk memilih
t;JSddff package yang sebelumnya akan diunduh (dalam i"ral
i] ''&trt ini android-2.1 r02-windows. zip).
[) lrrgeoEE Proses
i instalasi akan berjalan otomatis setelah SDK Manager
ql ?ktqid.e sukses melakukan pengecekan SHA-1 digest file yang telah
terunduh.

Gambar 3.19 File yang ada di dalam direktori \ temp saat proses wngunduhan Untuk meng-instal/ atau update menggunakan download manager,
ulangi tahap (ii) hingga (ix) menggunakan link repositori yang sama
(tahap iii).
v - T ambahkan nama fi letersebutsebagai referensi pengunduhan Cara ini cukup efektif dan cepat karena saat selama pengunduhan teriadi
menggunakan lDMan sehingga link menjadi http:lld.l-ssl' disconnect dapat di-resume kembali tanpa harus memulai dari awal.
goo[ie. com I an d ro i d I repo s itory I an d roi d-2' 1 -r0 2-w.i ldou.vs' Hingga buku iniditerbitkan metode ini masih dapat dilakukan, kecuali
Tip."femuaian klik OIi untuk mulai mengunduh (Gambar server Coogle sudah tidak mendukung fungsiresumable download.
3.20). ! 6 !.tuasx.idalol&.gq h*",itSffi
i
I
;XWrr;# dr r6,i*'a;c;;.;;d\
'l*..*-r.r*
I r"*fffita-
f &r*4d*xr6{n'ffi?
: :OHldi,.k r.iodtDq, rrlt R!i* !

r# ?', "ls
,r.!& T-
i tD( Ptriod l,rC{id :3 lsll. ffi I
.i rD{fhr6d:1 pt |@a
i SOteEdmA^Ad!-Ol" t t{ ffiI
_
'i. 50( Prdffi l/dEc .].!. Apl 1 t
f.rtfi*t
d' t0ti rtdv6 A.tu ta. St{, |*
'eir : iq5'ddd
i r$il66lMdl5.glJ elsl
$SapttaO<at1mr
,!r-.6*r-mnrn1*t

Gambar 3.21 Sejunlah aplikasiyang telah ter-install pada SDK

\r.tr.l.rh scluruh gr.rckagc yang diperlukan sudah terinstalasi (Gambar


t ,t l)rlil.rrrjrrtk:rr mclakukan instalasi plugin ADT.
Gambar 3.20 Penambahan tink file yang akan diunduh dari repositori

lrnll r kr',l,tl.t,,r ll)K. :il)K Arrrlrorrj rl,rrr Al)l 49


48 _ Pemrograman smart Phonr-. Menggunakan SDK Androtrl rl,rtr ll,rr krrrl: Arrrltotri
URL Repositori Add-on
Untuk package spesifik dari repositori selain Android, atau Coogle, salah
satunya Samsung, Sony Ericsson, Asus, LC. Untuk repositori samsung
yaitu pada URL: hnp://innovator-samsungmobile.comlandroidlrepositoryl
srepository.xml (Gambar 3 -22).Dalam package tersebut terdapat penambahan
sejumlah API yang didesain dan konfigurasi AVD untuk mendukung emulasi
Galaxy Tab.
Untuk menambahkan Ii nk repositori, kl ik men u Av ai I ab I e P ackages, kem ud i an
klik button Add Add-on Site, masukkan link repositori di atas dilanjutkan klik
oK.
Setelah SDK Manager terkoneksi repositori Samsung, kita pilih package yang O6oipti@
akan diinstalasi kemudian klik tnstall Se/ected untuk mulai mengunduh *a rqaqBf E$&*. rfr ed ffi,6 ln[<
of ttre
Ytu M'JFd& i tdw Fr ff *covlE
(Cambar 3.23). Atau dapat juga digunakan Download Manager untuk Oar prd4tfmd.
r*rr9+
mempermudah proses pengunduhan dengan cara yang sama seperti proses
sebelumnya dimulai tahap (ii) hingga (ix).

Gambar 3.23 Link repositori Samsung yang tetah masuk pada listAndroid
sDK Manager

lnstalasi dan Update ADT


This dirloE kir you rddthe lr8l of r nt*rdd-ll{} rite

&n dd-on *c rrn cr*y ptwidc rw r#om or'rNcr' p*ek*gr*' l. lnstalasiADT


Add-cr rftc* crnnot prosi& rtind.rd Aneoid plrdorm{ do*:r cr :amp&u p*chitcs' Agar sDK Android dapat terhubung dengan IDE Eclipse diperlukan file
h:*rtiag r tl8L hcft sfl[ ne{.Sqn ynr to ckm rn of$rirl Andraid tWo*itsry. A?T (y"ng terkompresi zip) sebigai plugin tclipse. Berikut ini
p.r<:kage
la* rlijclaskan tahaptahap proses instalasl ADT:
P+G.ic antcr tfiG UE" o{ thc rryritcry'ntl for thc ldd-an site

httd/inn6rator.**rmurrgrnrobitatonrlerrdmid/r:politory,r:*po*noryttn{
l. Buka Aplikasi IDE-Eclipse, pada menu bar IDE Eclipse klik menu Help
-+ lnstall New Software (Cambar 3.24a).
, rr$

Gambar 3.22 Link LJRLrepsitwi untuk Samsung Galaxy Tab

(a) O)
Gambar 3.24 (a) Menu tnstatasi paket ptugin Ectipse (b) Menu Add ptugin
Site

50 Pemrograman Smart Phone Menggunakan SDK Android dan Hacking Android Lr.,l,rl,r,,r ,l)h, :;l)K Arrrlrrrrrl ri,rrr Al)l
5'l
2. Selanjutnya pada window lnstall klik l.rufir.rn Add (Gambar 3-25), akan d.iperlukan agar Eclipse dapat terhubung dengan tool SDK dan targer
tampak window Add Site (Cambar 3.24b\, untuk memasukkan file device (AVD).
p".Lrg" ADT klik button Archive dengan mengarahkan path pada
iokasi-penempatan file package ADT, yang diikuti dengan meng-klik
oK.
3. Setelah window tertutup berikan centang check box semua aplikasi ;IEu
di dalam developer tools (Cambar 3.25), kemudian klik Next untuk sr6
memulai instalasi. &tc*
i-'. Iri
ta t'aid t.f frd!l!FLrrryrd
te l#an r€dhercFnfit
f h*r.: ffiiLr Ed&ib€rw
! ,.s &.*{b &tqi rar
t le.trE a.aECa r E.aS6tryaPq*
hi.lrf, Cmr'Y
tllr{Hft*
9 tuP*{
?Y*
lle
+i.Em(ril8
}Q

.fr
ts oer*6 -,o.it
El<i' **dJ mn: a ! 9.rDffi2ir{7t}53
El * ***mt*rc{ -r* 0.9.9,'Xrs{8:2i{7$J-1

r .. til]] ;;:;:_:::::::-*.'ii,
1,..
", r. r. .. *___ ;!__r; -*:,::::- *____ : Gambar 3.26 plugin ADT yang telah terinstalasi pada Ectipse
Bfin*frlffqt!*rciri**.oclrr* f $Se.&*.t!*tdtr.dai. . . :
P f*e*tn"r;-in sdo-ldriiddr'
ll. Update ADT
A[)T sangat perlu di-updare karena secara berkara (sekitar 2 hingga 3 bulan)
rl.ri pengembang Android selalu merilis sDK versi terbaru, bIIk package
t,rl, dokumentasi atau package AVD untuk penyesuaian'bertambahnla
v.rsi os Android. Antara.versi-package roo/ dan versi ADT bersifat saling
Gambar 3.25 Plugin ADT yang telah terdeteksi IDE Eclipe
k.lcrgantungan (yaitu waktu rilis harus sama), sehingga update ADT jugl
w.riib dilakukan setelah dilakukan update package tooJ sox Android.

Saat proses instalasi ADT, Eclipse akan melakukan update online- l'.rrl.r proses
.update package ADT tidak meribatkan Aplikasi sDK Android
Untuk menonaktifkan, hilangkan centang check box Contacr all y.rng, diunduh langsung dari server coogle. Ada dua cara untuk
meng-update
update sites during install to find required software. Al)1, yaitu:
4. Setelah ADT berhasil terinstal, selanjutnya akan melakukan proses a- update otomatis, yaitu pada menu Eclipse klik menu Help -+ rnstall
restaft IDE EcliPse. New software -+ masukkan URL: http://dl-ssl.google.com/android/
5. Setelah Eclipse dijalankan, konfigurasikan path SDK Android dengan eclipse/pada rext box Location, (Cambar t.ZZaltali klik OK. Untuk
meng-klik menu bar Window -+ Preferences -+ Android, Klik Browse <:ara ini, PC harus terkoneksi internet melalui protokol HTTps
atau
(Gambar 3.26) untuk masukan path alamat direktori di mana SDK I ITTP.
Android tersimpan (dengan mengacu dari referensi sebelumnya Sctr.lah t<,rhubung server Coogle, akan muncul window lnstall yang
tersimpan pada C: \Program Eiles\Android-sdk rrrr.rr,rrrrpilkan sr:jumlah paket update aplikasi yang tersedia pada
windows),'klik Ol( untuk m-enutup window preferences. Proses ini

Pemrograman Smart Phone Mengllttnakan SDK Android dan llat;krrl11 Androtd Itt',l,rl,r'.r ll )K, 'il )K Arrrirotrl rl,rrr Al)l
52 53
repositori (Cambar 3.27b). Berikan centang semua check box dari
package Developer Taols (update DDMS dan Android Development
fools), kemudian klik Next untuk memulai proses pengunduhan :-;&r!
package dan instalasi otomatis.
',?
^.d*tfi.-*
tutuk8prdbd

El+ax tiirroxJr{}*i
A4 r$*M:EJJr'3s6l].{18

-*--4 tuErElt
i. Et&r&&d-ltl-tu :

(a) (b)

r* [-E]ll-..-.J. q- |
( lambar 3.28 Uninstall plugin ADT di Eclipse menambahkan Menu already installed (b) tist plugin
(a) (b) Eclipse

Gambar 3.27 ll@ate ontine ADT (a) link URL (b) rywnlah aplikasi yang tusedia di repsitori

Konfigurasi Variabel Environment Windows Xp dan 7


Proses update DDMS dan ADT diharuskan secara bersamaan karena l'r.'.r's tcrakhir dari instalasi yaitu memasukkan beberapa path variabel
dari dokumentasi manual SDK Android (httpy'/developer-android. ,'rrvrr.)rrnrent mengacu pada path direktori aplikasi JDK dan direktori tool
com) bahwa setiap versi DDMS dan ADT terdapat saling bergantung ',1 tk Arrrlro.id yang sudah ter-install.
Agar user dapat mengeksekusi aplikasi
dengan satu versi. ,,r ,,,,l.rrrabel (*.exe atau *.bat) yang ada di dalam direktori bin Java
b. Uninstall manual, cara update ini user diharuskan meng-uninstall r,lr,rrr,rr.lnya ;avaw, javac, iar, dll.) dan direktori toor SDK Andioid
lebih dahulu versiADT sebelumnya secara manual. t r,ll,, rldms, dll.) dari direktori dan drive mana pun menggunakan command
l,r,,rrl)1. Berikut rincian environment pada masukan path variable windows
c. Cara uninstall plugin secara manual yaitu dengan meng-klik Help -+ \l'rl,trr windows 7:
lnstall New Software -+ klik link already installed (Cambar 3.28a) -r
klik tab lnstalled Software + pilih nama plugin yang akan di-uninsall c; Untuk Windows XP, klik menu Control panel -+ System
(Android DDMS dan Android Development tools) + klik bufton -+ pilih tab Advanced -+ klik Environment vaiiabtes
Properties
Uninstall (Cambar 3.28b). -+ klik variabel Path yangada pada tabel System Variables untuk
sete lah un i nstal I selesai, ADT versi terbaru dapat d i und u h dari website menambahkan path (Cambar 3.29a dan b).
developer Android (Sumber : http:/ldeveloper-android.comlsdU
ecl ipse-adt-html). Proses instalasi instal I ADT terbaru menggunakan
cara yang sama pada bab sebelumnya.

54 Pemrograman smart Phone Menggunakan SDK Android tl;rrr ll,rt ktttli Atrritotti l lAl l 1 ln,,l,rl,r,,r ll tK, lil )K Arrrlrorrl rl,rrr AI) l 55
W*l;'.,i, eFh&$* . -rtirt*** tffis'
q,a*..tu I llrhe{+da. :fub ,* +.-- bG b
F.nrda I xa** r** | tixi*r
'!ukbr.rrrrb&rEd.dt'b&S i
ftu lW ba qgj*d ts E* "rilfi?e&*, e a,A*$ena l
4..drr o-xrmt m .o dtu.* l

i ih*drr*r-qffirdrC*B {ry!c?"rt*;*t I
i
f*traJ
I
,-+ lij -*!r,@*&Bgq-
,,' ,*-..'
I
u{l,r.t - -
; Saaapo*Bill*{qo5ltogn
I i
.t 1&l*.pks*f*d,e,
-, Enff (Wjg{, uI. (X} !Sj:.{ .&
Frqe,r
..!iE'.1 TtF+EP' sti4.'*rriry9 ra.tu

!aE!i: . r"r. ir . qt.., _,


, q+r
i ,r., ,ailr,, Il
r-5Jsl-!:
'rttfa,il "...
!'I tadPt-F j

*Bii*i**rf.!q!r I a*r.iF*r I ,*. {Itim;teecff*filx* ;},


rry ll .e?, I p&4 t Gambar 3.31 System properties pada windows 7
o* | ir*, I ,':-:r I , $,r,.:....1 .. *"'* I setelah window Edit system Variable terlihat pada windows xp
(Gambar 3.32a) atau Windows 7 (Cambar 3.32b), tambahkan path
(b)
lokasi direktori tools dan platform-too]s dari sDK Android
dan. path bin aplikasi JDK. Masing-masing penulisannya diawali
Gambar 3.29 lnput Variable path (a) tool SDKAndroid dan (b) bin JDK diWindows XP
llrakter;_(titik-koma), dengan mengacu dari lokasi path defaultJDK dan
sDK Android sebelumnya penulisan path secara lengkap dituliisebagai
lrcrikut:
o Untuk Windows 7: Klik Start Menu -+ Control Panel --> klik
kanan pada Computer -) klik Properties. Kemudian klik ( : \l)rogram Files\Java\ jdk1. 6.0_22\bin; C: \program
Advanced system settings. I r I r,:;\android-sdk-windows\tools;C: \program Files \
r rr I r oi d-sdk-windows
. r
\ platform-too1s
OIr ffi.*o lbrlu d_iingat path direktori yang telah ada dari konfigurasi sebelumnya
tl Megr tidak diperbolehkan dihapus. Karena path tersebul telah digunakan
(crdruf Satd H.fl
f.!.p trffit dsL-.
\trs,u lclrtr intnrmai.,r,n ;irr untuk konfigurasi aplikasi lain.
0dc{aad n6*4* tlr*r.- lt &r,{{tlrn.q(r {lrnde,r.dili*
{ 5h*
"n
fttBf *: &m.!t{ e{ttraqa *jinj+*: I Fr;i*rrnrl
&:ruor *l 1tel $ril{{ha* CcF,{rSht a. :m l.ti.r':cll il 9r*!E: F.th
F Ef.ai! + drJHd rrgcn ?r'.c" ':.r -.r...i 1.1"
l{tloay*r! r.5.(-??b.rit:\nffi*&*taarfmt

Gambar 3.30 Contrll Panel Windows 7


fTf*::,c',"t-l
(b)

Setelah window System Properties terbuka, klik tab Advanced -> (iambar 3-32 wtndow Edit System variable pada (a)
wndows Xp dan (b) windows Z
klik Environm ent Variables -+ lihat tabel system variables, kemudian
pilih variable Path. Untuk membuka window path klik button Edit.
-oo0oo-

56 Pemrograman Smart Phone Menggunakan SDK Androttl tt;ttt ll,tt ktttl' Attrlrotrl lt'.l,rl,r,,r ,l)K, :;l)K Arrrlrorrl rl,rrr Al)l 5t
lnstalasi Kies dan Konfigurasi
Perangkat Android

'',,t,,1, rlr selesar menginstalasi sejumlah aplikasi yang dibutuhkan untuk


,1, \'(.t,1)in!t aplikasi Android. Selanjutnya bab ini dijelaskan tahap instalasi
,tr\,,r t)(,r(urgkat Android pada PC. Pada topik ini, proses instalasi difokuskan
,n,rui. t)('r.u)likal Androici yang digunakan penulis yaitu -Samsung Calaxy 5,
,,,,r1,.ur \rsr(rm ot)erasi Anclroid versi 2.1/Eciair yang juga mendukung fitur
'r'.'r.r(lr.r.i(,v(,15: )..)./Froyo. Unlukprodukdari SamsunglainnyayangLrerbasis
\r,trr)ri, sr'ltcrli Caiaxy Spica, Calaxy i5510, atau Calaxy S memiliki cara
rrr'.t,rl.r,'r ),,rtrg hanrpir sama karena umumnya produk keluaran dari Samsung
,,,,'rrr,.rirur,rk.rrr .rplikasi Phone Manager Kies. Sedangkan untuk produk dari
,r,'rf 1,q11111y.r, kitarlapat rnenrbaca manual krook, atau file pdf yangdisertakan.
\r.rrrrl,rp,rl rrrcnlirrntlrrlr dari website perangkat mobile milik kita.
Dalam menginstalasi Software Kies diperlukan sejumlah aplikasi dasar yang Mic rosoft .N ET Fra mework 3.5
harus diunduh, atau untuk lebih mudah dapat digunakan file.file installer yang
disertakan dalam suplemen buku ini. Saat proses instalasi aplikasi Eclipse,
DDMS, ADB, dan Emulator harus di non-aktifkan. tlriel D*s.cription On this pagq
q:' je:i .tq1F6qd*i ?.:.sly* ml,r,q.,, rr,rxxhAi,.rl
i1.i:-r..,!rr .lq1.l, .tdi ; I r.j .,.1, v! {i:L!H t{. Sr1!, ! lliisllr
lnstalasi Plugin, Runtime, dan NET Framework j, r.r,, I i 1.0"rs
t(r\*( $*t ! c...d .f€.i I" 6qsg l.? FQ. B:i ll.rtrr:!L!t
3y! t5r!!..&!$!alIJii!!t!il*
Bagi pengguna OS Windows XP versi SP2 atau SP3 diperiukan sejumlah I!r-tj],:.!!ar}
aplikasi yang harus di-instalasikan berupa plugin, runtime, dan framework *tlrrrd ftg;nls11t*
. 11b*t_Sul$l}_A.r
agar aplikasi Kies dapat berjalan. Bagi pengguna Windows 7 versi Prot-essionai
etrrr,ls.edtll
maupun Ultimate tidak memerlukan aplikasi plugin dan runtime karena
secara default sistem operasi telah meng-update dan meng-include package- I lt llorrrr.
9re
package runtime Windows Media Format 11 cian Framework.NET versi 3.5
dan 4 yang diperlukan Kies. Meskipun Windows XP SP3 merupakan versi
'tur *rr lrr*ist art E=
update terbaru, disarankan tetap menginstalasikan sejumlah package aplikasi Qurr k O.,t.(ri
tersebut agar Kies dapat berjalan. Berikut proses instalasinya:
1. Unduh aplikasi Windows lnstaller 3.1 Redistributable (v2), yang
i-.:cr':!4:
dapat diperoleh gratis pada URL: http:llwww.microsoft.coml :

downloads/enldetails.aspx?f amilyid : 889482f c- 5f 5 6-4a38-b8 3B-


cle776{d4lj9c&displaylang:en dengan memilih link Windows
I n stal le r- KB 89 3 B0 3-v 2-xB6 (Cambar,l. 1 ), yan g beruku ran 2, 5 M B. (a)

WrxJorqs lnda,ller 3,1 Redrstnbtrtable lyli


iulBcffir.&t p.ch.
** r tr rr' hi" E rqt ibj't*r
\&.*r*i@ridr
s96-* re,};,Ifft* "
*.*idr*t;r*, ryrn!:e3B* :.:
16r&Bf.'*
(b)
,kiibh*M

Gambar 4.2 (a) website unduhan Microsoft .NET Franewwk


3.5 (b) link fullpackage (sumber ;

frtsrr8 http ttl,vww. miaosoft com)


.

nfiiffin
rei&tr
-#* Unduh. aplikasi installer windows Media Format r 1 Runtime, yang
(+*-&
dapat diperoleh secara gratis pada uxt: http:l/ii*.aiotniirii.lo*t
w i n d ows-m ed i a-fo r m at- t t -ru ntim* t 68 60 t .'htm
memiliki ukuran file sebesar 7,71 MB.
p;k"i' li.i- i n i l. i;;
Gambar 4.1 Halanan web unduhan Windows lnstailer 3.7 vZ (Sumber ; http //wwvt.microsoft.com)

2. Selanjutnya unduh paket instalier Fuil Redistributable Package


Microsoft .NET Framework 3.5, pada iink: www.microsoft.coml
downloadslen/details.aspx?Familyld: 33 3 325f d-ae5 )-4e3 5-b531-
508d977d32a6&displaylang: en (Cambar 4.2). Aplikasi installer ini
memiliki ukuran file 197,1 1 MB.

60 Pemrograman Smart Phone Menggunakan SDK Andrord d;rn ll,rr kur1l Antlrord liAlJ 4 ln.,talasr Kre,; darr Konfrgurar;r [,erangkat AndrorrJ
61
-,f' Windows A{ dla format ! 1 Runtlme 11 .iiB[ rra.nrsrork
rr r! t {(8.* drrb&d** ry! dS&ffi eaa
r -r ts k. ?',.xs h!*e.y-kr" a:-t.t *l-*
ptrcRosofTsorrwAEtsupptfl,tti{TAL d
trEglmtcad (7.7:Fi?l lrcExs€ rERHi i
c
I

'-frr+k.qirmk J:E:-l
n esit i.-Y.a!Ld,I-q"3lsrd*$g$s,J.siJ{"rc.tli$-g:istx '. ri**rt..!j!nrr{i!.4!n,;niril**l
i,

rirrnsF kEE/a.hrqt#.
^! i}tirl
Lart Updrtd. 2010-OS'1?
I h:.r*.Nr. *'@Bttirir*or+ lerel rtd,irr mrrlq *t+frfr.F
Ll€cnrc: frt:sart fl;g '- -.EXr-
(}6: lYindafr Vi5t , 2$03, xP. :000 H?rk t*
.*-tr!,r{B& a!rr;rl**d-
Requl.cmcntJ: iao caio6l requi.amcnts
Publa{r.r I:l{*gc* t*rs'ar' t'r I-r.... lTtu 1
K,F*l IffiFru
Noncprtc: *:1$"i:*5*':XS:qrAq.tts)
Tclnl Dornloads f rofir 2OQ8-o9- tO: 9,277 Gambar 4.5 Gambar-gambar proses instalasi Microsoft .NET Framework 3.5
oottrlo.ds ol t!*t rrctlL r09

Pada instalasi Microsoft .NET Framework 3.5, pilih radio button I Have
Gambar 4.3 Halaman unduhan Windows Media Fornat 11 Runtine
Read and ACCEPT dan kosongkan check box send information about
.... Kemudian klik lnsrall. Setelah selesai, pilih Restart Now. Setelah
restart selesai, tahap terakhir yaitu install Windows Media Format I1
4. Setelah paket installer di atas telah terunduh atau menggunakan file Runtime.
suplemen buku ini, selanjutnya install aplikasi berikut secara berurutan
yritu , windows installer 3./, kemudian Microsoft.NET Framework
3.5, dan Windows Media Format / 1 Runtime.

i:t :rg r::+i l: rrgl L-a i:,i-:.:t:r! a*1a& €u.


@"'tr,-d
'-n, v- _tl}r
j{Lr Windows irledia Fornrat ll
runtinre
k*Hlh im@flim<G
&d.:dH@
a
Jrr@
Itc4r-?ftGffiNa-
I
l@nr' +arisat!Y h&-4,,4
l.*.ssrrqffh**._Fu
ir.*:n r* ,ffi( ga *-'rt 8d;e !*; r,::alt lhr *rd8e sc e:rc{ l-ff ik
l_: &;a r:#e*aFi d -*rh lr.
loSEl* 4ir(s#ryu#
irbFuk_Gbd !.!t . - Bax ug l*Jr +€ffi
l(-a'Ef ,ic*ettlrmg6
.. ;,.rr d.r h I
-v+ r*,r! ed
'!a e*aC yry slxpi:s
dir ir+ a.rs*e
!k sJSt ll smrru. dcit lia.l
,x [ .,1t'l *f t .. -'"-l-:*J*;J
Gambar 4.4 Gambar'gambar prlses instalasi windows installer 3.1

Saat instalasi windows installer 3.1 klik t Agree kemudian klik Next, ,!rq *

terakhir klik Conrinue. Setelah selesai, klik Finish selanjutnya lakukan Gambar 4.6 lnstalasi Windows Media Format ll Runtine
restart Windows.

llAli 4 Lr,,l,rl,r,,r hrr',, ri,rrr Korrftlirrr;rsr lhr;trr11k;rl Arrrlrorrl 63


62 Pemrograman smart Phone Menggunakan SDK Androrrl tlirtt ll,rr krtrli Attriroid
l.)rrluk nremulai instalasi windows Media Format 11 klik btrtton Next,
yang secara otomatis akan meng-update runtime windows Media pada f,iu l*stnller
winliows XP SP2 atau SP3 seba-eai s.varat )'ang c'iibtrtuhkan aplikasi l(ics'
proses instalasi ini akan seiesai setelah rne,restart lvindows. i.!i r..-* i.::o'

il3-l0l-l cxt
lfteE \* 1-':'r:*:ir
lnstalasi Kies t.r es
-l 5-3 J 0i "

',: #i'':
Kies adaial-i software lool Pilr'rl're '\,ianaget ':iiilurrak;,rrr r-trrirli'' ttleilr t'tnsfer
"l
:

iii"-nr1",tti*uriia dan file phonebook iforniat '.'c;r:.ti)' ii'iclali-ri liies, rrerangkat {#r """"- ;

,inatnia clapat difungsikan sebag;r U'Sll rerlr.rirtr; n:trri;it1i di;ti-rtlt t-''odem' (a) (b)
Kies irerlir riiirrstall karena ruea {iirjai.riltitv.:,:iilcl'tak;n iir:'tal.:isi driver
p,,rungL,U Ai'ir.lroicl yang dibrrtrrnkan clt-h lillii '\vrijirliri ',g..ll-ri'rr:at r"rrendeteksi Gambar 4.8 (a) icon aplikasi Kies (b) Menu installer Kies
Con t,'rt..1ui,i-,ng ke perangkat tr.:r::ebut ,113iai;-ri ,,i-JIl '.i;in :iilK ,'rndi"<;itl.
l. Ljnr.Juh aplikasi 5At#5LfJC lties ii{- lr..'ne ,:i,,rit {irljn-slal/ o/oSrJnl
Pilih negara dan bahasa lndonesia (Cambar 4.9a), klik Berikutnya.
pada i-iRL: hrrp:i,/rnr,--san,.5rJrt;lri.;r.;l-.,i.ri:.r.::r1,.":1.11r11rr;i,1s1t;itt'air'r;t;rittt;t/.r-l Selanjutnya centang check box Saya setuiu dengan persyaratan dan
-soltw,art.oJo?ph<srte .1;,r)dai,.. L,i,i
rii,iJ ,{.r.irlri:.ir '1 J) aiatr qittrak;lrt
ilii<ii ini. ,\plik;.isi lir;irrstall ketentuan di atas, kemudian klik Berikutnya (Cambar 4.9b).
insta!ie,r 1,ang disertakan daiani :ul,.i.,rrq,il
(iiirigai, se[rilikni'.r f ili-'
lrr()rir;;irr'adJah p!'ogr.int ,-rriirt:1.rii :r',:lutr'. irpriti
!l i.,!-i!,.i t :(l r.l h K ies verr, i tt' r'ir.l rtl.
r

s
@
\,.
+
,il.i
{I

1l

ap+luJFr +i;.zq'i{ -atF-"{L:ry bfs r?f*tr


?.ffi ffih !!icl iry FC-!ti?,af EffirV..ftiw€1?tI
[{a rh .li *rs*,.{ t..n,r til * b, bftd L* .. y erita
l! Aor r!:{11 t I L{(i }fi .l;w,4d, *F d:f rak lits trF .B-*ps{t
fr ,rt?r rllr r-]l.!.i !!?F{ I
4#rF.dS|....rG-i*sd

iI
tfr *.:*..t&.h:fs d,6 *BH :ll&,gt A +iA ad} d *IYd
- rund*7 aJ r.
-469i€ rltr r33 rff t&rlB7r4
$*P *J$'d! Sall*g* {. BS ,& *+ f., iG +*!a rJ
1e 4,a s ffi i-rr!l$,v 8r. r ry *,ts I
Gambar 4.7 Halaman web unduhan aplikasi Kies dan gqram uninstail (sumber : htlpl/
/ :*r.q-l .r t: .F-iF
-y!r
+ wr at
-rlEw, :C
J
my.samsungmfrile.can)

) setelah kedua aplikasi telah terunduh, jalankan Kies_1.5.3.10103_


1 02 .exe (Cambar 4.Ba), klik bufton Kies lnstall (Cambar 4'8b)'
-1
Gambar 4.9 Prlses inslalasi Kies nal (a) pemilihan bahan (b) lokasi direkori instalasi

64 Pemrograman Smart Phone ifunggunakan SDK Android dan ll,rt kttrtl Atttlrottl llAlt 4 lrr,,l,rl,r.,r Krr,,, rl.rrr Krrrrfi,lrrr;r.;r Ilrrarrllk;rt Arrdrorrl 65
4. Klik radio button lnstal semua (Gambar 4.10a), kemudian klik taskbar Windows XP (Cambar 4.12a) atau Windows 7. Setelah instalasi
Berikutnya. Setelah instalasi berhasil, klik button Se/esai berikan selesai, akan tampak icon perangkat CT-|5503 di sebelah kanan atas
centang kedua check box pada Gambar4.10b, kemudian Kies otomatis aplikasi Kies (Cambar 4.12b).
aktif (Cambar 4.11).

.--!__.e-

i; f*rdx* Hardxro

F F.{i* r*tn ! (a) (b)

Gambar 4.12 (a) lnstalasi driver Android Samsung (b) lcon perangkat Android GT-|SS\3 pada Kies
a **a*r:rdEtluj{t*

'd
il
Driver samsung cr-15503 yang ter-insta// dapat dirihat pada window
Dgv]ce Manager. Beberapa device yang tampak adalah: Composite
ADB lnterface, Card r,)SB Device, IJSB Modem, Diagnostic seria.l port,
(a) (b) dan USB Composite Device (Gambar4.'t3).
:. llt FC*- r*
Gambar 4.10 (a) Radio buAon pilihan instalasi (b) check box shortcut dan nenjalankan Aplikasi
a;{s5Etlr*ffi
Kies ll t$i$.r€ *r*ad er.:GL 106 L&rfre
i: 5| C*,rr**
a {* er*{r$cit
{.i E$?*Jri6 6'I-11103 ird us8 5a€
{* !i/o*8*rAx,8a'7r*
r, r{s(
"ttc r*p{ass48,}res
e t ogcrrc*rtlr
,{ .} 0!O,flr'{*l{f}re{
* ffiHp.6*mrt*rr
..
r e
D€ ATr{A?rF{ coredatr
.L(rytE rb
t ") tt !rd r6craoaol hrran
'--
lrl t*tao-'
* l, 1*r"rt*tdugstb&
Gambar 4.'13 Window Device Manager

\,rat perangkat Android digunakan untuk debugging dan kompilasi, aplikasi


Krr'-sdan Tray Kies harus dimatikan, yaitu dengin meng-klik kanan raskbar
/r on Il[ hilangkan centang Auto start Kies TrayAgent, dan auto start Kies
(( iambar4.'14). Kies harus dinonaktifkan untuk menghindariterjadi
Gambar 4.11 Aplikasi Samsung Kies disconnect
Al)B karena saat Kies dan Tray Kies dapat terjadi konflik dengan ADB.
5. Lakukan konfigurasi perangkat android yang dijabarkan pada sub-bab
Konfigurasi Perangkat Android. kemudian hubungkan ke komputer
host, secara otomatis akan meng-instalasi driver perangkat Samsung di

66 Pemrograman Smart Phone Menggunakan SDK Andnitl rl,ttt ll,x krrrt: Arrrlrotd IJAIJ 4 lrr,,l;rl;r,;r Krr',, rl;rrr Korrfrllrtr;r:,r [\rr;rlr11k;rt Arr<lrord 67
2. Untuk mengaktifkan instalasi aplikasi (ApK) melalui kartu memori
Start Ks microSD dengan cara buka menu Applications -+ centang check-box
Unknown source (Cambar 4.16a dan b). Aplikasi ApK harus tersimpan
di kartu memori microSD.
Auto :tart Kier TrryAgent
Arto Sart lfts
tborrt rcctlruyfgrcna.-

&ir

Gambr 4.1{ Menu trayAgent Kies

Konfigurasi Smartphone Android


Konfigurasi diperlukan agar perangkat Android dapat melakukan proses A5rpliratronr
debugging dan mengunggah aplikasi hasil kompilasi dari IDE Eclipse. Berikut
rincian konfigurasinya:
1. Untuk mengubah setting ke bahasa Inggris Amerika, masuk ke menu
Setting --> Language & keyboard -+ Se/ect /ocale -+ English (United (a) (b)
States) (Cambar 4.15a dan 4.15b).
Gambar 4.16 (a) lcon nenu Applications (b) Check box unknown sources

t. Perangkat Android juga diperlukan konfigurasi agar dapat terkoneksi


dengan ADB, DDMS, dan IDE Eclipse yaitu buka menu Settirrg_r -->
Applications --> Developrnenf -) berikan centang LJSB Debugging
(cambar 4.16) setting ini sangat diperlukan karena perangkat andioici
Englmh (Unir*d Stafe:i
tidak otomatis terhubung ke ADB seperti Emulator AVD.

(a) (b)

Gambar 4.15 (a) lcon menu Settings (b) menu pilihan bahasa

68 Pemrograman Smart Phone Menggunakan SDK Androttl rl,ttt ll,tr ktttli Antltotd lrr'.l,rl,r',r Krr,,, rl.rn KonhJirrr;r:,r lkrrarrllkal Arxlrorrl 69
Dasa r-dasa r S DK Android

Gambar 4.17 Sefiing llSB Debugging pada perangkat Android

4. Saat kita menghubungkan perangkat Android ke komputer host


gunakan kabel USB Android dan Kies dalam keadaan aktif, yang akan
tampak menu Setting USB, untuk fungsi debugging dan developing
aplikasi pilih Kies. Sedangkan opsi mode UMS mode only hanya
berfungsi untuk mentransfer data dari komputer host ke kartu memori
SDCard.

['J ula r.rrurr**

Android Virtual Device (AVD)


AVD merupakan kumpulan file konfigurasi dan image.image yang merupakan
representasi dari sistem operasi Android. sebelum kiti mem6uat project
aplikasi Android atau menjalankan aprikasi Emulator, terlebih Jihulu nvD
harus dibua! ygng disestraikan delgan versi Apr pada projeci-yang
akan
digunakan. Pada Tabel 5.1 ditunjukkan beberapa jenls Avo yang tersedia
dengan dukungan versi Apl yang bervariasi.

Gambar 4.18 tlenu Sefiing USB pada perangkat Android Sansung

ooOoo-

70 - Pemrograman Smart Phone Menggunakan SDK Androttl rl,ttt ll,rr kttt1l Attriroid
Tabel 5.'l Versi versi AVD yang tadia pada SDK Aldroid Revision: 3
Tipe Platform AVD Keteranga.n
Skins: QVGA-P, QVGA-L, HVGA-P, HVGA-L,
Android 2.3 API Android versi 9, tanpa API Coogle HVGA (default)
Android 2.2 API Android versi B, tanpa API Coogle id: 2 or "Google Inc.:Google ApIs:3,,
Android 2.1 API Android versi 7, tanpa API Google Name: Google ApIs
Android 2.0. API Android versi 6, tanpa API Coogle
1
Type: Add-On
Android 2.0 API Android versi 5, tanpa API Coogle
.l
API Android versi 4, tanpa API Google
Vendor: Google Inc.
Android .6
Android 1.5 API Android versi 3, tanpa API Coogle Revision: 3
Android + Coogle API f; Mendukung Android versi 2.0.1 & API Coogle Maps versi 6 Description: Android + 6eeg1e ApIs
Android + Coogle API 7 Mendukung Android versi 2.1 & API Coogle fr4aps versi 7 Based on Android 1.5 (ApI 1eve1 3)
Android + Cooele API B Mendukung Android versi 2.2 & API Coogle Maps versi B
Libraries:
* com.google.android.maps (maps. jar)
Contohnya, saat kita memutuskan untuk membuat aplikasi Android yang APf for Google Maps
menerapkan API Google Maps untuk Android versi 2..1 maka target AVD
yang harus digunakan coogle API Level 7. sedangkan jika aplikasi yang akan Skins: QVGA-P, HVGA (default), HVGA-L,
dibuat tanpa API Google Maps untuk API versi 2.2 dapat digunakan AVD QVGA-L, HVGA_P
Android versi 2.2. i-d: 3 or ..android-4,,
Name: Androi-d 1.6
Proses Pembuatan AVD Type: Platform
Proses pembuatan AVD dapat menggunakan beberapa cara, baik
API level: 4
menggunakan aplikasi text based (pada command prompt) atau CUl, berikut
penjabarannya: Revislon: 2
1. Cunakan perintah android untuk membuat, mengedit, menghapus Sklns: WVGAB54, WVGA800, eVGA, HVGA
AVD pada lingkungan command prompt. Berikut adalah contoh ( def auJ-t )

penul isan perintahnya:

androld action IoPsr action] - Perintah create, delete, dan update untuk membuat,
menghapus atau meng-update RVO dengan menambah
Rincian untuk opsi-opsi action yaitu: beberapa opsi AVD, berikut contoh tampilan kEluarannya,
- list target, untuk menampilkan daftar package API yang
tersedia (dapat ditambah dengan meng-update package SDK)'
Berikut ini adaiah keluaran dari perintah list target: tj:\)android create avd -t 1O -n GoogleFroyo
Available Android targets: t rr:;it_ed AVD ' GoogleFroyo, based on Google ApIs (Googte
ici: 1 or "android-3" Irrr:. ) ,
Name: Android 1-5 w i t Ir I irc following hardware config:
Type: Platform lrw. I c:rl. <lcnsiLy:l gQ
API level: 3

72 -Pemrograman Srnart Phone Menggunakan SIX furrkrxtl tl;ttr ll,tr krrrtl Atrrlrottl ItAll lr l);r,,,rr rl,r,,,rr lil)K Arrrtrorrl
/3
pada opsi -t 10 adalah sasaran versi API pada AVD yang
dibuat, dengan integer adalah diketahui dari perintah list-
Larget yang akan dibuat mengacu dari daftar API (ditunjukkan
dari perintah android f ist target,) dan opsi "-n
Googletrroyo" merupakan nama untuk AVD, yang dapat
ditentukan secara bebas.

List avd, untuk menampilkan AVD yang telah dibuat


Tampi lan kel uarannya yaitu:

Avail-able Androld Vlrtual Devices:


Name: GoogleAPIT Gambar 5.'t ListAVD pada SDK Manager

Path: C:\Documents and Settings\user\.androj-d\avd\


Setelah tampak window Create new AVD, tulis nama AVD di
API 7 . avd text box Name, misalnya "CoogleApl7". pilih Target versi Apl
Target: Google APIs (Google lnc-) yang akan digunakan, misalnya Coogle Apl Level 7-(ditunjukkan
Based on Android 2-7 (API level 7) pada Cambar 5.2).
Masukkan nilai size untuk kapasitas memori SDcard pada AVD
Skin: HVGA
dengan batas minimal 9 MB. Untuk opsi Skin, pilih niiai default.
Sdcard: 12 0M
x0
:

Name: Froyo
Path: C:\Documents and Settings\user\.androj-d\avd\
Froyo. avd
Target: Android 2.2 (API leve1 8)
Skin: HVGA
Sdcard: 72Yl {m -.- -_J..-_] .-f\r i

l-_-.i
Penulis sarankan untuk tidak membuat AVD dengan perintah
text base ini, kecuali bagi yang sudah terbiasa.

2. Menggunakan SDK Android, aplikasi GtJl SDK Android yang


pengaturan konfigurasi AVD lebih mudah. Juga ada opsi yang tidak l:*fl :,'r- l

tersedia pada perintah berbasis teks. Berikut rincian pembuatan AVD


menggunakan SDK Android: Gambar 5.2 Menu konfigurasiAVD

' L.lntuk mr:nambah emulasi dukungan perangkat tambahan pada


Melalui menu SDK Android, pilih Virtual Devices -+ klik New. AVD, klik bu(tctn New..., tambahkan seluruh opsi yang ada
rlon13,rn mcng-klik OK (Gambar 5.3).

74 femrograman Smart Phone Menggunakan SDK Andrrlttl tl,ttt ll,rr ktttli Arrrlrorri liAll rr l),r,,,rr rl,r,,,rr li[)K Arrrlrrrrrl
75
rei,fili'r'ilt AVD yang telah terbuat akan tampak dalam tabel AVD di aplikasi
o*t,ffi3 re:, '. .:' I|j I
SDK (Cambar 5.5).
r€ry
k&r &*i kti! reietx,i&dirlr'5 f,.,i lror t!*t l

^ettAf: YIal+)t fr te{. lf 1 -' ,, r


[+Ji**I .l-4[!re AP:s (Coo,!e tn:.r l-3
lqIryr"| ,!-r*-.;]
ret:X*:rl !"t
i' -" "*r
*o.wffiI rcai',t
-_ ;t
xl i _ _..J
llrr boo€fi *ct Flt
&6m!o{L l;!&r!*r {q * rt *dep* { dr 4$i}- 1;6r: b?9*rt Gambar 5.5 AVD \erah seresai dibuat, ditampitkan pada window sDK Manaoet
B.rd&ttfi: fYiE r-s rrE dc,** ry drr ar*is

f:tr"-l--sJ *l - Perlr,r cliketahui, ernulasi pe:.angkat tambahan dari z\\zD tidak


I, " Y" :rY., I

reili..', W'...., x:
:;epen u h nya dapat nrengem u iasi kan perangkat keras. cor.rtoh nya
kamera, jika Kita ingin mengembangkan aplikasirang mengakses
tac*rr6 ffiI *g**. ffiI
karnera maka tetap diperlukan Android fisik.
].ff' w(c*
:ri* sleli
.-!a3{fi1&rr: *l-\€Ss tre dalt: :x: r.ri rn r Lgilgf .
@: t!'r @n Ff p'ifxli *3t s k cr€.. *.qi,*"s. Emulator Android

f --r-'..I c*"* I | 5ll- l=J I r,-,ulatt,rr Android nremiliki karakteristik


",rr.iroicl, iiall 1,.rng hampir sama dengan perangkat
r'rnulatrlr hanya mendukung satu vr:rsi Apl, rjist sriliik.in ,{i,r1gan
i',;rrfigr-ri'.tsi AVD yang telah dibuat (Cambar 5.6). EmLilator mt.ri,",,,si:.tikiln
rliln11an vcrsi API dari dapat pula menjalankan beberapa ernulat,r,
Gambar 5.3 Sejumlah rnenu hardware tanbahan pada AVD ,,"r,0r.,
lrr:rsamaan, baik menggunakan versi Apl yang sama atau berbeda. Tetapi,
karena Emulator membutuhkan memori dan resource prosessor yang besai
- Nilai default tiap kolom Value pada Property dapat diubah <Jisarankan tidak menjalankan Emulator lebih dari satu.
sesuai keinginan- Setelah kolom Hardware Property seluruhnya
terisi, klik Create AVD yang akan tampak window result dan
pada tabel Hardware (Cambar 5.4a).

i
i
Fi+xf,,
I
j
.1

!r,
te,
,u
ls
16
16 F==ffi1
,U

{a} b)
Garbr 5.4 (a) TaM lN lwrdvnre prryrtyAvD A) Window informasi konfigurasi AVD

llAll fr l),r,,,rr rl;r,,.r lil)K Arxlrrlrrl


76 Pemrograman Smart Phone Menggunakan SDK Androtrl rl,rrr ll,rr hrrrl: Arrrlrorrl 77
Kontrol fmulator Tombol Keyboard
Tombol memperkecil volume audio Keypad " +" atau Ctrl + F6
Ubah posisi orientasi (portraiV
Keypad 7 I 9 I Ctrl-F11 I CtrlFl2
landscape)
On-off iaringan seluler F8
Tombol kode profiling (diaktifkan
F9
menggunakan opsi startup -trace)
Tombol mode fullscreen Alt+ Enter
Aktifkan modus trackball F6
Modus trackball sementara
Delete
(saat
tombol ditekan)
D-Pad kiri, atas, kanan, bawah Keypad 4,8,6,2
D-Pad tengah, tombol klik OK Kevpad 5

Perlu diingat pada penggunaan tombol keypad, Numlock harus dalam


keadaan non-aktif.

Gambar 5-i Taryilan snlaIuAVD wfrtk OsAndroid vusi 2.2


Opsi Startup Emulator Berbasis Konsol
Emulator memiliki berbagai opsi yang dapat digunakan saat proses launching,
Kontrol Emulator Android diantaranya mengontrol tampilan display atau lainnya. Format penulisan
Emulator memiliki sejumlah fungsi kontrol identik perangkat Android command emulator adalah sebagai berikut:
sebenarnya, tetapi dengan beberapa pengecualian diantaranya fitur layar
sentuh, fiiur ini dipat diernulasikan menggunakan pointer mouse. Dan akses emufator -avd <nama avd> [-<opsi> [<nllai>] l [-<gemu
ke tombol emulator Android melaluitombol keyboard komputer. args> l
Untuk dapat berinteraki, Tabel 5-2 ditunjurkkan pemetaan tombol keyboard
untuk emulator Android- Berikut ini adalah beberapa opsi yang dapat digunakan pada command
emufator :
Tabel52 KutdlmMEmlatu
()psi pertolongan (help) :

Kontrol Emuliator Tombol Keyboard


-he1p untuk menampilkan semua opsi yang tersedia pada emulator
Home (Ke menu desktop) Home
F2 atau tombol Page'up
- lrc. 1p-a11 menampilkan bantuan semua opsi startup yang ada
Menu Dog.up dari bawah screen
Back Escape -irc1p-<option> bantuan opsistartup yang lebih spesifik
Akses teieoon F3 lic-1p-debug-tags menampilkan bantuan tag yang tersedia untuk
Menutuo pangsi lan telePon F4 pcrinlah -debug <tags>
Aolikasi eoosle search F5 lrr. lp-clisk-images berisi rincian infomasi penggunaan disk image
Tombol Power r7 p.rrl.r crnrrlalor, yang berhubungan dengan perintah -cache, -initdata
Tombol memperbesar volume audio Keypad'-" atau Ctrl+5 rl.rrr r ,rrrrrl i ..; k

78 Pemrograrnan smart Phone Menggunakan sDK Android rlatt ll,rr krrrli Atrrltottl llAlt rr l),r,,,rr rl,r.,,tr lil)K Anrlrord 79

.l
bantuan untuk variabel-variabel environment
sdcard. img.
-help-environment
emulator -wipe-data
-help-keys pertolongan pemetaan manual tombol keypad Menghapus atau mereset data image disk user (dengan lokasi image mengacu
pada path direktori yang ditentukan menggunakan opsi -datadir dan
_heIp-keyset_fileuntukbantuanpendefinisianfilekustomisasi
pemetian tombol keYPad
-data atau pada path default). Perintah ini juga secara otomatis akan
mengkopi seluruh file konten milik user (dari referensi -initdata) ke
-heIp-virtual-device menielaskan bantuan penggunaan Android irnage yang baru saat sebelum emulator diaktifkan. lnformasi lebih rinci
(AVD)
VirtualDevice image disk menggunakan -heIp-di s k- image s.

Opsi kontrolAVD: <system> merupakan path direktori AVD target (yang tiap AVD memiliki
rIi rektori yang terpisah), pada sistem operas i Wi ndows XP AVD-AVD tersi mpan
-avd (avd-name> atau G(avd-name) C : \Documents and Settings \<nama_user>\ .
cli direktori
console atau command android\ dan untuk Vista atau Seven pada C:\Users\<nama
Disunakan untuk menialankan AVD pada lingkungan
;,;;pl. a;.ara defauli, opsi ini harus digunakan' user>\ . android\.

()psi debugging:
Opsi image disk:
-cache <filePath> -debuqt <tags>
untuk mengalihkan imag,e partisi ke direktori filepath'
Perintah ini 'ifautt,cache
s;#; emulator menggunakan file
l'r.rintah ini untuk meng-enab/e satu atau lebih pesan debug, untuk masukan
t ,ig tambahan gunakan tanda pemisah spasi, koma atau kolom dari nama
iika opsi ini tidak digunakan,
image Partisi temPorary. l.ornponen-komponen debug. Untuk menampilkan daftar komponen yang
Ir.rsed ia, dapat digunakan -he 1p- debug- t a gs.
-data <filePath> debug-no-<tags>
direktori filepath' Jika opsi
Untuk pengalihan file image disk data.user ke
otomatis mencari file userdata-qemu ' N4en-disab/e pesan debug pada tag debug yang telah ditentukan dari nilai
i^; ti;Jk ;igunakan, (lihat opsi -avd)'
;;;;;;A;Ji "nl,iutot
Jrir* iorJer penvimpanan AvD '. t-ags>.
-init-data <filepath> ogcat. <logtags>
-initdata <filepath> atau I

yang akan digunakan' Secara default' Mcngaktifkan keluaran logcat yang memiliki nilai tag tertentu. Pada kode
Menentukan path direktori lokasi image
i*ig*,t", tersimpan pada s s
< y t em> / u s e rdata' img' ,rlrlikasi yang disertakan variabel ANDRoID LoG TAGS akan secar;r
olomatis akan menampilkan logcat pada keluaran -
-nocache
Untuk
perintah untuk memulai emulator tanpa menggunakan paftisi cache- :rirel L
opsi -cache <fire>' N4t'ngaklifkan shell root pada terminal konsol. User dapat menggunakan
i$iil;i"; iihat bantua; menggunakan pcrint.rlr ini meskipun daernon adb emulator pada kondisi tidak aktif. Saat
*rarndisk <filePath> crrrtrlator tel.rh ciirnatikan dengan menekan, shell akan tetap aktif.
MenentukanimageRAMdiskyangterletakpada.direktorifilepath.lika ',1r,vir-c)
user tidak *"nggun"t ur'.pri'i,liiE *" defa'ult,
akan mengacu ke direktori
<system>/ ramdi s k . img' l'r'rrrrl.rh ini ick,ntik dengan -sheII yang digunakan untuk mengaktifkan
,.lr,,ll r<r<rl <k,rrgan mcngacu pada devlce character (karakter perangkat)
-sdcard <filePath> <fi1e> lr,rllrrlrr. (lnluk mcngctahui daftar berbagai tipe perangkat dapat melihat
Untuk menentukan path direktori di mana
file image kartu microSD akan rrr,rrrr,rl lrr. I Jr t;h.,rr-clc-vices.
digunakan. pada fonais' iefault mengacu ke direktori <system>/

SDK Androxl d;ttt ll'tr krtrt: Atrrltttttl


ItAll lr l),r',,rr rl,r',,rr lil)K Arxhorrl 81
80 Pemrograman Smart Phone Menggunakan
Berikut ditampi lkan beberapa contoh pen ul isan peri ntah - she l- l- - s e ria f : Mengaktifkan server DNS. Nilai<servers> harus dipisahkan oleh koma
dengan jumlah maksimal 4 alamat server DNS atau lP.
. -shell-serial st'dio yang identik dengan -shel-l-
-http-proxy <proxy>
. -shell--serial tcp: : 4444, server, nowait
. (komunikasi dengan shell menggunakan pofifcP 4444) Mengaktifkan koneksi TCP melalui proxy tertentu pada protokol HTTPS atau
IITTP, dan prefix http: l/ tidak harus ditulis. Berikut beberapa contoh
format (proxlz) yang tersedia:
-show-kernel <name> perintah untuk menampilkan pesan dari kernel. http: i I <server> : <port>
-trace <name> mengaktifkan kode profiling menggunakan tombol F9
pada file <name>.
untuk memulai, yang hasil profiling akan tersimpan
http : / / <username> : <password>G<server> : <port>
-verbose initidak digunakan, nilaivariabel http_prcxy untuk emulator
Jika perintah
memberikan output verbose (lebih rinci), setara dengan perintah -debug- mengacu pada variabel proxy yang terdapat pada menu SDK Manager.
init. -nel-delay <delay>
User dapat menentukan opsi output defaultverbose yang digunakan emulator
yang diiunjukkan pada variabel environment Android yaitu: Menentukan emulasi latency jaringan sebesar <delay> dalam satuan
rnilisekon pada kondisi default bernilai kosong. Dapat pula menggunakan
Tentukan opsi yang akan digunakan dalam daftar menggunakan tanda r ommand -net.delay gprs untuk emulasi latency pada mode GPRS.
-debug-<taqs>'
pemisah koma, yang opsi tersebut tersedia pada
-net fast
Contohnya: ANDROID VERBOSE:init, modem digunakan untuk
mendefinisikan -debug- init dan -debug-modem '
l'r,rintah ini merupakan shortcut untuk perintah -nerspeed ful]
rietdelay none.
Untuk informasi lebih lanjut tentang debug tag, dapat dillihat manual
menggunakan perintah -he 1p- debug- tags'
rretspeed <speed>
{.Jrrtuk mengatur kecepatan jaringan emulasi sebesar <speed> dalam
s.rtuan kbps (kilo-bit per second) dengan nilai default bernilai full (kecepatan
Opsi kontrol media: rrraksimal sesuai kemampuan jaringan fisik). Contoh format penulisannya:

-audio <backend> menggunakan backend audio tertentu' nctspeed gsm


-audio-in (backend> menggunakan backend audio input tertentu- netspeed 14.4:80
-audio-out <backend> menggunakan backend audio-outputtertentu- licrikut ditunjukkan format delay (untuk emulasidelay) dan speed (untuk
,'rrrrilasi kecepatan) yang menyediakan emulasi beberapa tipe jaringan untuk
-noaudio menonaktifkan dukungan audio pada emulator yang akan rlilirinakan pada perintah -netdef ay dan -netspeed.
diaktifkan.
-radio <device> mengalihkan antarmuka modem radio pada
perangkat host tertentu.

-useaudio mengaktifkan dukungan audio pada emuiator yang akan


diaktifkan (secara default telah akti0.

Opsi koneksi jaringan:


-dns-server (servers>

| ),r',,rr rl;r',,rt lil )K Arrrlrorri 83


82 Pemrograman smart Phone Menggunakan SDK Androlrl rl,ttr ll,rr krrrli Arrtlrottl
Perintah ini untuk menurunkan kecepatan emulasi CPU sebesar delay
Tabel 5.3 Format de lay dan speed yang didukung (penterlambatan relatif dengan nilai integer 0 hingga 10OO). Nilai delay
Delay (ms) Kecepatan (kbPs) tidak berkorelasi dengan kecepatan clock atau satuan lainnya dan tidak
berimplikasi pada performa emulator.
Format Perintah
Fungsi Perintah
Min. Max. Upload Down -gps <device>
delay speed Fungsi ini untuk pengalihan device CPS NMEA ke perangkat spesifik. Untuk
14,4 14,4 mengemulasikan perangkat yang kompatibel dengan NMEA atau GPS,
gsm Emulasi kecePatan jaringan
CSIWCSD untuk OS linux device telah terhubung pada character devices (terlihat pada
qprs Emulasi pada iaringan GPRS 150 550 40.0 80,0 direktori /dev/tty atau /dev/usb ), sedangkan pada OS Windows
hscsd Emulasi kecePatan Pada 14,4 43.2 terhubung dengan socket (port COMO atau lainnya). Penulisan <device>
harus sesuai dengan perangkat seriaI-QEMU.
iaringan HSCSD
18.4 236.8
edge Emulasi pada kecePatan 80 400 1
-nojni perintah ini untuk menonaktifkan pengecekan.lNl dari runtime
iarinean EDGE Dalvik.
35 200 128 1920
umts Emulasi pada iaringan
-qemu untuk mengabaikan argumen QEMU.
UMTS/3C
none rutt Tanpa latencY (default) atau 0 0 -qemu -h untuk menampilkan bantuan opsiQEMU.
kecepatan full
I
num
-radio <device) untuk mengalihkan perangkat modem wireless ke
<num> Latency atau kecePatan max num
num
perangkat lain, pada windows menggunakan format COM: (nomor port
dan min Sebesar num num i
i
seri-a1>.
max mrn max
(min):<max> Menentukan latencY min
-timezone (timezone>
maksimal dan minimal
Mengubah zona waktu perangkat emulator pada timezone tertentu, yang
tidak mengacu pada lokasi zona host. timezone ditulis mengikuti format
-port <no_Port> zoneinfo. Contoh: "America,/Los_Angeles" "Europey'Paris".
Untuk merubah port konsol emulator, <no port> berupa nilai integer
genap antara 55S+ sam'iailS'a. Nilai<porti+t tidak boleh digunakan -versi-on menampilkan nomor versi emulator.
f"r"nr sebagai port cadangan untuk ADB'
-report-console (socket> Opsi User lnterface (Ul):
perintah untuk memberikan report sebelum emulator difalankan pada -dp1-device <dpi>
p"n tl"roi emulator yang digunakan pihak ketiga. Format socket
yang
Untuk mengatur skala resolusi emulator agar sesuai ukuran display perangkat
didukung diantaranYa:
fisik (monitor komputer). Dengan nilai default sebesar 165- untuk lebih jelas
tcp: <port) [, server] [, max=<seconds>] -scale
lihat .

unix: <port) [ , server ] [ , max:(seconds> ] -no-boot-anim


Untuk informasi lebih lanjut tentanS report, dapat melalui
perintah -help- rnenonaktifkan animasi teks "android" saat startup emulator- Efek perintah ini
report-console. ,rkan mempercepat waktu startup.
no-window
Opsi konfigurasi sistem: Norurktifkan tampilan grafis window pada emulator.
-cpu-deIaY <de1aY> :;r',t I r' . l;t',t Lr-.)

ItAll lr l),r,,,rr rl,r,,,rr lil)X Arrrlrorrl 85


84 ?emrogramanSmarlPhoneMengp,ttnakanS[)KArxhrrrllrl.rrrll.rlkrrrtiAlrtlltrrtl
Mengatur skala window emulator, dengan jangkauan scale antara 0,1 Lrl,r rlapat mengubah nama atau mengganti file image vang akan digunakan
hingga nilai maksimal 3. Dapat pula digunakan dengan satuan DPl, dengan r,,,'l,rlui opsi pada startup Emulator. Beberapa tipe image ditunjukkan pada
menambahkan perintah "dpi" di bagian belakang. Atau ukuran window | .rlrt'l 5.4.

ditentukan secara otomatis dengan menuliskan "auto".


fabel 5.4 Tipe inage pada AVD dan perintah override yang didukLtng
-raw-keys
Nonaktifkan keyboard reverse-mapping. lmage,._Definisj*_-'L'--Pqnjqlq91*
, lDapat di-override menggunakan
-noskin j peiintah:
Perintah untuk tidak menggunakan skin emulator. I

l-data <filepath) ;

-keyset <file> I

lfilepath adalah direktori tempati


Menentukan file kustom key set untuk menggantikan key set default. Pada ni,
D iI g u n a kK a niPenvimoanan image'
file key set mendefinisikan list tombol untuk binding antara emulator dan iu
rr;t--rdata- iemulator i

untuk;Jika hanya ditulis nama file, emulator


keyboard host. lnformasi lebih detail dilihat dari perintah , 'rnu . img menulis data- lakan mencari file di dalam direktori
1,

-heIp-keyset. runtime user leVO yang aktif. l

file image pada direktori


I

lApabila i

lmage Disk Emulator lfilepath ticlakimage


di-temukan, emulator I

imenciptakan userdata .
Emulator Android menggunakan image yang dapat di-mount dan tersimpan i img, dengan data usertetaptersimpan ]

ke perangkat development untuk mensimulasikan flash drive seperti pada q9!elahs!i?!qr{:!gdery{}_


perangkat Android fisik. lmage disk berisikan kernel emulator, sistem
r -
iSebagai SD Card _ .t] _ -.-
Androld, image ramdisk, dan image yang bersifat writable sebagai media , i O"prt di_override menggunakan
{
j,'ard. j *_ 'yang
imo yd[l8'ol,rnasuKKa,n
drmasukkan Keke , nerintah.
'perintah:
penyimpanan data user dan SD card. ,,
- perangKat emutator'
Agar emulator dapat berjalan diperlukan akses ke file image disk. Secara _ _,___i An_arq,d.*_ _ _, _ l_,,"
d'glq_11:!*h,
default, Emulator mencari image disk yang terdapat dalam folder AVD yang
digunakan. Jika image tidak ditemukan, otomatis emulator akan mengkopi
image dengan konfigurasi default yang terdapat pada SDK ke direktori AVD lmage Data User
target. lrrr,rge data user yang bersifat writeable digunakan untuk penyimpanan data
Jika emulator sudah aktif, tetapi tidak ditemukan image data-data user dalam ,l,rrr data session saat instance telah dalam kondisi diaktifkan oleh emulator.
direktori AVD, otomatis emulator mengkopi file image default dalam package I )r,rntaranya. untuk penyimpanan data aplikasi yang di-instal/ user, konfigurasi
SDK, yang hanya bisa diakses read-only. I rcr.rngk?t, database apl ikasi.

Emulator.iuga menyed iakan opsi startup- s y s tem <di r)


yang mengij inkan ',,r,rl startup, emulator akan me-load image data user yang telah tersimpan
modifikasi di mana lokasi data image emulator default tersimpan- ,,,,.,i sebelumnya.
Jika sistem menemukan data user maka image akan di-
rrtottnl dan sistem akan membaca-tulis data user tersebui.
| ),rr i tiap konfigurasi AVD yarrg digunakan emulator, masing-masing
lmage Runtime Data dan SD Gard
rrr.rniliki media penyimpanan data user yang terpisah. sehingga tida[
Saat proses runtime, emulator akan membaca dan menulis data pada dua ,lrPcrlul<an menggunakan opsi perintah -r:--i untuk menentukan- clirektori
image disk, yaitu image data user dan image SD card. Proses ini sebagai ..1 rr.sifik penyimpanan data.
emulasi data partisi user dan media penyimpanan removable pada perangkat
Android.

86 Pemrograman Smart Phone Menggunakan SDK Arxlrorrl rl,ur ll;rr krrrli Arrrlrotd ItAlt 5 l)ar;ar da:;ar Sl)K Android 87
lmage Temporary
file image yangwriteable
Saat startup emulator, sistem akan rnenciptakan dua
(dapat ditulis), yang file-file image tersebut terhapus setelah emulator
dinratikan. File tersebut adalah:
. Duplikat image sistem Android
off. cl:*r its ch*rk b*x A {illad box rrl*r* thst anly p*rt cf
. Partisi image untuk direktori / \cache ihr fealure ir lurned qn,
Pada File image tersebut, usertidak dapat nrelakukarr rename atau men-di-sabk'
penghapusan image temporary setelah emulator dimatikan. Saat kondisi ,-..1;i,"
r_': .
5i'nptr Fietsrei[ M;A;d. prot;i-liixr*Fi
awal emulator aktif, direktori ,/cache masih kosong, yang selanjutnya !":
{j
Sirnpl* T(FIF *eryicer (i,e" c<hq drytirxe *tc}
akan digunakan browser untuk men-cache halaman dan gambar web yang :*&. Iablet Pf, C*mpanentt
telah terunduh. Partisi cache dapat pula dinon-aktifkan menggunakan opsi fJ&
-nocache saat startup emulator. .-.131 Tetna *rrer
lJ$ IfiP Ctiwrt
Shell Emulator atau Perangkat Android
Untuk mengakses shell pada emulator, Kita dapat dikoneksikan dengan
aplikasi telnet, yang merupakan aplikasi default dari System Windows
dan tersimpan di direktori C: \windows\system32\. Untuk Windows
rc'tr]i:ffi-t
7, secara default tel-net belum ter-install, untuk meng-install-nya klik Start
Menu -+ Control Panel -+ Programs + klik Turn Windows features on or off . (b)
Setelah window Windows Features muncul, berikan centang pada check box Gambar 5.7 (a) Menu aktivasi feature progran tambahan di windows 7
Telnet Client,lalu klik OK untuk memulai proses instalasi (Cambar 5.7a dan (b) window list check box progran yang dapat di-instail
s.7b).

h,rrsol Emulator dapat berfungsi untuk mengemulasikan penerimaan telepon/


penentuan koordinat CPS, emulasi manajemen power, koneksi jaringan
Homr "M5,
Programs and Features 1r'r.rrrgkat Emulator. Berikut contoh penulisan perintah shell mengguna[an
,rplikasi tel-net:
l.,fl rnstill i p.ogrim Sf l..i r*. ;lia{qll.t te4lr.l*lc!.{,{.ail
rurrty
Run programr nxde fot prryia{Jr verEions sf lryitdsrlrr Hsttr t,,1 rret l-ocalhost (console-port.>
nternd
( ()nsole-port) merupakan nomor port dari emulator yang aktif atau
(a) ;r.r,rngkat Android yang terhubung. Nilai tersebut dapat diketahui dari serjal
rtrttrrbcr yang. tertera pada window title di tiap emulator. Contohnya pada
.rrrrrl;rtor Android level API B, ditunjukkan serial number pada title window
',', : f royoDevice (Gambar 5.8).
",1

B8 Pemrograman Smarl Phone Menggttttakatt lil)K Attrltttltl tl,rtt ll,tt kttrli Attrltrttti l);r,lrr rl;r,,,rr SI)K Android 89
itrrril.o itl Con:tr lr: : t ylie ,
lrtlp' f *t' o I i:t ol *:rnn.rfir:l:
rlU
ll* li p
irlrrrlr'n id conse l{: aornrnrl h* 16,:
Ir*Lp!hII lr1:i.nt ir i is t of r:on$aftd:i
f"ent si.rrtr lat.r Iurdual"t *s$n;-:!
$*r} $*o'-locat inn connantlr
$$r! tl$tl r.* lated coRnarrr{l:
ki l) kill tllr cnnlator lnrtance
n*t ucr'k Fr&na$* ne!:rrqrk liett- r.nga
Gambar 5.8 Title WindowAVD r* ue rr poucr" r*lated eonq".r.ndi
14r it i *x i* rltti.i e nnf rr: I. se::t irn
rrd ir. nail69e 1to rr- red i rcc t idns
sn3 ShS related connand:
avd tn&nagcr. vir"tual d.ouice statc
Karena itu, untuk menghubungkan tel-net dengan perangkat emulator ui.ndar..r nrarr;rge enulator vindorr
tersebut dapat digunakan perintah: ' lt" in {conna.nd}' f or, nolrnrand-*prc lf ic }e !p
telnet loca.Ihost 5554 [1,

Dari .perintah digunakan alamat port emulator yaitu 5554, sedangkan (iambar 5.1a shell connand yang dapat
diakses pada console EmulatorAVD atau perangkat
untuk mengetahui nomor port perangkat Android atau emulator yang Glah Android
terhubung dengan ADB dapat digunakan command adb devices yang
akan menampilkan sejumlah perangkat atau emulator yang aktif (Cambai
s.9). Emulasi Geo-location
l',rrl,r EmulatollvD juga memilikifiturgeo-rocation dengan mengemulasikan
h:r)adh deuices 1';r'r.rngkat cPS, yang dapat diaksei melalui aplikisi tui""ut untuk
lI,ist of ttauices at*arhed ,r,'rrjalankan emulator.console.dan menggunakan perintah ge-
hsqulaton*555{ devie* diikuti nitai
ssE6s?f eae61 dev ica l,rrrrlinat lokasi atau dapat pula diguna[in tool ddms. perlntah qeo
tidak
lr'rrrv.r merdukung masukan dalarn
lI -sat,an derajat, tetapi mendu[ung prla
r, rsrrkan dengan format N M EA
I rr
0 7 Bi. Berikut formai penu lsan perint"#quo,
r:r'-
I

,r,,,, .i fix i nrnea )


Gambar 5.9 List EmulatorAVD dan perangkatAndroid yang terhubung dengan ADB I rrrrrk rincian sub-command perintah qeo ditunjukkan pada Tabe! 5.5:
Dari Cambar 5.9 tersebut ditunjukkan device dengan nomor t550059f9ae61.
adalah nomor port perangkat ,{ndroid fisik. Secara default, perangkat Tabel 5.5 Sub-command yang didukung pada perintah geo
Android tidak mengijinkan pengaksesan shell untuk debugging sehingga
Sub-command
telnet belum dapat diterapkan pada perangkat Android. Tetapi, hal ini dapat
diatasi menggunakan metode rooting yang akan dijabarkan pada bab Rooting r '- J ongitude> Mengirimkan koordinat longitude
telnet I rt i-tudel>
Android. Cambar 5.10 meunjukkan telah terhubung dengan konsol
,

I ,rit.itude>l
sederhana CPS pada latitude (bujur dan
emulator atau perangkat android. emulator. lintang) berupa angka
desimal bersatuan
derajat. altitude
(ketinggian) dalam
satuan meter.

90 Pemrograman Smart Phone Mcngllrrnak,rrr Sil )K Arrrlrorrl rl,rrr ll,rr krrr1l Arrrlrorrl llAll lr l),r,;rr rlas;rr St)K Arrdrrlrrl
91
I

Penielasan
Perintah geo digunakan untuk merubah koordinat perangkat AVD secara
Sub-command Definisi realtime selama emulator dalam keadaan aktif. Saat perintahgeo digunakan,
nmed <per.intah> Pengiriman data Format penulisan emulator akan menciptakan provider location tiruan, kemudian informasi
menggunakan format <perintah> harus koordinat tersebut akan dikirimkan ke aplikasi yang membutuhkan dan
NMEA 0183, yang identik dimulai '$cP'. Juga meregister lokasi hasil respon. Berikut penulisan perintah geo:
dari pengiriman perangkat mendukung format
,$GPGGA' dAN
modem GPS.
,$GPRCM,.
seo fix 170-3761.73 -'l -6636
geo nmea $GPRMC, 081836,A, 3751. 65, S, 1450'l .36,8,000. 0,
360 . 0, 130998, 011 . 3, E* 62
Fornrat NMEA 0783 merupakan suatu spesifikasi standar teknis dan standar
transmisi data sebagai sistem komunikasi antarperangkat elektronika yang Untuk proses updating lokasi CPS pada kode aplikasi dapat dilakukan query
digunakan pada bidang kelautan. Seperti: sonar, anemometer, gyrocompass, location manager dengan memanggil fungsi :
releiver CPS. Standar ini dibuat oleh National Marine Electronics Association
AS dengan sistem komunikasi secara serial dalam format ASCll, yang
LocationManagier.getlastKnownlocation ( "gps" )

mendefiiisikan bagaimana data ditransmisikan dari satu sumber device ke Untuk mengetahui informasi yang lebih rinci tentang location manager, dapat
sejumlah perangkat listener (Wikipedia, 201 ). 1
dilihat Class Locatj-onManager pada dokumentasi Android dengan
Koorclinat longitude dan latitudemerupakan sistem koordinat sferis berbagai method-nya dan di bab lainnya yang membahas implementasi
lrersatuan derajlt dengan separator desimal berupa tanda titik. Po-sisi kutub Aplikasi menggunakan fitur Ceo-Lokasi.
utara memiliki latitude gO;, sedang,kan kutub selatan -90o. Contohnya
koordinat latitude dan longitude Daerah lstimewa Yogyakarta, yailu -7.6636"
dan '11 O.376173". Untukhemudahkan pemahaman sistem koordinat sferis, Emulasi Event Hardware
pada Cambar 5.1
'l ditunjukkan beberapa contoh titik koordinat longitude
Melalui konsol kita dapat juga mengirimkan suatu event ke emulator dengan
igaris bujur)dan latitude (garis lintang) dalam satuan derajat. masukan perintah event. Berikut adalah contoh perintahnya :
Kutt*& u18r8
longitrde = -30 Lstltude - g0 event < send I types I codes I text >
l*lifude = S
Berikut subcommand event yang ditunjukkan pada Tabel5.6.

Tabel 5.6 Sub-command peintah event


Subcommand Definisi
send Mengirimkan event satu atau lebih ke kernel
<type> : <code) : (value) Android berupa teks atau integer untuk
t...1 (tvpe) dan <value> .
Menampilkan seluruh nama lain string
types <type> yang didukung subcommands
longituda= 60 event.
Menampilkan semua nama lain string
Kuluh S+lrtan <:odes <type> (codes) yang didukung subcommands
Lalitilda = -.t( event untuk <tvpe> spesifik.
Gambar 5.11 Sistem koordinat sferis dalan satuan deraiat
(Sunber ;Abelson W., E et. al., 2009)

r\ttrlrotrl llAll lr l),r,,,rr rl,r,,,rr Sl)K Arrrlrortl 93


92 PemrOgraman Smart Phone Mentllltinakirrr lil)K Arrrlrorrl rl,rrr ll,rr kttr1l
Subcommand Definisi E :,--.:i;.]; ,' ' :-l

t)D,lroirl Corr'.,rlr: type 'hcIp' f or s lirt of e ontrartds I

Simulasi menekan tombol untuk mengirim 0l(


.rc ( u0 rI 1

karakter Pesan tertentu. ^J lou:i yo( to RiofrSi thc tctt.ingr r*Iatcd tu Lll.t tsttrol'k dota connecl ion oI rl'" i
..n'r ldt.d desise. I

event text <message> Menggunakan format string UTF-8, nilai .rvr.i lrblt; tul| cot*tdnd; i
duA, nnt$qtsl{ ttGt(r,
unic6ie dipetakan terbalik sesuai keyboard' 3 t eLua
; prtd clmnEe nctwrk uped
Karakter vans tidak didukung diebgik*.- ley 6lran$6 nBtmrk ldtsncy
L

dc
cnrturq durp netxonk }acLGts to filc
,KO nrisc lnq tub-comnd

Emulasi Perubahan Level Baterai Perangkat Android


baterai, Gambar 5|12 Subcommand yang didukung pada perintah nelwork
Emulator Android mendukung simulasi perubahan kapasitas
,"nfiunuf.rn perintah porer,-berikut format penulisannya: trnmand network status dan outputnya ditunjukkan pada Gambar
power<disPlaY I ac I st.atus I Present I health ,.13.

I caPacitY >
Pada Tabel 5.7 ditampitkan rincian subcommand
power :
roid Con*o

power tr*or.k str^tu5


Tabel 5.7 Sub-command perintah !.ant net$ot"k stattr* !
dotrn load t$cad : btts/* (6.6 HB/i)
rrplnad cpeed: bit*/t (8.6 XB/s)
ninimun trctency:
Tampilkan level baterai naximun lttenrg:
displaY atau level ch
Set on atau off koneksi arus
qs (on I off> Gambar 513 Tampilan shell emulatar pada perintah ne:uw o r k s t atu s

status Mengubah status kondisi


<unknown I charging I discharginq I not- baterai ke mode tertentu. Keterbatasan Emulator
charqinq I full> Al..,kipun Emulator AVD memiliki sejumlah fitur dan fungsi-fungsi yang telah
Set kondisi keberadaan
,lr1,.rparkan di atas, AVD masih memiliki banyak keterbatasan, diantaranya
present <true I false> :

health <unknown I good I overheat I dead t l-idak mendukung panggilan atau menerima telepon
I overvoltage I failure>
.l . 'T
idak mendukung emulasi kamera
Set emulasi kaPasitas ', Tidak mendukung konektivitas pada port USB
power health <Persen> baterai (0Y. - 100%)
{, Tidak memiliki fitur deteksi koneksi headset
Sebaeian fungsi emulasi iuga disediakan di Window '
DDMS
Iidak ada fitur deteksi state interkoneksi (jaringan operator, atau CPS)
ffi ;:il;"";;," Luin'",1 ad iiba n d n cY :1, T 11q8^': :If. -?H:1:
i
It lidak memiliki fitur eject atau insert memori SD secara live (SD card
ffiliiff;i;,;i;;i ;i;;t; pada sub-bab DDMS'
dapat puridirihat
lr.rnva dapat dibaca-tulis dengan di-mounting saat AVD tidak aktifl
'r lirl,rk nrendukung pembacaan atau emulasi charging baterai atau
Pemantauan Status Jaringan 1roW<,f St;tte
jaringan dapat l(r I rrl,rk nrt'nrlrrkung koneksi bluetooth
Untuk pengamatan status koneksi, delay,. dan kecepatan
;;;;6 network vang dijalankan melalui
;;rintah
teinet' II I r.rrrrcr.rlc y.urg sangat rendah saat menjalankan aplikasi grafis 3D
I .' lrrl,rl< sr.pcnrrlrnya mendukung emulasi fungsi geo-location dan sensor

PemrogramanSmartPhorleMerlggunakarrlil)KArrtlrrrrrlrl.rlrll.rrhrll}]Atttlttlttl ltl\lt rr l),t,,,rr rl,r:,,rr lil)K Arrrlrorrl 95


94

*l
(akan dibahas pada bab aplikasi menggunakan fitur Ceo-Location, dan AVD yang telah dijelaskan pada sub-bab Emulator di atas.
aplikasi sensor).
i
$;1)3rttr in*ta l l frpploek*.U_l 1J. apk
Instalasi Aplikasi Android *i:B Xnr* {L&9543 }rvr*s irr 11.,/ius )
.-,. ltkg: .zrtata,/1*calrtfip"/fltt!)Llcir l-t I ll ..rtlk
Untuk menginstalasi aplikasi apk Android, kita dapat menggunakan ^.)ucce 5$
beberapa cara yaitu: e l\)*
a. Mengunduh aplikasi dari Market. Cara ini hanya bisa digunakan dari
perangkat Android karena AVD tidak menyediakan aplikasi Market.
Untuk mengunduh aplikasi, jalankan aplikasi Market pada window Gambar 5.15 Proses instarasi aptikasiApK android dari conntand pronpt
Menu Aplikasi (Cambar 5.14) kemudian pilih kategori aplikasi yang
diinginkan. lnstalasi dari memori Spc.1(, aplikasi ApK yang tersimpan pada
memorisDcard dapat pula diinstalasi ke sistem nndroid menggunakan
Aplikasi MyFiles atau.aplika.si yang sejenis (cambar s.ro)lieiapi,
cara.ini tidak dapat diterapkan untuk AVD karena secara defau
emulator tidak menyediakan aplikasi File Explorer

lrl
t;t I

All appllcatlonr
[-alclicol f rs &r]ay*i*, {$;:irryc 1r,:'! kl]l*r.

Bnd(s fi* f;efrrf$(t


6crqle 5lr l,!sp f,,hle ll.r'"-r

Burlnerr
fnb !*arcF (!,&:61o1ps1u ir,' fir' 3 f t.,,.ilr'; AL{,i

Gambar 5.16 lnstalasi aplikasiApK yang tersinpan dalam SDcard

Gambar 5|14 Kategori aplikasiyang tersedia diMarket (atau Google Play) Apiar kita dapat melakukan instalasi selain mengunduh
aplikasi dari Market
(r.rra b dan c.di.atas), pada-perangkat Android"perlu
dil;ku6n lonfigurasi
rl.ngan masuk ke menu settrngi -+ ,+ppricaiiort sutii,g, dan
b. lnstalasi melalui tool adb. Tool adb dapat digunakan untuk instalasi r ..tang pada unknown sources sepefti yang
berikan
aplikasi APK pada AVD atau perangkat Android fisik. Berikut adalah telah di.ieraskJn pJa sub-bab
Konfigurasi Perangkat And roid.
format perintah instalasinya:
adb -s (serial-_device) instal-1 path/file.apk
Opsi -s digunakan jika ADB terhubung dengan beberapa perangkat
atau AVD nilai serial device adaiah nomor scri Arrrlroid atau
liAlj rr l),r.,,rr rl r,,,rr i,l)K Arrrlrorrl ()7
96 Penrrograntan Srnarl ['ltottc Mlrl,littn,rk,rtt ',l tK Atrrlr.rrlrlrrrll.rr l'rtt1'Atttltottl
U ninstall Aplikasi Android
Untuk melakukan proses uninstall aplikasi APK terdapat dua cara yaitu:
a. Menggunakan tool ADB. Tool adb dapat pula digunakan untuk
menghapus aplikasi APK yang telah terinstalasi, berikut format
penu I isan peri ntahnya:

adb -s <serial_device) uninstall -k <package-name> ri.r, l::: r..rt9

Opsi perintah -k digunakan agar perangkat atau AVD tetap


melakukan penyimpanan data atau cache dari aplikasi tersebut.
Berikut proses uninstall dari command prompt:

(a) (b) (c)


C: \>adb -s emulator-5554 unj-nstall com. contoh-aplikasiku
Gambar 5.17 Menu Setting (a) Applications (b) Manage Apptications dan (c) uninstal aptikasi
DDMdi-spatch reg wait timeout
Can't dispatch DDM chunk 52454L57: no handler defined
Emulasi SD Card pada Emulator
Can't dispatch DDM chunk 48454c4f: no handler defined
l'ada sub-bab ini akan dijelaskan bagaimana cara untuk membuat image disk
Can'L dispatch DDM chunk 46454154; no handler defined 5D card, memasukkan atau mengambil suatu file dari, dan l<e image disk.
Can't dispatch DDM chunk 4d505251: no handler defined tmulator Android mendukung emulasi sD card dengan mensimulasikan
l)roses insert atau eject kartu memori sD card sama seperti pada perangkat
Succes s r\ndroid fisik. Kartu sD card tersebut merupakan file image disk yang <Jfpat
pula dibriat secara manual oleh user dengan menggunakan tool misdcard
y.rng termasuk dalam package SDK Android.
b. Langsung dari Android. Main menu pilih Settings -+ Applications -+
Manage Applications -r pilih aplikasi yang akan di-uninstall -+ lalu I rnulasi sD Card memil.iki beberapa keterbatasan, diantaranya file image
tap button Uninstall (Cambar 5.'17 a5.17b,5.17c). sD.card hanya dapat di-load disaat startup emulator. User juga tidak daplt
rrrelepas emulasi sD card saat emulator masih berjalan. Tetapi, user dapat
pula mengakses, mengirim file, dan mengkopi atau menghapus rite dari kartu
sD menggunakan tool adb atau emulator. Emulator juga mendukung emulasi
SI]H! yang dapat memiliki ukuran image SD card antara 9 MB hingga 128
t iigabyte.

Membuat dan Modifikasi lmage SD Card


M.rnbuat image sD card dapat dengan mudah dirakukan menggunakan
l,rl Android. Diantaranya saat proses pembuatan AVD, hanya diferlukan
-c, yang perintah lengkapnya menjadi
rrrr.n.rrnbahkan opsi :

.rl(jr()i<l cr:eaLe avd -n (avd name> -t (targetID> _c


':;i::r'lKlMl

98 Pemrograman Smart Phone Mcnggunakan SDK An<irortl rl,rlt l l,rr I'rrr11 Arrtltoirl llAlJr, l),t',,rt rl,r,,,rr lil)K Arrrlrsrrl 99
Di dalam opsi -cdapat juga diberikan opsi pe.nentuan direktori path pada l',rda windows XP atau Z, dapat digunakan UltralSO (Cambar 5.18) aplikasi
image SD card (berekstensi
*.img) untuk digunakan pada AVD'
rni nrendukung baca/tulislnrenghapus file di dalam file image (format yang
,lidukung diantaranya : .img, .iso, .nrg, .cue, bin).
Membuat dan Modifikasi File lmage Disk
Untuk membuat image sD card dapat menggunakan tool mksdcard,
tooi inl teiah te,masrfdi d"lr* package SDK. Tool ini dapat diakses pada I ,:.*q
direktori tools/ dan merupakan subdirektori dari package SDK. Dengan $sllcaBo .. r&.m 3R €r$6ft I
,) rd'd-€.s
bentuk command sebagai berikut: * '
d4'Eu. flrl fi
I
:ffo il fl1{.tt
,-, J.Jad isl8.1l{J r!,Ot
i rcmrrxm*rntE. Jbca! 0 1fi0il91{lt
mksdcard [-1 1abel] <size>[KlM] <fi1e> -- t,:rii
{] ta11.0iR
Ju'5r t'H 0
rJ!]{6
:lfr0.ur ! 1tl 17
lrtr$11{rirrif

berikut penjabaran opsi perintah yang dapat digunakan: : J*ry*

-I argumen untuk mendefinisikan nama volume label image yang akan


dibuat
size ukuran kapasitas image yang dalam satuan integer, secara default !& Ile
menggunakan satuan byte aiau dapat diubah ke satuan Kilobyte atau
r*"gi6yt" dengan menambahkan tuiisan "K" atau "M" pada akhir angka'
Contohnya: LO2Atl
file target direktori atau nama file yang akan dibuat
Contoh perintah membuat image SD card:
rnksdcard -1 mySDcard 1024M /target-dir/sdcardf img Gambar 5.18 Apli kasi Ultr a I SO

Secara de{ault, image tersebut menggunakan format FAT32 atau dapat


-r".rm
diformat ke FAT32 otomatis iaat proses startup emulator setelah Monitoring Aplikasi Android
image dimasukkan. Kapasitas image yang dapat digunakan emulator paling llr)tuk mengamati rincian proses dari suatu aplikasi Android pada emuiator
kec'ii sebesar e Mb. Jika lebih rendih dariukuran tersebut, image tidak dapat .r1,rrr perangkat Android, Anda dapat menggunakan tool adb. Tool
d igunakan pada emu lator. rrottbleshooter ini digunakan oleh pengembang untuk mengamati tiap proses
Proses pengkopian file ke dalam image SD card dapat dilakukan sebelum .rlrlikasi menggunakan emulator atau perangkat Android fisik.
b"erjalan. Penyalinan file menggunakan aplikasi eksternat selain
"rnuf"tot
pi.trg" SD(, untuk siitem operasi CNU-Linux atau Mac OS-X, dengan
*"-r5rnt irnage sebagai device /oop dan selaniutnya memasukkan atau Command ToolADB
menghapus suatu file. ContohnYa: ,,, ilr adalah aplikasi konsol sebagai penghubung untuk debugging dengan
pr.r.tngkat Android Antara emulator dan perangkat Android keduanya
mount -o loop /home/user,/.androld/avd/Android_2'2/ ,lrpcrlakukan sama oleh adb.
sdcard. img,/home/user /target- mounl--dir/
Untuk menjalankan perintah di atas biasanya diperlukan akses root atau
dapat pula menggunakan perintah sudo sebelum mount (contohnya: sudo
mounr... I. Sete-ilh image berhasil di-mount, Anda dapat menambah atau
menghapus data pada image tersebut pada direktori target'

Pemrograman Smart Phone Menggunakirtl Sl)K Arrrlrorrl rl,ltr llr, l,rrrllArrrlrtrtri


100 ilAll rr I ).r,,,rr rl,r,,,tr 1il)K Artrlrlrrl 101
:l:\iG{b -l*1p grldr. Kategori general:
lf,ditrid Dnl$fi r{}rinn ,,llr.:6
- diftrrr {$l@nI io (}*: {.19 i..{(r!.d
Blrrng {! !..et
- diEctE.oMrnd
it$! d.rtrs
{'l n*h 1ko nnr ljtl d&vl.er i1 9rr3rni.
t. ih 6.1! hr(ain!.ul.tor- devices menampilkan semua perangkat yang terhubung t
.rrcr rl h6r rlua oh..Erlntr' i! ftinl49.
_s i.6rldl *slrrt ' dlrrci, ($6Md to (|fr 058 dnsluo or atulrtqr vlltr dalam bentuk teks.
rh. rivcn acrr*1 rral*r. Ncr.idca r*oml! rEnl6L
?d! lr6aHrt q.rr.Dl+-
-f \Ndn(r oI* cr *rri!' _ riulr pedr.t
o rGld!le</.bss:r.a
!r4 lrl" '!oa*r!'-
rth to. Fdu(t
nt help menampilkan bantuan perintah adb dapat digunakan
o,'r dtra<r.ry
It -r
liL.'frilrdrBt/tsrde.i/Booo.rr.
rr r6t .r..itird. 'k oluttolDJnOUJCI-filt
perintah adb/ ?.
rnvlmtr*lt srtrhln ls 4!.d. ,hl.l Brrt
b< ra ohrlqk rdLlr,
Il.r .Il .cr^!cr.a d.stc.t
cnrr.rE <kltlll{ilim}l ''nn*.et ti . &{irr vrr r$/tf Kategori debug :
f,,.t tCTl l! ,'i.d Ly d.fnull i{ no N4 rtr'lbf,r lr rr. lflcd-
tltrrn'r.it t{t&cr l('<rrir) dilrdtr,iEr( frco r tClzlI drvirt.
} 1
hFr !5L5 r! ,,!.4 by d.f.$I(
Urr.t ll,r ocm.nl dittr h..ddltin.l
vl ll d l*Lonnrur I rnn .l I (un.r.i(*l
it ^s p6t.r^h.r
.rys*nt!
lCFrlf arukrr .
i. .Fcrrird- logcat [<option>] [<filter-specs)]
L$ lc, co6rad, r
(rn.tr)
menampilkan data [og.
.dL rrrrl (leal? ((lrEal)l
- corr,ilrlilr .( /Eulec
cJL rrll {em(t> c+rr filcldIr lrra rlrv:cc
rd! crr t (dir.c({rJ} I . coyy b.t'tldl..
<-l *Mr
(e.t'nd!
D^1, lt ch.rrd
ltrt ht fuil'r 16!9)
h.t$ r!l'l
bugreport
**i rl*11 - ra{, s&tc r!*ll th(sr{(tlecly
!{t
rdt
...!'**{}
"k:l (ra@rd'
6r
- rud s&ti
- rrn iulrisF
rlEll .o$i
r{1*.t{ r{asM
menampilkan data .dumpsys, dumpstate, rlan logcat
.dL lor("r. t (f rlLtr rpc!) l - Ul(x dlcal{c lu pada layar untuk pelaporan bug.
rdl lor.-r.l ( lr..l) +.Erc) lotw*J c*cLat .e.nr,.tir..
arHrid nF{* a}i sr, of !
1.1i{Frt }
lscnle*!1r*t rt{tir doxln !fc}Et &.B} jdwp
l.ralr:*r.eg.(rdl} laxln .rclct ie)
l6i.lf , lristrn: {sniY iloffi! rftln( ne }
d.!:<elqrlctrr
.)<rp!{Pr,-.5E
di{l(G iffi}
t!d} (BeL. ..1\) menampilkan seluruh proses lDWp perangkat tertentu.
idl ,1r!f - I i.t Pt&a of F.. !r(cs b.tt lFr i J8,lIt \ffin.p{d
td! iritrll r-ll t-il l-.l.lit.;
('-t
Fr.L thl. F..krrF Jir. lD alE dr!i...id
r.a: furv.ril-lua. (lr.p9)
i!.t.rl ir Dapat pula digunakan forwarding ke port tertent, untuk
( rr E{',: F(,..!^ll
{' .' e.nr i^..r1[
lbc 6}8. l'6.flt!
s SD c.rd i^rrrri
!t: .1"r.'}
o{ :dt.r..,.1 ,t6rrr.)
menghubungkan proses JDWp spesifik, misalnya:
adl mlhriitl I-kl l8ra:rldi - ra.adra tfirr rEr ,.rt {a trcr ih drrisr
.dr L*rcFd {' I R.61 lrc} L}E d.({ dd cdlr dlilrorl.s)
ui;.xr,jLlr,il",Jli,fl,'ff.,Ht:sl. adb forward tcp:8000 ldwp:412 jdb _attach
localhost:8000
Gambar 5.19 Tanpilan help adb pada command prompt
K.rtegori lnstalasi :
Berikut adalah format penulisan perintah adb:
fnstall <pat.h_apk>
adb [-dl-el-s <serialNumber>] <command]
meng-insta// aplikasi Android, yang berekstensi ApK
Klasifikasi rincian command too/ adb ditunjukkan sebagai berikut:
pu11 <remote_dir> <1ocal_dir>
Kategori opsi:
mengkopi suatu file dari dalam perangkat Android atau Emulator
-d Opsi untuk mengarahkan perintah ke salah satu pada direktori tertentu ke kornputer.
emulator atau perangkat Android, disertai perintah
adb lain misalnya install. Jika flag ini tidak digunakan
push <local_dir) (remote_di-r:>
otomatis terhubung perangkat/emulator urutan mengkopi file pada direktori tertentu dari komputer ke perangkat
pertama dalam list AVD. Android.
-e Mengarahkan hanya ke perangkat/emulator yang lr..rlogori jaringan dan port:
aktif (online). Jika dua atau lebih perangkat aktif akan
memberikan keluaran error. forward <focal_> <remote>
-s <serial num> Mengarahkan perintah adb ke perangkat perintah ini untuk mem-forward (mengalihkan) koneksi socket
dengan serial num tertentu, misalnya dari port lokal ke remote port pada 6mulator atau perangkat
emuf ator-5554.1ika opsi ini tidak digunakan Android.
saat dua atau lebih perangkat dalam kondisi aktif akan
memberikan keluaran error.
ppp <t-ty> [parm] . . .
rnr.nl.rlank.tn PPP menggunakan koneksi USB.

102 Pernro;lraman Smarl Pltonc Mcn1111trnak;rn SI)K Arrrlrorrl rl,rtr ll.r, l trrl Arrrhorrl
103
r )"rdlr g lc I I
Kategori server :

ro0t, 2&1S-16*2{ 1A:01 conf lg


s tart - se rve r c
foo(
ac tre 2A1s-09-$? SS:5? cacle
?618-10-?.{ 1{t:61 cdcard -) /mtlsdcard
rJt o( 7.9t1[J-t.!-?.4 l9r'.8\ aac t
memulai server adb jika dalam kondisi sudah aktif perintah ini 3yrtrn 261ti t t, -2{ 18 : 91 ni l.
toot ?010"1U*24 ls:ld1 4 *7 txy*l*arnelzdebug
akan diabaikan. t $0( zul6-lB..?{ 1q:91 ete -)./ititen/CtC
rr10 t 2Sl0'06*3O 2t:Sti r9tl.efr
kil-l--server t oot 19?S-$1-61 gg:O& syi
rao t 19'?8-tll *gl fts: B* rbln
root 1??ld-61*sr os:6u BNC
perintah untuk mentatikan server adb. rs0t 1?9?! 1?7n-ff1-Or 66:66 lnlc.rf,
rao t 16?'l I??ff*&r"A! fig:0$ inLt.solttfteh-re
rcot ltr7{t'l 19?8-S1"81 6&:84 in i.t
Kategori shell : rtot 1ls 06:*6 dcfnult.prop
systcB 2610*n9-6? S6:6? data
'9?6-Ar-€1
rn0 t. 2618-&l-28 0O:5iJ reot
shel-1 roo t ?&r0-10-?,r 1g:&r deu

perintah ini akan menialankan remote shell dari emulator atau


perangkat Android. Jirga dapat dilakukan pemberian command Gambar 5.20 Tanpilan direktori dan file nenggunakan perintah i- s - f, .
secara langsung, dengan format penulisan: llerikut adalah beberapa contoh perintah yang menggunakan command adb:
si:e-Ll [ <she]l-Commanri>.1 ,rrlb -s emulator-5556 install helloWorld.apk
Fungsi perintah-perintah shell conrntand untuk Emulator,\VD atau perangkat
,rdb forward tcp:6100 tcp:7100
Andioid sama pada slrell command di sistem operasi CNU-Linux, yang
sebagian besar.hanya dapat dilakukan di level superuser/root. Beberapa ,rdb push gambar. jpg /sdcard,/gambar. jpS
perintah diantaran ,iclb -s emulator-5554 shell
ls atau ls -1 df fnsmod n -s ,/privalelvar / run/resoIv. conf / eLc/ resolv. conf
top s leep nkdir
fsckmsdos ki I1 rm Agar dapat memodifikasi file system Android langsung pada perangkat
Mount vmstat dmesg Anclroid tanpa PC host dapat digunakan tool busybox, merupakan aplikasi
Mv plnq stop , onsole based yarrg mendukung iebih banyak perintah UNIX-based
Rehoot l-n LdL rlisebabkan shell Android hanya menyediakan sedikit perintah. Untuk
.11.
chown rincian tool busybox dapat dilihat pada bab
Netcfq ctd
Chmod wipe umount
Renice i f confiq rmmod Dalvik Debug Monitor Server (DDMS)
date i ftop lsmod
I)i clalam package SDK Android tersedia tool debugging berbasis CUI disebut
l),rlvik Debug Monitor Server (DDMS), yang menyediakan berbagai fitur,
sr.lrerti seryice port forwarding, screen capture, detail informasi dari suatu
tltraad dan heap pada device, logcat, state emulasi transmisi radio, emulasi
grcrrerimaan teleponlSMS, emulasi data location, dan lainnya. Aplikasi DDMS
r l,rlral ditampilkan dalam dua mode yaitu:
l. Berupa tampilan single window DDMS (Gambar 5.23a), yang dapat
clijalankan dengan beberapa cara:
a. Pada windows XP, gunakan Start menu --> klik Run, jalankan
perintah ddms (Cambar 5.21a), untuk windows 7 cukup ketik
perintah dclms pada launcher start menu (Gambar 5.21b).

llAltrr l),r,,,rr rl,r.,,rr liltK Arrrlrorrl 105


104 PemroJlantan Smart Phone Mentlfi,Unakan 1il)K Arrrlrrrrrl rl,rrr ll,rr l'trr1' Atrrlt|trl
lffiffii*ffi,.
_
,i? l r .4.,r *J n ;r}]r*" |,ilk
l-t1-!i:i:r;{t. srt t'*S*} "r{

i::r :.,

1t f",:
-l

- '
,
l._--:'_l

(a)

Gambar 5"21 (a) tlenu Run pada witdows XP (b) ! aunchcr pisci;t u,,indor,t:, 7

b. Atau pada comrnand prompt (dengan nienj.rl.lnkarr perintah


cmd pada window run di wilrdows XP ;rtau 7), liernr:dian
masukk;ln perintah cidms pada cornrnand prompt ti:rsebut.

2. DDMS yang ditampilkan di dalam window aplikasi Eclipse (setelah


piugin ADT terinstalasi) yang ditunjukkan pacla Canrbar 5.23b.
Dengan mengklik menu Window -+ Open Perspective --> DDMS
(Cambar 5.22a). (a)

Setelahwindow DDMS berhasil muncul, akan tarnpak icon DDMS


perspective pada kanan atas window tclipse (Carnbar 5.22b).
:t,'o
,..,.,,,,..,1t.
r*:tYBi&'&:* "*. - d; *r*-ft,,t,*I*a.
E 1.....

iser*m'r 1&&
i*$ Ilf-ii*ilr
*&*iE*ts.

&*{t
[, ,i amrs i; rn

.,, "..*r.r. , '

.l

(a)
(a) (b)
'r r::'*--:--:
..'., :-:-.1."".., -"."..-.- .,....--.
4
.|

r* !
*-: : . .*#{ir}"* -i- v fT=:
Gambar 5.22 (a) Menu DDMS pada IDE Eclipse (b) icon Perspective DDMS

DDMS berfungsi sebagai penghubung antara IDE dengan aplikasi yang


sedang berjalan pada perangkat Android. Disebabkan setiap aplikasi yang
berjalan pada Android memiliki proses yang berbeda dan proses tersebut
menggunakan host VM secara terpisah. Sehingga setiap proses akan dapat (b)
dipantau oleh debugger pada alamat port yang berbeda-beda.
Gambar 5.23 Tampilan DDMS patda (a) sngte window dan (b) didalan tDE Ectipse
Saat DDMS mulai berjalan akan terhubung dengan aplikasi adb dan memulai yang menunjukkan telah terhubung dengan peranqkat Android atau Enulator
service monitoring device jika tidak terdapat AVD atau perangkat yang
terhubung maka tool ddms tidak akan menampilkan informasi tersebut
(Gambar 5.23).

'106 f'entro5irarnan Srrtari Ptrone Mcn1111un;tk;rrr fil)K Arrrlrorrlrl,rr Il,r, lrrl'nrrJr)t(l l),r',,rt rl,r:,,rr lil)K Arrrlrrrrrl 107
FItur DDMS
DDMS merupakan aplikasi yang memiliki beberapa window dan tergabung
Infb rl'reaJs
I
vi,r Nexp
I a5*mtno*,rrra*er I Sys*nft I fnn*
dalam satu kesatuan grup window. Pada w,indow sebelah kiri atas (Gambai Ii i -'u i stats I uunc I sure I Harrc _
5"24) menampilkan perangkat Android atau emulator yang terhubung dengan 1 1?! yra:t 16t 99 ftarr
tool ddms. Dari tampilan tersebur dapat diidentifikasi VM yang aktif, dengan *l !?4 m:rart t3 17 H€apir.'oiker
menampilkan nama package tiap aplikasi yang berjalan pada host tersebui. *"{ 115 'r,n'i:'ait t' 0 Sgnd Catclrrr
1?6 runr**c f51 563 -)o'/,lP
i2f n&rve 0 0 Eirder Tkrad *1
slslBj ffiSl :qJ D l?9 natr-'e U C' Sinde{'nread *2
7 149 xart 0 I Rll,Sender
i+.E1-*1*sd,*ewlf, i
a 151 litled-vc.xt ?41 151 RllRc<,civer
*a{f*d.trof,tr &l?tr l
l*cr,xviro*d.cf-*rt !i Gambar 5.26 Tab Threads
afxtgsd.o.D€rn?.ff*<ti
Pada tab tersebut ditampilkan beberapa kolom:
aofi.and6*,;rsn:.. '}
oan,{dr*odd ffis . lD : merupakan ID unik dari penugasan VM
t**r,y,drpd,crai
cm.r,&od.g"c@
l
. Tid : lD thread Linux, untuk bagian proses main thread akan
ion.!.*r*,csj$:*: *r\r ditampilkan nilai yang sama dengan process lD yang
'. fr :rlr:srt';*r: i tampak pada window sebelah kiri
::lI,to6{)t.n"iaj.; .:,{,-jt, 1.&; :' . Status : merupakan status thread VM. Untuk thread daemon
igr,*rdr:.$j -
-t, ditampilkan kode astersik (*), juga ditunjukkan level status,
r{ l:
,:, ,, dengan rincian sebagai berikut:
Gambar 5.24 Tanpilan DDMS yang terhubunq dengan Emulatlr AVD Can perangxat Antiroid . Status running, yaitu saat dalam state aktif atau
telah dieksekusi
Pa,ria window selrelah kanan atas rJitampilkan tab displav beberapa rnformasi . Status sleep, saat thread mengeksekusi sleep ()
dan tcrol{ocri untuk debugging. Diantaranya adalah: . Status monitor, yaitu thread dalam kondisi
- menunggu lock
1a.binfo, menampilkan intbrmasi umum patla VM yang dipiiih, berupa
lD proses, nama package. dan versi VM (Gambar 5.25)" . wait, thread dalam kondisi Obj ect . wait ( )
. native, thread eksekusi code native
{nfq l:t,}!llds I wrruao l*ocaum'rraOccr . vmwait, thread menunggu dari VM resource
O0h'i<Nae I i"es .
App d*scrpbon; cm.ar*cd,dpnr zombie, thread dalam proses pemusnahan
H4 Yc!'sori; Sahr* Y 1.2.0 . init, thread proses inisialisasi (tidak terpantau)
Process ID; 131 . st.arting, thread proses awal eksekusi (tidak
Srppo.A fiofikrg Col'rkd: Yes
S{Jspotrb I-FROF Contsdr Yel
terpantau)
. utime : waktu kumulatif yang dibutuhkan untuk eksekusi kode
Gambar 5.25 Tab lnfo level user, dengan jangka waktu sekitar'10 milidetik
. stime : waktu kumulatif yang dibutuhkan mengeksekusi
Tab Threads, menampilkan tread yang berjalan pada VM tersebut. kode di
Dapat di-update secara langsung dengan mengklik button Refresh. level sistem, dengan jangka waktu sekitar 10 milidetik
. name : nama dari tiap Thread
Pada kolom ID dan Name memiliki nilai tetap, sedangkan
nilai kolom lainnya terus berubah secara periodik yang
.rk.rn {<'r-r4rr/alc ser:ara otomatis tiap periode 4 detik.

108 Pomrograman Sntart Phrtrte Merr1111rrn,rk;rrr 'll)K Arrrlrrul,l,r,llr, Irr,t,/\rr,hlrrl


llAllrr l),r,,,u rl,r,,,rr lil)K Aulrorrl 109
Tab VM Heap, menampilkan heap status dari VM. tO I ,tt**C& I n*a*an I it{E!6m1.{*r I fprrfu g,s,,h{r c^*d lt
Inh I I}teidr fi ,** lfh.B$e11?rdr*r | $t*rtu I En"n hrcdl&d { *s1lr0 l'
lieaa r${rk $d hiB€fi a*er ercry GC & t* dtr:t
l'
s+bs lffi:i '

ift ?,935 9$.318 (! 168 ?55.336XD E


srt 6bldr ,i*.:il] 1.6:l HA 16S 5608 E
d6 ohle{l a.$90 r*1.5t* iG 166g rrES 168A
l..tL516y &f!!!,bodcm$l Ls59 258,l:616 aqB S,o?]I€ ,#B
rar*ffir isstQ, d'BE] t.r.508 9,p4,58& 6 ?{8 15,5t31€ *E
+bi& Hrat (objt<tl], ntl, f.iilll 5.976 {56,92t t(E z{8 le,r}316 6{ B
6!re r*y 0rgX, darra:Ii 165 10,]98 l€ ?{s 2,000r€ !iB
M-J6Ya o6!rd r01 15,7S 16 166 8,0rJl(B liB
el ..' . :,i;:]i..rl,rt.:..t.. ,l.:..:a:.il.:.t i
:.r.r.ri:r,.... I

Gambar 5.27 Tab VM HeaP

Tab Allocation Tracker, menampilkan tracking alokasi memori dari tiap Gambar 5.29 Tab Emulation Control
VM (Cambar 5.28). L.ocation Control, menyediakan fungsi emulasi location provider
Cara penggunaan Tab Allocation Tracker yaitu pilih salah satu VM di di mana koordinat longitude, latitude dapat ditentukan user atau
window sebelah kiri, kemudian klik Start Tracking. Selanjutnya klik meng-import dari file, berikut rinciannya :
Cet Allocations yang akan menampilkan proses alokasi sejak tracking 1. Memasukkan koordinat longitude dan latitude dalam satuan
dimulai. Untuk meng-update, klik kembali Cet Allocations. derajat (yang telah di.ielaskan pada sub-bab Emulasi Ceo-
location) ditunjukkan pada Cambar 5.30a.
2. Mengunggah file CPX untuk menampilkan lintasan yang akan
ditampilkan. Alur lintasan dapat di-p/ayback pada peringkat
dengan kecepatan tertentu (Cambar 5.30b).
.l
rE { *f .*.&e.hamr.{l}...gctT?rtldti6k 3. Menggunggah file KML, berisikan data koordinat suatu lokasi
6$ * r&dad.d*n"Ddrd{a,.. h:rdrn"gai dalam satuan derajat sebagai rangkaian proses playback pada
4{ { ;lva,rS"hJfkrFariory rEu"6f&eri6e( perangkat Android (Gambar 5.30c).
Jffe,r*r,*rffefr(bry *{,8yt!erf{ir
4 dah.*,ryrhm,l{rBw,,, nnt 4. Berikut contoh isi data file KML :
}{ 4 org*prek.tt*nm1... &p6t&
4 sxtoid.iidm,bdrnila,., na**eAQ (Placemark)
r+ dClrtaS?*E{fi"B6fsra.". rul
4 rg.ipadt,h.{rilor{y,,, eispate (name)Tugu yogyakarta<,/name)
r{ 4 r{ld.ddn,Oturir'." hm&i}Fr
<description)Tugu, Yogyakarta,
Gambar 5.28 TabAllocation Tracker fndones ia< /de s cripti on>
Tab Emulator Control, pada menu tab ini menyediakan sejumlah fungsi <Point)
simulasi state pada Emulator AVD atau perangkat Android, yaitu:
. Telephony Status, untuk mengubah state emulasi percakapan
telepon dan mode transmisi data (home, roaming, searching, dll.).
<coordinates>1 1 0 . 3 61 021, --l 7829L1,0</
Juga dapat mensimulasikan kecepatan jaringan mobile (GPRS, coordinates)
EDCE, UMTS/3C, dII.). <,/ point.>
. Telephony Actions, berfungsi untuk mensimulasikan panggilan < / pl a cema rk>
telepon atau pengiriman SMS pada emulator.

IlAlt lr l),r,,.rr rl,r,,,rr lil)K Arrrirorrj


111
1'10 Pemrograman Smart Phone Menggunakan SDK Arttltottl tl,rtt ll,tr kttrl1 ArrrIotrl
file KML dapat dibuat dari aplikasi Coogle Earth, dengan menyinrpan
tiap lokasi yang telah ditandai. iqi6 t::,1
* t.*." 9+ Iat . I r.fc ,l i€e&{trt,, ln{e
Sla.19-:{ lSrJ{ ;!:r*r.r -r
Gpt l.* I ' u t--:![ 1!}J{1{i 0lL}: !"-rrr,}r-x
'.nd - f3.-.'.., }}:i-10-!4 li:i-1 :ir:,r-r1
$i!',-,,=.:: iI+ 3119-16-t, !?:if {i{-{-
tr, -. :i. l- r'j.10-rl 1:::t .?..{r--
-i&ala i! 1:-i3-lr ;2: !9 $sf -xr-i
IE un,
LL. --.r<u.:: rf:u/ mx.ra.r
l=] b!,4!,pro9 ;SI-l AnlO.Oa'1s ?IE; s{<-
:db *::0 61.$lm jr,?trrj Ct ranaadata :1ri,3QA-t.5 !5:0, drur.s.x
lF,liq{l I\r}W I l*c :ttl"r.!-1, };!:19 *m-r-r
r!: I er i0f0{n-I5 ?}07 {tt6rr-wd
ttr I tarrs m:0-8-15 }}:0? drffr-x
i.fl 3 txr:r+rk l0rS{$-15 22;07 *kr-rr-r
L4$t I-r"::"0d10{6 F&b }}07 *xxr-x.r
l0lr-08-1.5
t*S l:r,r:roc U I rn€dtt lotr{8'15 .!}07 drax.r*
ir te l?:01 rhlry-$-r
:810,0S.15
.igj,',::,,,r g !sahry
l [l,titr,t' "t' ffiJl Kli @-l,ll. ..., r,ll .
tl"*
:01O&-t7 15r19 #r,m,Es
!qtS*!-15 t5:07 dev-r-r
(a) (b) (c)
Gambar i.31 Tampilan window file explorer pada ddms

Gambar 5.30 Enulasikoordinat (a) input manualkoordinat longitude dan latitude.


Menggunggah file (b) GPX atau (c) KML
Kita dapat memasukkan atau mengambil file dari perangkat Android secara
langsung. Tetapi, pada Emulator AVD terdapat ketelbatasan yaitu saat
riimasukkan suatu file atau dihapus, emulator iidak mendeteksi perubahan
DDMS juga menyediakan fungsi File Explorer (Cambar 5.31), yang rneski pun d i lakukan re-mou nti ngsDCard, untu k meng- u pdate peru
dapat diakses melalui menu Device -+ File Explorer berfungsi untuk lrarus dengan merestart Emulator AVD.
bahan nya
mengakses suatu file dari kartu memori SDCard atau dari file system ke
komputer host. Fungsi ini identik dengan perintah pulJ- dan push sed.anglan pada perangkat Android fisik, setelah perangkat ter-drsconnect
pada tool console based. rlari ADB.atau melepas kabel USB otomatis akan men"-scanning memori
SDcard sehingga perubahan data akan terbaca oleh perangkat.
llerikut beberapa fitur tambahan tool DDMS :

- Screen Capture
Berfungsi untuk merekam screen shot dari display Android atau
Emulator (Cambar 5.32). yang fungsinya sama dengan print screen.
.U-!.tr\ menggunakan fungsi ini, klik menu Device
jSc.een Capture.
Klik save untuk menyimpan ke file, atau klik Refresh untuk meng-
update tampilan screen shot.

112 , Pemrograman Smart Phone Menggtrnakan S[)K Arrrlrorrl rl,ilr ll,rr krrr1, Arlrlrrrrri llAlirr l),r,,,rr rl,r,,,rr lil)K Arrrlrorrl 113
;rlil{"'' Xt;
l:mffi-3**::*J". .i'-: .i
CaurrC m6:
c-' l-- ll
.:]:
.*

f :a q,,. ra !:r;ax
{+:'3
.-.
-il r. !:t*
lqB i I

Gambar 5.32 Window Screen Capture

Exploring Process, ditunjukkan pada Cambar 5.33 untuk menampilkan


(a)
keluaran dari perintah "ps -x".

Hrr *-HffiEry
,!L?.,{S,.lr:,.,,.,.,,.... . .,, r li
.,

ryff ,i lx-e. ,.tt!r.ilse*i


'ri ki:?v{'lr

,.trrlll lrx rx li*r


Ft,[Blt
i rltt::lnlx.l.. *len

lraiaaa.--a,r !r!raL i*Li{


S'3*{i&tld

*r5;:rtrltlt**l! tiit:
:r*1 r., tatr&r*rr .. f,t!:
!.u..r*, hf,niiir| ..,'lti:

Gambar 5.33 Window Exploring Procxs


rl-* . i
&-IE!f,..l
Dumpsys dan Dumpstate (logcat) dari Emulator AVD atau perangkat (b)
Android. Untuk menggunakan fitur Dumpsys (logcat) dengan mengklik
menu Device -+ Run Logcat... (Cambar 5.34a) untuk fitur Dumpstate Gambar 5.34 lanpilan window (a) Dunpsys dan (b) Dumpstate
Dalvik dengan mengklik menu Device -+ Dump device state... (Cambar
s.34b).

114 Pemrograman Smart Phone Menggunakan SDK Androt<l rl,rtr ll,rr krrrg Arrrlrottl llAllrr l),r,,,rr rl,r,,,rr lil)K Arrtlrorri
1't5
Mematikan VM
Setiap VM yang berjalan pada perangkat Android dapat dimatikan
melaiui tool ddms secara remote dari PC menggunakan menu Actions
-+ Halt VM, yang sebelumnya dipilih VM yang akan distop pada
window VM.

-oo0oo-

Dasar Pemrograman Android

dibuat. menssunakan SDK Android seturuhnya


lgl9:l
rxrrbasrs l:9Joid
tramework,yang
Java. Librari. atau pustaka Android tidak berhubungin
<krngan
.librari Sun Java dan saring tidak kompatiber (contohnya swing).
Karena librari Android hanya dirantang untuk perangLit L"ia,
L*bedded
rk.ngan jalur distribusi yang terpisah.
tl.rgi pembaca yang telah. bahasa.pemrograman Java dapat dengan
rruciah membuat aplikasi T"r.lgr.",rl
Andioid. Tetapi, iika pem6aca masih
**rr, daram
r x'rn rograman Java, d iharuskan mempelajari dasar pem

rl,rrr buku,tainnva karena pada bab ini tiaat di;eris[an


rograman bahasajivi
iiiui f"Iiogru,-.,un
l.rv,r. Mcskipun tetap akan diulas berbagai method-method Jan
crass Apr
Arrrlroid rlari project-project aplikasi padJbuku ini.

116 Pemrograman smart Phone Menggunakan sDK Andnrrrl d;ttt ll,tr krrtl: Arrrlroirl
Package Core Android android. os: menyediakan class untuk pengaksesan pada
lingkungan OS Android, diantaranya BatteryManager,
Karena aplikasi Android berbasis framework Java sehingga struktur penamaan E i I e Ob s e rve r, H a n d e r, L o op
-pore.-lt.-r-r Binder,
e r, Arn
J-
r ;.
package librari Android identik pula dengan package Sun Java, diantaranya: android-provider : terdiri dari crass-crass prebuirdS"content
. java. lang sebagai core dari class bahasa Java provider yang disediakan Android.
. java. io menyediakan fungsi input dan output android. telephony: menyediakan fungsi class untuk akses
. j ava. net untuk fungsi koneksi jaringan lLocation,
telepon, seperti Ce1
. java.util merupakan class utilitas, pada package ini
PhoneNumberUtils, dan TelephonyManager yang berfungsi
termasuk class Log yang berfungsi untuk
menentukan nomor telepon, nama operator, jenls
laiingan. ti[" t"f
dan nomor SIM Card. "p"n,
menampilkan LogCat
j ava. text menyediakan fungsi utilitas handling teks
android- text: terdiri dari crass untuk pemroses berbasis teks.
j ava . math menyediakan fungsi operasi matematika dan
android-utir-: sekumpuran utiritas untuk proses manipurasi teks
atau XML.
kalkulasi angka
j avax . math class-class fungsi jari ngan
' android.view: menyediakan fungsi untuk Ur, terdiri dari crass
Menu, View, ViewCroup, dan rangkaiin listener atau callbick.
j avax. security class-class yang menyediakan fungsi sistem
security ' android. webkit: berisi crass-crass untuk fungsi browser web.
. javax.xml class-class untuk XML berbasis DOM
' android-widget: berisi crass-crass erement kontrol Ur tambahan
yang bersumber dari crass View. widget tersebut Jirnirr*yr,
. org.apache class-class untuk XML berbasis SAX (Simp/e Checkbox, Datep,icker, Ed.itText, Listiiew, frameLayoui,
Button,
APlfor XML) CridVi"*,
lmageButton, MediaController, progressBar, RadioButtfn.'
. g."dl?id.speech: berisi class untuk fungsi speech recognition
(deteksi ucapan), class ini hanya tersedia pada
Package yang dirancang khusus untuk perangkat embedded Android dapat 5S *rrii.s ke aras.
diketahui daii nama domain package android, sedangkan package yang . android.sax: package ini menyediakan fungsi utilitas SAX yang
memiliki nama domain com.google adalah librari yang dikembangkan didesain untuk perangkaiembedded Android.
oleh Coogle untuk fungsi API agar dapat mengakses ke sejumlah Coogle ' android. sensor: package ini memiriki sejumrah subcrass
service, berikut adalah sebagian package tersebut: untuk fungsi sensor-sensor yang tersedia pra, p"rant[ai.
contor,nya
. android. app: merupakan package untuk akses application acceIerometer, compass dan gyroscope.
model Android dan penyedia main class yang di-inc/ude pada ' androi-d.rocatlon: menyediakan sejumrah crass untuk fungsi
Application. layanan berbasis lokasi, diantaranya LocationManager
sebagai
. android. content: merupakan package implementasi Content penyedia akses ke location service, berupa rayanan
t"ol3."tion yung
Provider untuk mengakses data dari storage. {1nat _t9r;updare secara otomatis ,"r,8*unrk"; ffig;; provider
CPS (Clobal positioning Sysrem) atau lo6tion proriO"r?"ng"n
. android.net: package yang meyediakan implementasi API untuk
mendeteksi ID BTS (Base Transceiver Station)Seluler atau
."r,
jaringan socket-level dasar. Berisikan sejumlah class primer diantaranya Hoispot WiFi.
URI (Uniform Resource ldentifier), ConnectivityManager,
. com . googJ-e . androi-d . mapq: package ini menyediakan fungsi
Localsocket, LocalserverSocket, Proxy, juga fungsi akses dari service co_ogte
.lass, diantaranya:
uapi aan ai alramnvai"rr*; sejumrah
HTTPS pada level browser atau iaringan.
Projection, dan MapActivity. .Ceopoint, MapView, M"da;r.lE; overlay
. anCroid. graphics : terdiri dari primitives untuk grafis, seperti
Bitmap, Canvas, Camera, Color, Matrix, Movie, Paint, Path, Rasterizer,
-lypeFace.
Shader, Sweepcradient, dan package librari tersebut tersimpan dalam satu
bundling package
. android.opengl: merupakan class utilitas untuk pengoperasian "r'lrrrrrh
r rrr l . icl . j a.r dengan pendistribusian secara mandiri otur, coo'gf"
dari"m
OpencL ES. l,rk.l S[)K Android. Seliap versi android. jar disesuaikan Je-rigan versi

Pemrograman Smart Phone Menggunakan SDK Artrlrrlrl tl.ut ll,tt kttt[: Ailtlrttttl
llAll (r l);r:,ar ltrrrrrollrarrran Arrdrrlrrt
118 119
API karena dari tiap versi terdapat penambahan librari untuk fungsi tertentu ' Pada kondisi default, aplikasi berjalan dalam proses yang terpisah. sistem
seperti yang telah dijelaskan pada Bab 2. Android akan memulai proses jika ada kode yang perlu dijarankan dan
ditutup l<etika tidak diperlukan lagi sehingga resource dapat digunakan
oleh aplikasi lain.
Tipe Data Primitive Pada Android ' Tiap proses menggunakan vM tersendiri sehingga tiap kode aprikasi
Tipe data primitive atau dikenal sebagai tipe primitivu p19u Android sama berjalan secara terisolasi yang tidak mempengaruhi kode aprikasi
seperti bahasa pemrograman Java. Yaitu String, Boolean, Character, lnteger, lainnya.
Short lnteger, Byte, FlJat, Long masing-masing tipe data tersebut didefinisikan ' setiap aplikasi diberikan sebuah kode User lD un ik. yang kepemirikannya
di Tabel 6.1. (permission) diatur agar file aplikasi tersebut hanya dapat dilihat oleh
user yang menggunakan dan aplikasi itu sendiri. Meskipun demikian,
Tabel 6.1 fipe Data Primitive yang didukung Android terdapat pula metode untuk mengekspor ke aplikasi lainnya.
l',rrl.r Ar"rdroid, sistem memungkinkan mengatur dua aplikasi untuk di-share
l-ebar data t,,rrlu user-lD yang sama sehingga masing-masing aplikasi saling dapat melihat
lrl. lainnya. Untuk menghemat sumberdaya sistem, Linux process mengatur
:Boolean' ,rPlikasi 1'ang berjalan dengan user lD yang sama dan di-share pada vM yang
',. tn)(1.
char
byte- ,-u- _
,51S1--e"qynpg.el ;o.9,J -,\.tz?.ttttt68d.tL! l

f short 5rgned rnteger u lo otr , _r!!?9 !1"'56o !'a "_!_ Komponen Aplikasi (Application Component\
ar )^ I . - ' -
'-2147483648 htngga l',rrl.r sistem Android memiliki fitur utama yaitu suatu aplikasi
int Signed integer 0 32 bit dapat
1: 2147483647 ,r,'rrrlgunakan unsur-unsur aplikasi lainnya selama diijinkan oleh aplikasi
, , -9223372036854775808 l.rs.but. Misalnya, suatu aplikasi A membutuhkan tampilan scrolling list
long 'Signed integer 0L 64 bit hingga ,i,rrrl)ar dan aplikasi B yang telah dibuat pengembang lainnya teriedia
9223372036854775807 ,
Irrrrg,si scroller yang kompatibel dan dapat diimplementaiikan o[eh aplikasi

float ,5:t,.,75- rloating or 32 bit \ Karena itu, dapat disimpulkan sistem Android memungkinkan aplikasi A
l.i5r"Jr!;f::t rrrcn jalankan perintah pemanggilan fungsi scroller dari aplikasi B, tanpa harus
IEEE 754 floating 0d 4.98-324 hingga rrr.rnbuat fungsi scroller dari awal. Meskipun demikian, kode aplikasi antara
double , 64 bit I

point 1.797 6931 348623157E + 308 :


.rlrlrkasi A dan aplikasi B tidak saling tercampur ataupun ter-/ink, sistem hanya
rrr.rrjalankan sebagian fungsi dari aplikasi B untuk waktu yang diperlukan
",
I
l.l.
K.tika aplikasi lain memerlukan suatu fungsi dari aplikasi lain, sistem harus
Komponen Dasar Penyusun Aplikasi Android rrr.njalankan sebagian aplikasi yang memiliki fungsi tersebut dengan meng-
Setiap source Android (yang terdapat di daianr sLiatu package) akan ,r',t,rntiato objea. setiap aplikasi Android memiliki beberapa {o^ponert
cliko*pilrsl bersama file clata dan file resource aplikasi yang dibundle oieh ,l.rTra agar sistem meng-instantiate dan dijalankan sesuai kebutuhan.
aapt'(Android Asset Packaging foo/). Tool irri bertungsi untuk membuat, | ()nrponent tersebut adalah:
menampilkan, meng-updat", ain penggabungan sejumlah class bytecode
hasil kompilasi ke [ackage terkompresi yang berekstensi .apk
(dengan
t- Activity
format kompresi sama Pada ziP). Activity dapat diteriemahkan sebagai satu fokus tampiran interface
File apk merupakan package aplikasi final yang dalam file tersebut hanya yang diaktifkan oleh user. Misalnya, sejumlah Activity yang ada
n"riri tut, aplikasi Android-dan dapat didistribusikan atau diinstalasi pada dalam aplikasi_Messaging sMs (cambar 6.'r). Diantaranya Aitivity
setiap perangkat Android atau Emulator' A4cssagelist sebagai Main Launcher Activity, merupakan Activity
yang pertama kali dijalankan saat user membuka aplikasi SMS
Suatu aplikasi Android dapat berjalan di ruang lingkup yang berbeda-beda, <lcngan menampilkan daftar pesan-pesan SMS yang maiuk. Activity
diantaranya :

120 Pemrograman smart Phone Menggunakan sl)x Arrrlrorrl rl,rtr ll,rr krill: Atttltotd llAlt {r l)asar l)errrroprarrran Arrrkrlrrl 121
kedua, NewMessage untuk menyediakan penulisan pesan SMS baru, 0,
menu . add ( i kas iku . MENU_LOCATION, 0 ,
ap1
Activity Inbox sebagai penampil pesan yang tersimpan, Activity
Search untuk fungsi pencarian pesan tersimpan dan Activity Settings getResources O . getText (R. string.menu_Iocation) ) .
untuk penampil konfigurasi aplikasi SMS. setfcon (android. R. drawable . ic_menu_edj_t) ;
Meskipun dari sisi pandang User lnterface hanya di dalam satu menu.add(0, apIikasiku.MENU_VIEW_LOCATION, I,
kesatuan aplikasi, sebenarnya setiap Activity bersifat independen dan getResources O .getText (R. string.view_location) ) .
terimplementasi sebagai subclass dari base class Activity.
set I con (android. R. drawable . ic_menu_zoom) ;
G tt:iiu fgtlu'ttr tls$regnllrt menu . add ( 0, aplikasiku . MENU_SpEC I FY_LOCATION.

,l}$r:r lc
2, getResources ) . getText (R. string. specify_
(

Adivry location) ) .setfcon (android.R.drawable. ic menu


tlsrliJiEBBEfls
search) ;

3,",, Lr F.nlr*rrn l.i.s'r ! t:53tL,


Altrcr ke 2. Service
irdivitytrbox service tidak memiliki visual user interface karena berjalan di level
$*rm r'flit* lF rnfft !t :1fir!,{ background untuk jangka waktu tertentu. setiap service merupakan
extend (perluasan) dari base class Service. Contohnya, aplikasi
Med.ia Player, saat user membuka aplikasi Media player dan memilih
playf ist. Aplikasi akan mengaktifkan Activity service Media prayer di
level background, selanjutnya sistem akan memerintahkan seryrce
. pemutar musik (Gambar 6.2a) untuk tetap aktif meskipun Activity
main layout Media Player telah tertutup atau menuju ke state
onStop ) . Meskipun demikian, sistem Android mengilinkan user
(
A6$rrtlySatrn menonaktifkan service aplikasi secara paksa, melalui menu settings
-+ Applications -+ Running Services -+ pilih Servjce Target _+
pilih Stop (Cambar 6.2b), atau dapat pula digunakan aplikasl Iask
m**r*sernrus Manager.
saat service dari suatu aplikasiaktif akan tampak icon pada status
Gambar 6.1 Beberapa Activity pada aplikasi SMS Messaging diAndroid
Bar Android, contohnya icon E!- yaitu service aplikasi Media player
(Cambar 6.2).
Aplikasi SMS yang ditunjukkan Cambar 6.1, saat user men-tap
menu icon Compose akan terinisiasi Adion Intent yang akan
mengaktifkan Activity NewMessage, untuk menampilkan
layout Ul untuk penulisan pesan SMS.
Menu aplikasi SMS adalah menu template, secara default ter-
include di API Android yang dapat langsung diimplementasikan
pada aplikasi. Beberapa template lainnya yaitu Eutton, Text Field,
Scroll Bar, Menu ltem, Check Box, dan masih banyak lagi. Kita dapat
langsung memanfaatkan kontrol interface tanpa harus membuat.
Berikut contoh implementasi penggunaan menu template method
menu. add:

122 Pemrograman Smart Phone Menggunakan SDK fuxlrtxl tl,rtt ll,rr krtrli Atldroid llAll (r l)asar l,emrograman fuxlror<l
123
,,rdrIrld
l*^.ffi
& *$ila*rtr rd.1crru.t crrc;

_ " fril!1pr,"
F.*r,ir*
*-- ,la},n(rtr;,;;;1. tlir tlr:gr

c$ai;iar&s i l!&:. Irta**:rt'I! 'n ! (a) (b)


(a) (b)
Gambar 6.3 (a) Broadcast E-mail dan unduhan file (b) Notifikasi persentase unduhan file
(b) Stop seruice
Gambar 6.2 Tampilan (a) Savie ttldia Playu dan Broadcast Receiver juga tidak memiliki user interface, tetapi dapat
memberikan response act ivity dariinformasi yangditerima. Contohnya
Untuk Service media player bersifat time-consuming sehingga NotificationManager
untuk menghindari de/ay untuk memberikan peringatan ke user.
*fii, attit pada main'thrLad aplikasi,aplikasi lain tidak bisa men-
;;;';";;;;r[-tn"rd lainnva' sehingga
aplikasi lainnya
Broadcast memiliki dua tipe class, yaitu :
shutdown componentatau Ul medii player' Service
vane bersifat time-consumrng juga selaiu aktif pada main thread' o Class Context. sendBroadcast menggunakan metode
player atau game' broadcast normal yang bersifat asynchronous. Seluruh Broadcast
con[ohnya service aplikasi video
Receiver tidak memerlukan pengurutan karena umumnya
3. Broadcast Receiver seluruh receiver aktif secara bersamaan.
Broadcast Receiver merupakan component
yang tidak menjalankan o ClassContext. sendOrderedBroadcast menggunakan
i"*i.", t"trpi hanya berupa broadcastingdan receive announcement metode broadcast secara berurutan, yang dalam satu waktu
kode
iinror-r"ri peneri*arni.-'siora."rt diimplementasikan dalam pengiriman broadcast hanya diarahkan untuk satu receiver.
level baterai,
iiri"*l ai",i,"r""vi n".rrnssi untuk menginformasikan aplikasi dapat
Broadcast akan dialihkan ke receiver lain setelah receiver
,"irUif,"n konfiguraii atiu state apliliasi. Suatu pa.i an i n formas i ke
sebelumnya selesai, atau receiver menghentikan proses
i r ari t"t r'
r r ;;;;
r;;, J.irt, * it"l nva, penvam broadcast.
,Jiif.lii
^j lii"'berapa persen dita yang telah terunduh dari internet Bentuk Notifikasi broadcast dapat bermacam-macam, diantaranya
(Gambar 6.3a dan b). lampu backlight, bunyi, vibrate, atau tampilan icon ;[ di status
Setiap aplikasi dapat mengimplementasi. t:,YT!1^,?roadcast bar (Cambar 3.6a), aplikasi browser akan menjalankan Broadcast
Receiver agar menerima informasi yang diperlukan. "P'lflt'-?:^ informasi pengunduhan file saat Activity browser pada state invisible.
memberikai respons pengembalian' lmplementast. b".t". :11t: Pada bab 9, project RSSCuaca akan ditunjukkan cara implementasi
B.oadcastReceiver digunakan untuk penyampalan lntormasl fungsi Broadcast Receiver agar dapat menerima intent ACTION
igar data tersebut tepat diterima oleh receiver' BOOT COMPLETED dari sistem, untuk mengaktifkan servicE
aplikasT RSSCuaca.

124 PemrogramanSmartPtronelt/hnggunakanSDl(Arrthrlrrltlnttll,rrkrrttiAtrrlrotd ItAll {r Dasar Pemrogranrnn Andrortl 125


4. Content Provider Fsdfi$Ukul An<Jrr:rJ
Content Provider adalah bagian terpenting dari aplikasi, I
,---iq-

Brflwger
berfungsi sebagai host dari Activity, Service, atau I
I

Broad.castReceiver sebagai penyedia base class L,r{r !il}rlir.{. Ar:itr


LErr lflarh€r,Adt!4 I
I l"fJlman [ill,(L
Cont en tRe s o l-ve r untuk d mplementasikan ke method standar.
i
ii I l I
Content Provider memungkinkan aplikasi lain mengambil dan
t-----
\---:!
I
t
menyimpan informasi dalam bentuk berbagai tipe data dan dapat ,${,(xsl
menciptakan set data spesifik untuk digunakan aplikasi lain. Fungsi
Content Provider identik server database. Dan kondisi default data
rlctrqlf, ,l$f$iX:
, i*ritr ;
I-
I**
file systern di direktori /data/data,/nama-
tr l
ScffiEe
tersimpan pada . L.l
fi.b
package . ap1J-kasi/namadatabase. db, baik mengguna-
kan database SQLite atau tipe database lainnya. rr i t

Hsl*ru
I Pl{P
Sehingga dapat disimpulkan, Content Provider merupakan layer data
sebagai penyedia data abstraksi untuk client dengan tipe penyimpanan
data terpusat. Ada 2 metode aplikasi untuk dapat menyimpan data,
SLlL

-r
yaitu: hrrllqr&r
a. Menciptakan Content Provider di dalam aplikasi
b. Memasukkan data ke provider aplikasi lain (diperlukan
perm issio n u ntuk men gakses provider tersebut).
Aplikasi tidak dapat memanggil method ContentProvider
secara langsung, maka untuk pengimplementasiannya dipanggil r-
method object ContentRe s olve r. Obfecttersebut berkomunikasi
dengan tiap Content Provider atau Content provider dari aplikasi
lainnya untuk me'manage komunikasi yang berhubungan dengan
LJ
SQL
interprocess. -
Berikut adalah bagan ilustrasi hubungan interaksi antara Activity, Gambar 6.4 Bagan interaksi antara Activity, Service, Broadcast Receiver,
Content provider, dan
database, Broadcast Receiver, Services, dan Content Provider yang user rnterface dari suatu aprikasi yang berrnteraksi dengan rayanan web
berinteraksi dengan suatu web service untuk mengakses suatu data
'\1g,rr lebih mudah mema.hami fungsi Content provider tersebut yang
pada server.
lr.rinteraksi dengan sejumlah A_ctiuily, service, dan sroadci,it-
Receiver,
,l.rlrat dilihat pada projecr RSSUSCS di bab 9 yang mengimplementasikan
, l.rss Content Provider sebagai penyedia fungsi aksei
k" d;;b;r;.

User lnterface
I rr rl.rlam sistem Android, [Jser lnterface dibangun menggunakan
'' r,'w object
dan viewGroup. object view adalah"expr"*i# rr"i' interface
1r,rrl,r sistem- subclass dari class view disebut widgLt
rr rrplt'rnentasi object Ul.
v"ng rJrngsi untuk
(lrrtrrk rnendefinisikan activity Ul diperrukan
sejumlah Apl View dan
.'i,'w(;roup. Pada cambar 6.5 ditampilkan diagiam hierarki Apr View
rl,rrr V icwGroup.

llAll {) l)ir;irr [)r'rrrrolI,rrrr,rn Arxfuorrl


126 Pemrograman Smart Phone Menggunakan sl)K Arxlrotrl rl,r|t ll,rr kttrli Atttlt0td 127
lntent (Componenf Aktif]
,
! lntent adalah Object Intent yang menyimpan content rnessage
F
* ,rsynchronous untuk pengaktifan tiga Component yaitu Activity, Service,
Il{ tlan Broadcast Receiver. Sedangkan pada Content Provider akan aktif saat
.rdanya request dari ContentResof ver. Intent difungsikan pada Activity
I rlan Service untuk mengidentifikasi tindakan yang telah di-request berupa
E
fi pendefinisian data URI yang akan mengeksekusi obiect lainnya. Misalnya,
B ruatu Activity akan menyajikan suatu gambar peta ke user menggunakan
q
E
rt
API Map atau suatu aplikasi teks editor yang menyediakan intent ke aplikasi
E phonebook, agar dapat akses ke database phonebook Android untuk
I
rnt:ngimpor nama, alamat, atau nomortelepon seseorang. Untuk lebih mudah
E rnemahami fungsi intent, dapat langsung diterapkan beberapa aplikasi yang
.rrla di buku ini.

liroadcast receiver berfungsi sebagai announcing (pempublikasian) seiumlah


tillect intent Action. Contohnya, proses pempublikasian aplikasi browser
.,.rat proses pengunduhan file. Untuk informasi lebih detail tentang intent
rncssages dapat dilihat sub-bab lntent dan lntent Filter.

Agar kita memahami fungsi lntent, di dalam bab 8 project CariLokasi terdapat
A<;tivity CariLokasi dan View digunakan untuk menciptakan
Irrtent, yang mengirim data teks sebagai referensi URIyang mengakti{kan
A< tivity Coogle Maps. Sedangkan di bab 9, project RSSCuaca dan
l(SSUSCS ditunjukkan pengimplementasian Intent lebih kompleks untuk
rrrcngaktifkan Activity DispJ-ayDat.aRSS dan Activity PetaGempa.

Shutdown component
K.rrcna tiap Activity memiliki LJI (user interface) dan Activity dan dapat selalu
,rktif dalam waktu lama atau ke kondisi idle. Sehingga, untuk men-shutdown
A< livity digunakan beberapa metode terstruktur, diantaranya:

. Method finish ( ), untuk mematikan Aaivity secara langsung


atau untuk mematikan activity lain dapat digunakan method
finishActivity O, dengan catatan activity yang dimatikan telah
nrengeksekusi method startActivityEorResult ( ) .

. Method stopSelf O untukmenghentikanserviceataumenggunakan


nrethod Context. stopService O.
I lrrtrrk component lain strutdown sistem saat tidak digunakan atau saat sistem
,,grr,r.rsi rnembebaskan memori untuk digunakan component yang aktif.
llrrtrrk penrahaman lebih dalam fungsi Component akan dijelaskan pada
I r.r11.rrr Sikl us (Lifecycle) Component.

{ (,,llx),)(./)l content provider dan broadcast receiver tidak perlu di-shutdown


Gambar6.5DagramrootAPlviewdansejunlahsubctassnya(sumber:AbelsonWF,et,al ,.l.,,lrlril karcna content provider otomatis aktif saat ada request dari
2009)

tl'rrr ll'rr krttt: Attrirottj ItAll l, l),r:,itr l'ltrttogtirttt,rtr Atttltttttl 129


128 Pemrograman Smart Phone Menggunakarr St)K Arxhoxl
ContentResolver, sedangkan broadcast receiver akan aktif ketika respons stack. Saat user menekan tombol. BACK, Activity yang
message dari Broadcast. tertutup akan kembali
ke posisi stack sebe|umnya dan di-resume t",ti,ii-rZn;iai'n[tiuiiv
rr.tir.
Dalam satu stack terdapat sejumlah obiect dan suatu task
dapat memiliki
Activity dan Task lebih dari satu instance di daiam Activiiy yang sama. Contohnya,
sejumlah
i.n.stance yang berupa potongan-poton8an'(t,/;d
Seperti yang dijelaskan sebelumnya bahwa suatu Activity dapat menjalankan iriee-ai-lpiiklsi coogte
Map tersebut memiliki entry stack yanglerpisah.
Rctivity dari aplikasi yang berbeda. Misalnya, saat aplikasi menampilkan peta
jalan pada beberapa lokasi. Untuk menjalankan proses tersebut diperlukan Di dalam stack dan dalam kondisi aktif sistem tidak akan mengkonstruksi
membuat object Intent yang akan menyatukan seluruh Activity-activity trlang,. yang.merubah posisi stack menaik atau
menurun. Untuk mudah
dengan memasukkan informasi yang diperlukan dan dikirimkan pada rnemahami kaitan antara Task d.e.ngan Activity stack yang
stirtActivity O . Contohnya pada aplikasi Compass (Cambar 6.6) lerdapat sejumlah insrance dapat diritiat cambar'o.a yr"g
ui aaramnva
yang dapat mengakses Activity Google Maps. .lika user men-tap panah merupakan perpindahan posisi Activity
."irriri.kan arah
iombol ilack, sisfem akan mengembalikan user ke aplikasi Compass pada
aari *at t,ite;;kil.
kondisi sebelumnya (kembali ke Activity Compass), sehingga seolah-
Acrriry$E<t
olah aplikasi Compass memiliki fitur Coogle Maps.

3 mrrr fA"*r irr*

Gambar 6.6 Aplikasi Compass yang mengakses Adivrty Google Maps

Hal ini disebabkan Android dapat me-maintain user experience, dengan


tetap menyimpan kedua Activity di dalam Task yang sama..Task adalah suatu
pengelompokan yang dapat dianggap user sebagai.suatu kesatuan aplikasi,
yan! sebenarnya adalah sekelompok activity yang berkaitan dan terkumpul
di dalam satu stack. Task merupakan kumpulan sejumlah stack activity,
bukan merupakan sebuah class atau element dari file manifest. Gambar 6.7 Diagram Activiry stack yang terdapat sejunrah instance
dan hubungannya dengan Task (Sumber; Meiet
ini sebagai application
Task diawali oleh Root Activity dalam Stack, Activity R, 2010)
launcher. Setiap Activity yang aktif dan dalam fokus user akan berada di I )'rri Gambar 6.8 tersebul gupul_ disimpurkan bahwa
tingkat stack teratas. tampiran urutan task,
rk.rrr lah representasi dari Aciivity aplilasi
l rr
karena st ata piioritaiJitentukan
Saat menjalankan Activity baru, Activity tersebut akan ditempatkan di stack rl.rri k.f,kusan dan ada.nya interaksi dengrn Activity
r"in,iy, itiu melibatkan
teratas dan Activity yang berjalan sebelumnya tetap dipertahankan di dalam Ar tivrty dari aplikasi lainnya.

130 Pemrograman Smart Phone Menggunakan SDK Arrtlrotrl tl,rtt ll,tt ktttg Androtd llAlt tr l),r,,;rr Ihmrograrrrarr Arrrlrrrrrl
131
Siklus (Lifecycle) Gomponent
. void onRest art () dipanggil saat state saat restart atau membuka
Tiap component aplikasi memiliki siklus (/ifecycle) terpisah, dimulai saat kembali Activity
meng-instantiate aplikasi tersebut untuk merespon intent dan berakhir saat .
instance ter-destroy. Antara proses tersebut terkadang component dalam void onResume O dipanggil saat state me-resume Activity
kondisi aktif atau non-aktif. Atau dari sisi pandang Activity, apakah dalam . void onPause O dipanggil saat state Activity dalam kondisi pause
keadaan terlihat (visib/e) oleh user atau tersembunyi (invrsible). . void onStop ( ) dipanggil saat state Activity tidak aktif
Bagian ini membahas lifecycle dari Activity, Service, dan Broadcast Receiver. . void onDestroy ( ) dipanggil saat state Activity proses kill (oleh
Termasuk lifetime state dan method-method yang akan menotifikasi user sistem atau manual)
berupa proses transisi tiap state dan kemungkinan dampak state saat berakhir []ntuk mempermudah pemahaman fase dari tiap state tersebut, kita dapat
proses hosting dan ter-destroy-nya instance. rnelihat bagan yang ditunjukkan pada Cambar 6.8 dan Cambar 6.10,
scdangkan untuk memonitoring tiap state dapat digunakan 3 metode nested
/rnp (loop bersarang), yaitu:
Siklus Activity
. Fase Keseluruhan, inisialisasi setup Activity dalam state global
Setiap Activity di dalam aplikasi Android memiliki tiga state utama, yaitu: menggunakan method onCreate ( ) diakhirimethod onDestroy ( )
. State aktif. Activity yang berada dalam kondisi foreground (latar depan) untuk menghapus seluruh resource Activity.
screen (ditunjukkan pada bagian stack activity teratas dari task yang . Fase Visible,adalah lase Activitysaatpemanggilan method onStart ( )
sedang berjalan). Activity tersebut menunjukkan sedang menjadi fokus hingga method onStop O selama Activity dalam kondisi aktif,
dari action user. meskipun tidak pada posisi latar depan atau tidak berinteraksi dengan
. State pause, yaitu pada seluruh keadaan di luar dari fokus, tetapi tetap user. Di antara kedua method, resource dapat dipertahankan untuk
terlihat oleh user. Atau didefinisikan terdapat activity lain yang terletak menampilkan activity ke user.
di atasnya dengan tampilan window transparan atau fullscreen. Activity . Fase Foreground (latar depan), fase ini berada diantara method
pada keadaan pause dapat ditampilkan kembali sepenuhnya. Pada onResume O hingga method onpause O . Fase Foreground terjadi
keadaan ini sebenarnya Activity tetap dalam kondisi aktif (sepenuhnya saat Activity ada dalam kondisi latar depan layar dari activity lain dan
ter-maintain state, informasi member, dan tetap ter-attach di window saat ada interaksi user. Pada fase ini, Activity dapat pada level state
manager). Meskipun demikian, akan dimatikan oleh sistem jika dalam pause atau resurne.
keadaan low memory. I ).rlam Gambar 6.8 ditunjukkan bagan yang menampilkan ilustrasi hubungan
. State stop, activity akan terhenti total jika sepenuhnya tertutup activity l.rse siklus dari class Activity
dan stack Activity aplikasi lainnya. saat iaat
lain, meskipun Activity tersebut masih menyimpan state dan informasi rliluar fase oncreate ( ) dan onpause ( ) tetap didefinisikan sebagai fase
member. Tetapi, tidak terlihat lagi oleh user, akibatnya window akan ter- ,rktif meskipun display aplikasi tidak terlihat user, contohnya user menekan
reset dan berpotensi dimatikan sistem saat memori diperlukan activity lornbol Back yang akan menutup aplikasi atau kembali ke state aplikasi lain.
lain yang berada pada stack di atasnya.
Sistem akan men-drop suatu Activity dari memori pada state pause atau
stop. Atau mengakhiri Activity tersebut dengan menampilkan request ke user
menggunakan method finish O . Jika user mengaktifkan kembali Activitiy
tersebut akan di-restart ulang dan di-restore dari state sebelumnya.
Untuk me.notifikasi perubahan transition Activity dari satu state ke state lain
dapat dilakukan pemanggilan beberapa method:
. void onCreate (Bundle savedfnstanceState) dipanggil
saat state penciptaan Activity
. void onStart () dipanggil saat state start atau aktifnya Activity

132 Pemrograman Smart Phone Menggunakan Sl)K Andrtrttl rl,rrr ll,rr krrr11 Android
I tAl i (, I ),1,,,1 I'r'rnrol],rrrr,rrr Arrrlrorrl 133
"**"*'."*-" *"-*'E rrnarrrit
'! *'*_-.,
$ihlusActiviU
A.i$VSl# . ' orcref,tg(l
AE{vfiyAIlll I Fnse vleible
lArffBAl ---i--d

J Urdr rEr**i*!
,rplitoiB r lur*rl txrMtt i
\_ -
--" .1 .'- * - .,,,,,,L. .,.*
Fss
ApL.raA.
Fonignlu(rd

mRsmc(!
tffis I

? Frffi*d"m
rTTr+"r r
onPaxfl
-'**-t**-'- h1ffqs#,ffi'

i rdffil{r
I
t{rhk
6mr{tan r!t* tu$*fu hrr
p.rqhflrt.n nnul xnlursi

Gambar 6.8 Hubungan antarActiity state latar depan dan latar belakang (Sumber: Abelson W.E
et, al. 2009) , Sr'{ril9nr.l$h
'. rrcntuorhta,r ntfrrrrr
Proses berlangsungnya loop dan alur activity ditunjukkan pada diagram
alir Cambar 6.9 yang mengilustrasikan untuk tiap level state. Pada bagian
diagram oval berwarna gelap menunjukkan saat dalam state utama suatu . itrdlr0i*:bfiq* I
Activity, sedangkan untuk bagian persegi panjang adalah method callback
(panggilan balik) yang dapat diimplementasikan untuk menjalankan suatu t-:i:-:-t-m:::;1
proses, pada saat dalam transisi Activity di tiap state.
[:
i
F.-r?:ml
iL .s!qH$j},+l
.'" *.. : ^
'';'l
"..'-

-"* ,*-* _
tu rfrflr-
'_.-*;i*-;frirttd .

Gambar 6.9 Bagan alur level state suatu Activity (Sumber: httpl/developetandroid,com)

Mr,rnanggil fungsi ke superclass


(.lrrtrrk mengimplementasikan suatu method siklus Activity,
dapat dilakukan
rk'rrg.rn memanggil versi superclass seperti yang ditunjukkan'di baris ke<
rl,rri krrlt'di bawah ini, y;ritu dengan cara memberikan anotasi override

134 Pemrograman Smart Phone Menggunakan SDX Andttttrl rl,rrr ll,rr krrrg Android llAlt lr l),r,,,rr l\trrrrrgr,rrrr,rrr Arrrlrrrrrl 135
1

Siklus Service
(baris ke-2). Bagi kita yang terbiasa, dalam pemrograman Java Anotasi ini
Dalam pengimplementasian service di Aplikasi Android dapat digunakan
sebenarnya telah lama didukung untuk membangun project aplikasi berbasis
beberapa method, yaitu:
Java J2SE menggunakan IDE Netbeans 1.5 ke atas.
' Method context. startservice ( ) untuk mengaktifkan service
1 publi-c class Hell-oAndroid extends Activity { . Method Cont.ext . stopService ( ) akan menghentikan
2 SOverride service dan tidak berpengaruh dari pemanggilan berulang fungsi
3 public voj-d onCreate (Bundfe savedlnstanceState) {
startService
4 super.onCreate (savedlnstanceState),'
. Penghentian seryice dapat menggunakan method Service.
stopSelf ( ) atau Service. stopSelfResult ( )
5 setContentView(R.Iayout.main); . Mengaktifkan langsungdari program, menggunakan method Context .
bindService () , berupa client process menyiapkan
koneksi
Penyimpanan state Activity dengan object service. Kemudian koneksi tersebut digunakan oreh
Android memiliki keunggulan dalam hal mengefisiensikan dan mempercepat service. Method ini akan mem-binding sejumlah client menggunakan
waktu load pengembalian dari sistem untuk ke state sebelumnya. Yaitu satu seryice.
dengan cara dilakukan proses capturing state sesaat sebelum sistem . Method Context.unbindServlce O untuk menutup servlce
men-shutdown Activity tersebut (dengan melakukan kill-process oleh langsung dari program..
sistem). Proses capturing tersebut dapat dilakukan dengan menerapkan service juga memiliki method siklus yang dapat diimprementasikan untuk
method onSavef nstanceSLate ( ) di tiap Activity. Method rnemantau perubahan tiap state. Terdapat tiga tipe (public) dan tidak ter-
onSavelnstanceState akan dipanggil sistem, saat sebelum Activity lrrotect yaitu:
ter-destroy, atau pada waktu sebelum method onPause ( ) dipanggil. Untuk
febih jelasnya, tahap-tahap proses capturing state dari proses tersebut dapat void OnCreate ( )
dilihat pada Cambar 6.10. void onStart (Intent intent)
void onDestroy o
l'ada sejumlah method di atas, siklus hidup service dapat dipantau pada
kondisi tertentu sebagai berikut:
. Seluruh lifetime service, yaitu antara mehod OnCreate ( ) dan
method onDestroy o . Contohnya, service aplikasi pemutar musik
yang menciptakan thread saat oncreate ( ) dan berhenti pada thread
onDestroy ( ) .
Gambar 6.10 Bagan proses capture state pada suatuActivity (Sumber: Meiec R, 2010) . Saat service aktif, dimulai saat eksekusi method onStart ( ) .
Ditangani oleh object lntent startservice o . Contohnya service
Saat Activity diaktifkan kembali, objea Bundle (sebagai method pemetaan
dari nilai string ke bentuk sekumpulan obiect) akan melewati method aplikasi pemutar musik yang mengaktifkan lntent untuk mencari file
yang akan diputar. Penghentian service tidak memberikan callback
onCreate dan mengeksekusi method lain setelah melewati state
( ) method onStop ( ) . service tetap aktif hingga ada dimatikan manual.
onStart (), atau onRestorelnstanceState O. Method tersebut
berguna ybt kondisi suatu Aplikasi pada suatu state yang sebelumnya telah
ter-capture. l'.rrl.r cambar 6.11 ditunjukkan diagram alir callback method dari siklus
rcrvice.

llAll (r l)a.;ar Penrrograrrr,rn Arxlrorrl 137


136 Pemroliraman Sntarl Plront' Mettllgtttutk;rtl lil)K Arrrlrorrl rl,rrr ll.rr l,rtr1' Atrrltotri
Siklus Broadcast Receiver
Sebuah Broadcast Receiver memiliki method callback tunggal, yaitu:

void onReceive(Context curcontext, Inlent broadcastMsq)


,!
r{ruem{} Saat message diterima oleh receiver, sistem memanggil method
onReceive O kemudian akan mem-pass object lntent berisikan message
tersebut. Broadcast Receiver hanya aktif saat dijalankan method ini. Saat
v onReceive O di-return, Broadcast kembali pada kondisi tidak aktif
sn51r{} (dilustrasikan pada Cambar 6.12) .

M v

-.___*"'.7
t mRBund,U
l Menggunakan method
---L--- sen&roadeaet
t5ervir ba*rrrdi]. onUntird(l Aciivity B
' atau
k:**9j rendord*red8roadcas t
rr
**.*.*t"**,*-r
r mu*srsf 0 on0crrsril
;
Gambar 6.12 Bagan nelhodonReceive ( ) dan return dari broadcasl

IMffi
Gambar 6.11 Bagan method callback suatu service dengan service lainnya (Sumber: httpl/
saat Broadcast Receiver dalam kondisi aktif akan ter-protect dari proses kill.
St,baliknya, jika Component Broadcast Receiver sedang tidak aktif maka
rlapat di-ki// oleh sistem.

devel oper. a n droid. com)


Hierarki Proses dan Siklus
l)ari penjelasan siklus Component sebelumnya maka dapat diklasifikasikan
Pada bagan tersebut ditunjukkan dua service yang berjalan secara terpisah,
lr.rgian dari Component yang tetap dalam kondisi aktif atau dinonaktifkan.
pada service pertama (kiri) diciptakan melalui sLartservice dan service
\r'[ringga, sistem dapat mengurutkan tiap proses tersebut dalam importance
lainnya (kanan) diciptakan menggunakan method bindService ( ) .
Iti'rarchy (hierarki terpenting) berdasarkan tingkat keaktifan Componentyang
Service dieksekusi di dalam method, yang kemudian client menjalankan ,r<l.r di dalam aplikasi dan state komponen tersebut.
proses binding. Karena itu, service tetap menerima panggilan onBind o
I'roses yang dengan level terendah menjadi bagian yang paling awal
dan onUnbi;d ( ) . Pemanggilan service dimulai menggunakan method rlicliminasi dan selanjutnya bagian terrendah di atasnya dan seterusnya.
Context. startservice O atau Context.bindService O -
ltcrikut adalah lima urutan tingkatan yang disajikan berdasarkan derajat
Saat callback onBind ( ) mem-pass object lntent yang melewati
kr..rktifan suatu proses:
bindservice onunbind ( ) meng-hand/e intent yang telah
dan method
di-pass tersebut menuju unbindService 1) . Jika service mengizinkan I . Foreground Process adalah proses saat user aktif mengakses komponen.
proses binding, onBind ( ) akan mengembalikan saluran komunikasi yang Berikut beberapa keadaan yang berlaku dalam tingkatan ini:
digunakan client untuk berinteraksi dengan service. o Suatu Activity yang sedang berinteraksi dengan user, dengan

llAl'l {r [)a:,ar l'ctttrugt.rtrurtr Atttltottl 139


138 _ Pemrograman Smart Phone Menggunakan SDK Anrirord rl,ttt ll,rr ktnl1 Anrlroid
memanggil method object Activity onResume o Android tidak mendukung koneksi internet perangkat mobile Android melalui
o Host yang menjalankan service dan terikat pada Activity yang komputer host. Pada cambar 6-13 ditunjukkan il-ustrasi proses kompilasi dan
berinteraksi dengan user. koneksi antara komputer host dengan perangkat Android.
o Object Service yang sedang dalam proses callback, seperti
OnCreate O, onStart O, atau onDestroy O .
o Object BroadcastReceiver yang menjalankan method
onReceive ( ) .

2. Visible Process merupakan suatu proses kosong atau tidak tampak


komponen di latardepan, tetapi dapat mempengaruhifokus pandangan
user. Suatu proses berada dalam level ini jika berlaku salah satu kondisi
berikut:
o Host menjalankan Activity yang memanggil method
onPause ( ) sehingga tidak berada di posisi latar depan, tetapi
tetap terlihat user.
o Host service terikat dengan Activity pada posisi visible.
3. Service Process, merupakan proses yang menjalankan service, dimulai
saat penggunaan method startService O dan tidak dalam
kondisi latar depan (foreground). Contohnya aplikasi pemutar mp3
yang aktif di latar belakang.
4. Background Process adalah Activity yang pada kondisi tidak terlihat
user dan telah dipanggil method onStop O . Proses ini tidak
berdampak pada user experience, dan dapat di-shutdown setiap saat.
5. Empty Process adalah proses dengan Component aplikasi yang tidak
Gambar 6.13 Bagan pembuatan dan kompilasi project Android
aktif. Proses tetap dapat dipertahankan yang berfungsi sebagai cache,
untuk meningkatkan waktu startup komponennya.
Direktori Project Android
Project Aplikasi Android Sttiap Project Android terdapat sejumlah direktori yang masing-masing
Dalam project Android, terdiri dari sejumlah file diantaranya: Manifest, <lirektori tersebut memiliki fungsi yang berbeda-bedul cirnru, 6.14
Layout, Resource, generated c/ass R.Java, dan source code tersimpan di rnenunjukkan hierarki direktori dan file-file yang ada dalam project Android.
direktori package.
Proses kompilasi suatu project Android berjalan otomatis setiap user
memodifikasi atau me-refresh project. Sedangkan saat user mengeksekusi,
file *.apk otomatis di-upload ke Emulator AVD atau ke perangkat Android
atau melalui koneksiUSB menggunakan ADB. File *.apk tersebut adalah file
bytecode yang hanya dapat dijalankan oleh interpreter VM Dalvik dalam
lingkungan OS Android. Untuk fungsi debugging digunakan tool DDMS
sebagai CUI front end dari tooltool yang berbasis command prompt.

Jika kita ingin membuat aplikasi Android berbasis jaringan internet (misalnya,
aplikasi yang mengimplementasikan API Coogle Maps atau RSS Feeder) maka
perangkat Android diharuskan terhubung internet menggunakan koneksi Gambar 6.14 Hierarki project Android yang di dalannya terdapat sejunlah file
WiFi, melaluijaringan operator (CPRS-3C-HSDPA). Hal ini disebabkan SDK

IlAll (r l),r,,;rr ll'rrrrogr,rrrr,rrr


l\4 ILIK
140 Pemrograman Smart Phone Menggunakan SDK Atxlrottl tl;rrr ll,rr krrrpi Arrtlroid Arrrlrorrl Bsdsn I'crpuriakr{ 1

dra (crr rr,lrrt


Proilnrl Jr*r
Struktur direktori project Android cukup identik dengan project aplikasi Java
MIDP, dengan beberapa perbedaan. Diantaranya, fileAndroidMani f e s t. . Manifest diperlukan untuk mendeklarasikan komponen yang digunakan
xml untuk pendefinisian versi APl, permission, dan fitur localization dan aplikasi. Karena sebelum Android mengeksekusi komponen aplikaii, harus
direktori gen yang menyimpan class autogenerate. Seluruh direktori yang diketahui dukungan ketersediaan komponen yang dibutuhkan Aplikasi. File
ada di dalam setiap project dapat diekspor ke bentuk package terkompresi manifest tersimpan dalam package apk aplikasi Android. Berikut contoh isi
File AndroldMani-fest. xmf :
berformat *.zip atau *.gz untuk kemudahan pendistribusian source code (jika
aplikasi ditujukan sebagai projectopen source). Tetapi dengan pengecualian 01 <?xml version:"1. 0" encoding:-r11-8,,?>
direktori gen (sebagai penyimpanan c/ass generated R.java), direktori gen
tidak diperlukan karena secara otomatis Eclipse akan meng-generate setiap
02 <manl fest xmlns : android:"http : ,/ / schemas . android.
proses import project aplikasi. com,/apk,/ res / android"
03 packagq:"com. samples - hef Ioworld"
E Il9 proiectldlioreir 04 android : vers i-onCode:" l "
E [$ src 05 androi-d : versionName:"1 - 0 ")
m il3 sen [Gere'a:ec Ja,o Fr,es] 06 <application androi-d: icon:"Gdrawable/icon,,
m * ln*cxa a. r androld : 1abe1:" G string,/app name,,)
El a$es 01 <activity android: name:" . He1loworld"
... i:1
Ilj k:,- res OB android : 1abe1:,,G string,/app name,,)
iI *l Android{mifest,)od 09 <intent-filter)
[$i aeraut,poperties 10 <action androi-d:name:"androld. intent -
.rctj-on.MAIN" />
Gambar 6.15 Project Android yang tampak pada aplikasi Eclipse I1 (category android:name:zandroid.
i ntent. category. LAUNCHER" />
t2 <,/ intent-filter>
File Manifest
I3 </activity>
File Manifest merupakan file berstruktur XML dengan nama I4 </application>
AndroidManifest.xml yang merupakan bagian dari pro.iect aplikasi
I5 <uses-sdk android:mi-nSdkVers ion:,,'1 ,, /)
Android (Cambar 6.16). File inr berfungsi untuk pendeklarasian Component
aplikasi, diantaranya librari yang perlu di-link dan identifikasi sejumlah I6 <uses-permission and.roid: name:,,android.
perijinan (permission) untuk diakses oleh aplikasi. 1,r:rmission. CALL_PHONE",/>
l'l <uses-permission androi-d : name:"android.
tS S Android 2.2
1,rrr:mission. INTERNET" />
, 13
L*,
.a
gen :i.,,,
=':;*c .e. a t =:.. I U </manifest>
i-i I + rP(

, B ln} &a'ade I )i baris k*7, atribut name di bagian element Activity


, ilj t* layout rrrcngimplementasikan nama dari activity. pada attribut icon dan 1abe1
r lJ k} val*s (lr,rris ke-6 dan B) mengarahkan ke file resource yang berisikan icon dan label
y,rng digunakan activity untuk ditampilkan pada user.
{1,
il, default.propertes l'.rr la baris 1 5 dan 'l 6 atribut use s -permi ss i on untuk menginformasikan
Li R.EADlvf.bd r('\orrrce yang digunakan Aplikasi, dan untuk memperoleh perijinan user
',.r,rl instalasi sehingga user dapat mengetahui aplikasi tersebut mengakses
rr,\or/r('c apa saja (baik hardware maupun software) dari perangkat Android.
Gambar 6.16 File AndroidManifest . xmf l',rrl.r (lrrmbar 6.17 ditunjukkan salah satu fungsi uses-permission

142 _Pemrograman Smart Phone Menggunakan SDK Androrrl rl,rrr ll,rr krr11, Arrrlrorrl
liAli (, l),r,,,rr Il'rrrrogr,trrr,rrr Arrrlorrl 143
. android:maxSdkVersion sebagai penentu level API tertinggi di
yang ditampilkan saat proses instalasi browser Opera.
mana aplikasi dapat berjalan normal. Sebelum menggunakan atribut ini
Sffif} z,zrnr sangat perlu membaca dokumentasi (uses-sdk>.
[)ata manifest ini serupa dengan manifest pada aplikasi java MIDP yang
berisikan deskripsi keterangan aplikasi, versi aplikasi, dan dukungan versi
r/evice profile. Di saat user meng-insta// suatu aplikasi atau memvalidasi
ulang setelah melalui proses update, sistem Android akan mengecek atribut
. uses-sdk> pada manifest aplikasi tersebut dan membandingkan dengan
rrilai internal level API yang didukung. Proses instalasi dapat berjalan jika
tcrpenuhinya beberapa kondisi, yaitu:
. fika atribut android:minSdkVersion terdeklarasi, nilai tersebut
harus lebih kecil atau sama dengan level API sistem. Jika atribut tersebut
tidak ditemukan maka sistem akan mengasumsikan aplikasi tersebut
membutuhkan API level 1.
. Jika atribut android:maxSdkVersion terdeklarasi maka nilai
tersebut harus sama dengan atau lebih besar dari level API sistem. Jika
tidak maka sistem menganggap aplikasi tersebut tidak memiliki nilai
level API tertinggi.
Gambar 6.17 Fungsi uses-permission untuk menanpilkan permission saat proses
I'ada tabel 6.1 ditun.jukkan element-element yang didukung
AndroidManifest. xml
instalasi

Komponen lain dapat dideklarasikan dengan cara yanB sama, seperti element Tabel 6.1 Jenis Element-element yang didukung AndroidManifest.xml
< s e rvi ce > sebagai element untuk service-service, element ( re ce ive r)
untuk Broadcast Receiver, dan element <provider> untuk Content Etem€nt Definisi' ,

Provider. manlfest) root Pendefinisian package


aplikasidan namespace
.lika pada kode aplikasi terdapat service dan content service yang tidak Android
terdeklarasi dalam manifest maka sistem mengabaikan dan tidak akan pernah
dieksekusi dari Activity. Namun, pada broadcast receiver secara opsional
uses-permission) rool Request dari suatu
dapat dideklarasikan dalam manifest, atau secara dinamis dimasukkan ke oermission securitv
source kode (sebagai object BroadcasLReceiver) dan untuk meregister permission) root Deklarasi suatu permrssion
ke sistem dipanggil fungsi Context. registerReceiver O . security
i nstrumentation) root Deklarasi pengujian suatu
Pada element uses-sdk android mendefinisikan level API terendah
komponen i nstrumentasi
dan teratas yang dapat menjalankan aplikasi tersebut. Atau sebagai penentu
support level API yang digunakan. Element tersebut terdiri dari tiga jenis
,rpplication) Untuk mendefinisian
atribut, yaitu: aplikasi, nama class, label,
icon, atau theme yang
. android:minSdkVersion sebagai penentu level API terendah di digunakan
mana aplikasi dapat berjalan, pada nilai default bernilai '1.
. (tiap satu manifest dapat
Pada pendefinisian android: targetsdkVersion tidak mutlak
mengkustom satu theme)
diperlukan agar aplikasi dapat berjalan. Pada beberapa kasus, definisi j-vi ty)
,r cL Pada child Pendefinisian nama class
ini dapat bermanfaat untuk mendisable fungsi kompatibilitas yang dapat
meningkatkan performa aplikasi. Pada pendefinisian ini juga disarankan <application) Activitv
menggunakan acuan pada level API terendah.

ItAll (r [)asar Pcrrrroglarrr,rrr Arxlrorrl 14s


144 Pemrograman Smart Phone Menggunakan SDK Anrhtul tlnrr llnr krrrg Arrdroid
menginformasikan jenis-jenis komponen intent yang dapat di-hand/e ke
Element Posisielement Definisi sistem Android.
<intent-filter> Pada child Pendefinisian lntent Komponen tersebut dideklarasikan dalam file manifest. Di bawah ini
<activity> yang didukung tiap
ditunjukkan file Manifest AndroidManifest.xml, yang di dalamnya
Activity terdapat dua activity dengan filter intent:
(acti-on) Pada child Mendefinisikan action dari
<intenL-filter> tiap Intent. 01 < activity android:name:"ReviewCri-teria"
<category> Pada child Mendefin isikan kategori android : fabe 1:" G st r ing/ app_short_name,,)
(intent-filter> dari tiap Intent 02 <intent-filter>
<data) Pada child Definisikan tipe MIME 03 <action android:name:"android. i-ntent.action.MAIN- />
<intent-filter> (M u lti pu rpose /nternet
04 <category androi-d: name:"android. j_ntent. . category.
Mail Extensions Protocol),
LAUNCHER" />
scheme URl, authority
URl, dan path URI 05
<meta-dat-a) Pada child Berisikan metadata 0 intent-filter>
6 <,/
<activlty> standar, yang dapat diakses O1 </activity>
menggunakan method 0B <activity android:name:"Reviewlist" android: label_:
Componentfnfo. " s t ringl app_name_reviews ")
G
met aData 09 <intent-filter>
<receiver> rool Mendefinisikan suatu I 0 <category
In1-entReceiver, Yang I I android: name:"android. intent. . category. DEFAUT.T,, />
merespons ke Intents,
juga dapat men-support I 2 <action

dari children <i-ntent- I 3 android: name:"com. app . sample . plaees . VIEW LIST,, />
filter>. l4 <,/intent-filter>
<service> root Mendefinisikan tiap I 5 </activity>
service latar belakang I (r <activity android:name:"ReviewDetal1,,
yang digunakan, juga
,r r r<lro id : 1 abel:" G s t ring/app_name_review,,)
dapat men-support dari
children (intent- / <lntent-filter>
I
filter>. Itl <category
(provider) root Mendefinisikan tiap I ') android: name:"android. int.ent . category. DEFAULT,, ,/>
Content-provider .'0 <action
yang digunakan untuk ' I android:name:" com.app.sample.places.VIEW DETAIL,,
/>
memanajemen presistent .'.' .: / intent-filter>
data agar dapat diakses
.' \ '</acLlity>
aolikasi lain.
I ).rr i Man.ifest, filter pertama (baris ke-3) merupakan paling umum digunakan,

Filter lntent lr.r trp.r kombinasi action android . i-ntent . acti-on . uaiu dan
, rrr, lr' intent. category. LAUNCHER sebagai default launcher
<)rd -
Jika komponen tidak didefinisikan secara eksplisit, sistem akan mengaktifkan .rplik,rsi. Fungsi intent-fil-ter pada activity RevlewCriteria,
sejumlah komponen yang telah terdeklarasi pada manifest. Yaitu dengan lr''v i .wList, dan ReviewDetaif sebagai starting /auncher atau
cara membandingkan object lntent dengan filter-filter intent untuk pr.rrcrrrp.lliln Activity pada main menu aplikasi.
pencapaian target yang paling memungkinkan. Komponen filter intent akan

llAll (r l)ir,,;rr Pontrogr;rrrr,rrr Arrrlrorrl 147


146 - Pemrograman Smart Phone Menggunakan SDK Antltorrl rlntr llirr krrrpl Artrlroid
Pada tiap component juga dapat memiliki berbagai filter intent, masing-masing
dideklarasikan menggunakan set capability yang berbeda. f ika filter tidak r |glk:atron Attrlbrrt{c
didefinisikan, component hanya diaktifkan oleh intent yang didefinisikan Drtfrr$ tlc attibutes ?.d*( to f1a dc{fi1,
secara eksplisit menggunakan nama component target. Untuk Broadcast
Receiver diimplementasikan dan diregister langsung melalui kode aplikasi,
\!.1. IB**I
kemudian intent filter secara langsung akan meng-instantiate sebagai object
IntentFilter.
Theme &*n#ad:str'terTherrre dact f Tq*;l
L6bai EstrrB/+-r"arne |3**;l
Konfigu rasi Androidlvlani f e s t . :<ntI Icr:r-r Edar,sUcfursirntE,s,rr,'synbol- lryryI
Konfigurasi Manifest tiap project Android dilakukan dengan meng-k/ik kanan
file AndroidManifest.xml kemudian klik Open, atau menggunakan
icsopbon
kx;I
shortcut tombol F3 untuk membuka file dari Eclipse yang ditunjukkan ; ernSllcfi rYTYil
Cambar 6.18.
|r.ry=l
Menu tab di bawah Editor untuk menampilkan konfigurasi Manifest dengan
Task affirity lqy-fr"-;
tampilan non-teks. masing-masing menu tab dibedakan berdasarkan atribut
dan display teks. Diantaranya atribut application, permission, instrumentation,
dan docume ntation, sedangkan untuk tab Androi dM anifest.xm I difungsikan Gambar 6.19 Menu Applicatiln Attibules pada tab Application
untuk mengedit file Manifest secara manual.
Meskipun demikian, pada pembahasan sejumlah project yang terdapat Deskripsi atribut aplikasi diantaranya value Nama class, label, icon,
dalam buku ini tidak membahas penggunaaan menu-menu tab tersebut atau theme, security permission. Security permission berfungsi
untuk modifikasi Manifest, disebabkan modifikasi manifest akan lebih mudah sebagai pengatur batasan perijinan akses aplikasi yang dibuat oleh
digunakan langsung dari input manual teks, yaitu pada tab AndroidManifest. aplikasi lainnya diantaranya akses baca-tulis database, activity atau
xml. service dari aplikasi tersebut.

r Ll*9 Ir Pada bagian Application Nodes digunakan untuk memodifikasi


lhr torr?mt *i the Atqt&C f4a.nflst ii rn$a r-p oir f*rt i!(tiry1t. Yfir tan 6lia aa.t [:c ${ dltfit}. element node dari tiap Activity, Service, lntent Filter, Provider, atau
Receiver.
[gJ @natoa iftr]l:]r{, ,rtent
I Elers. gotdcrs, 9*r!1(Es .nc tecfi/rG,
. fl ptr:r*gac; Peimssicrg dtfned arrd ctrr,r*rsru ri:ed' ; Gl f,€rfipo'*i*"" rr.trltyl
S fn*trncnarcn ; In*lrficrlt*&tr dtfrcd. _tTl@I
fA,
f*dd-. I
,&r ,B,L 5afte: Oreciy e*t f€ r,tc$ltnftrt,r.d fik' s"u*or n:en:.;<i,m.LtAill Jf :bcfl1
it, a.,*ola. rt." :, ri legtr r-.LAi-r't{€l
F.,r"--]
,&,0o*Jn1ent6AOr.; Soajtltfir.atrrr frcm fhe An6o'C sCi( fior &1*od\'1ritrfu:t.xrrrl,
rT-l
Gambar 6.18 Menu fa b Manifest dari f/e Andr o i dMa n i f e s t . xml
l-e*l
Gambar 6.20 Menu Application Nodes pada tab Application
Beberapa fungsi tab menu di atas dapat dijelaskan sebagai berikut:
(lntuk menambahkan element baru, yaitu dengan cara mengklik
a. Pada tab Application bagian Application Attributes berfungsi untuk
button Add. Untuk pilihan radio button Create New E/ernent at
kustomisasi sejumlah value atribut, yang value tersebut akan sama
dengan isi data XML pada File AndroidManifest.xml dari th(' top [eve/ digunakan untuk membuat element di top level yang
.rk.rrr memilih tipe element (Cambar 6.21a) dan button Create a new
bagian sebelumnya.

I),l,rrt Ilrrnrogr.rtrr.rrr ArrrlrrrrrI 149


148 ?emrograman Smart Phone Menggunakan SDK Anrttttttl tl.rtt ll,rr krng Arrdrotd
element in the selected element untuk membuat subelement baru di Direktori Resource
dalam suatu element (Gambar 6.13b).
Dalam direktori ,/res tersimpan sejumrah file-file resource yang
lf dibutuhkan
orab aru*dcma*rtftc bgktd, n&dtrlon. oleh aplikasi diantaranya file gambir, audio, animasi file desain-liayout
, atau
f *wt a rxr,* *rrrrir t. of***drrlsqrtr*! l.,i1lr1,,r-r"q
masing-masing disimpan daiam sub-ii*f.tlii
vrrs rerpisah
drsesuarkan dengan tipe file resource tersebut.

{l,rO* r n* dsw*& t* E$,*u


*ihipd lte!*rrt
fi t!* drayvable
l(A)aer
, , 1$ icon'Png
rii icon2.mo
l6c"**, H lb hvout
lQi*"
I , : #l lirt*ikm lokes,.xrd
Gambar 6.21 (a) Menu New Element top Level (b) Menu New Sub-E lenent . ' i"* nerr,r_inprt*loka$.ro:*
H k! vatue
c. Dari tiap element baru yang terbuat, dapat dikustom menggunakan ,- d stngs,**
berbagai value untuk implementasi user interface diantaranya d stvks,xrnl
Name* sebagai acuan Activity target, custom Theme untuk kustom
Gambar 6.23 sejunlah subdirektori dan yang terdapat datam diektori
display Ul Activity, [abe/ untuk display nama Activity mengacu pada file / re s
string resource yang tersimpan pada direktori /res/values/ It.rikut dipaparkan sejumlah subdirektori yang ada di dalam direktorr
strings. xml, kustom description, juga image lcon yang akan rl,rn fungsi-fungsinya masing-masing, juga aklan diberikr;
res
digunakan.
r('source tersebut:
.;;t"i file-file
Attllbots roi nrlt
rlt ctritv
F.xrqtd (adffirl . Direktori /anim
[6] acar6 r
taq &
tEr i! ryi&taa il rnt ol th.-Aribp0,rdhrit!
padac r rpra6b[
Merupakan direktori penyimpanan fire-fire animasi, berfungsi sebagai
drpor66, rd66i{ r prt af tf. {pa6dc €
nEfa. menu transition seperti rotasi, fading, moving, dan stretchi"ng. Darim
ftrrE' ,i*.i-**rriGrlffiil
- " r[6iGI
direktori ini terdapat file / rei'/ animliilur-,.*" . *.n't
Itft . digunakan sebagai rD resource. Untuk pengaksesan ieiaiensi aari
yang

und E;;!ridj!,'!...,lml aplikasi, misalnya di dalam suatu Activity dJpat iGrnu[i, method
Dcapntr
lq
,:.-=:lml Clas s R. anim . file_target. atau mengguiakan data XML
dengan sintaksis G tpackdge: I anim/fi1enariE.
l,tr*r made

Sssffitalo.r
r-.*-3
---=-_jl,q;q
r*---------
. Direktori / color
Untuk penyimpanan fire data XML yang mendefinisikan state perubahan
C6fu dlmod -,*",_:lEI;l warna/.yang tergantung dari state. object view object. Misalnya
state
PraM
- _ ::litffil perubahan warna button (saat diketuk/tapping, te*okus,
aiau kondisi
ti{rirffi r-----*-3 lainnya).
Prffi I ,l htrra."l . Direktori /drawable
ta* afiny .[I;E;] Sebagai direktori penyimpanan file image dengan format
Aloe t * Gp{sbE l------------- didukung diantaranyac rF, )pG, pNG, 9.pN6. Direkiori i"i
yang
F'xfi s h{ lirr:h r*----------3 irsu
r.rnpat penyimpanan fi.rejire XML ya.ng mendefinisikan statL
sebagal
List,
('.1 or, rlan Shapc. Untuk mengakses resource image
Gambar 6.22 Menu Attributes dati liap Element dan sub-Element tersebut dapai

150 Pemrograman Smart Phone Menggunakan SDK Artrlrorrl rlirrr ll,rr klrr11 Arrrlroid I 1/\ll {r I ),r',,rr l'r,rrrro;ir,rrrr,rl Arrrlr, rrrl
151
menggunakan class R.drawabl-e.filename atau pada XML Berikut ini ditunjukkan contorr implementasi
menggunakan G Ipackage : ] drawable/ . layout pada suatu Activity
menggunakan layout resource
main_Activity. xm1:
Pada saat kita membuat project Android, secara default akan di-inc/ude-
kan image icon.png yang akan digunakan sebagai icon aplikasi public void onCreate (Bundl-e savedTnstancestate)
yang tersimpan dalam direktori drawabfe-1dpi (untuk icon super . onCreate ( savedf nstanceState
{

beresolusi tinggi), drawabl-e-mdpi (icon beresolusi menengah), ),.


dan drawable-Idpi (icon beresolusi rendah). setContentView (R. layout.main Activity)
;
)
Direktori /layout
Direktori ini menyimpan sejumlah file desain layout Ul ber{ormat XML
Dari kode tersebut tampak method
yang ditunjukkan pada Cambar 6.24. Agar layout dapat ditampilkan
pada aplikasi, kita harus mengimplementasi dalam suatu class R. layout.main_Activity setcontentview merujuk pada
ying ."rrpakan indeks
data srring XML, yaitu resource
Activity. d i j
b"rrpu .tuJr rlio_gen"rrted R.java. Class ini
aba rkan pada s u b-bab . irrr-" akan
tdulslr drte,
rltg"ierated R. j ava
l:z' sr- a|1.--ellr,,*;;ll,*:,,t Jlo.' *Jilr*
. Direktori /menu
,i,ltt!rr: ,l' Direktori ini menyimpan fire XML desain
menu aprikasi Ur, sepefti menu
lAirEriaTor Option, Context-menu, atau sub-menu
dengan mengimplementasikan
ffig*rrl*
&rwrddcl,rti .
fln',
Me n u r nfl a t e r
sebagi, i iii^iti rt""Ju; i,fi''#;;;'ad i
obiecr
Qr*uerar Berikut adalah implementasi file menu_xm1_contoh.
1$1c"avtr
menggunakan ctass Menurnflater -dln xml yang
[$nuxuro*.,.
onCreateOptionsMenu: .;;;;;k;; ca,back
mlrffik{d€
.i!rrcq',,.
;hix ':{:
l$eusrcrsUr,,.
@ra.r*" 1,rrblic booLean onCreateOptionsMenu(Menu menu)
$*r* Menulnflater inflater : getMenulnflater
{
O!i*sr, O;
fllr^JoFqi inflater. inflate (R.menu.menu_:<m1 contoh,
'Slta**"*rr,..
menu) ;
return true:
Gambar 6.24 Tanpilan file layout XML pada direktori/ )ayout I

. Direktori ,/values
file_layout . xml- dapat diakses dari kode aplikasi
Setiap file layout Direktori ini untuk penyimpanan data
string dengan format XML, yang
menggunakan beberapa method, diantaranya: terbagi menjadi beberapa j;nis iip;;;t"a,
yaitu:
o Method setContentView (R. layour, . nama fif e o File string,. file ini sebagai resource data
, string yang
layout) untuk dapat mengakses suatu resource layout pada di imprementas ikan pada kodE ipri[tilr"g ilil, r,r.i'
" "' r"
content Activity. string. xml, berikut contoh isi file terseiut:- "l* r,

o Method setDropDownViewResource (R. layout. ';<rnl version:,,1. 0,, encoding:-u15_g,,e),


spi-nner untuk membuat drop down view menerapkan I i,l;OUf CeS>
dengan resource layout. Method ini merupakan bagian dari class
ArrayAdapter sebagai backed ListView. :l I ing name=,,app_name,,)Aplikasi
Contoh<y'strlng>
'.1 r irrcy name:,,app
name_config,,>Menu _ Apllkasi Contoh</

152 Pemrograman Smart Phone Menflf,tttt;rk,ttr fil)l( Attrltrtrlrl,rrr ll,rr krrtli Antlroid llAll {r l),r,,,rr l,r,trttogr,rrrr,rrr Arrrlrorrl
153
string> Dari isi file di atas tampak tag array name sebagai nama
<string name:"menu_save_data")Simpan Data</string> array string nama_kota. Agar strhg array tersedut dapai
.dapat digunakan method getEtrrngArr:ay
terbaca pada
<string name:"menu_open_data ")Bu ka Data< / st ring> -
kode aplikasi, yang ditampilkan sebagai berikut:
<stri-ng name:"menu_specify-focation")Tentukan Lokasi</
Lhis . kota_t.u j uan : (Spinner) findViewByld (R. id. kota
string>
tujuan);
<string name:"view processing")Data sedang diproses - - -</
ArrayAdapter<St.ring) nama_kota : new
string>
ArrayAdapter(String> ( thi s,
</resources>
R.1ayout. spinner_view, getResources ( ) .
getStringAray (R. array. nama_kota) ) ;
File ini biasanya digunakan sebagai fungsi localization
(penerjemahan bahasa aplikasi) yang seluruh data-data string n ama_kota . s etDropDownViewRe s ource ( R. 1 ayout . spinner
tersebut akan tampak pada layout aplikasi atau menu. Adanya dropdown);
file string.xml akan mempermudah proses translasi oleh I his. kota_tujuan. setAdapter (nama kota),.
user tanpa harus memiliki kemampuan pemrograman java
disebabkan tidak perlu mengetahui fungsi class-class yang
terdapat pada source code aplikasi tersebut. Penggunaan resource R. layout . spinner dropdown
o file ini berfungsi sebagai resource dari sejumlah
File array string, berfungsi
.. sebagai resource layout spinner -VinS akan
data string untuk digunakan pada suatu menu pemilih (radio menampilkan. menu spinner dengan resource string diperoreh
button atau menu spinner) dengan nama file arrays. xml, dari array. string nama_kota- Lontoh pur"r"pui file arriy
berikut contoh data array yang digunakan pada suatu aplikasi string ini dapat dirihat pada project aprikasi RSS-uscs, dengan
sebagai menu radio button: nama file array arrays. xmf .

o File plural, merupakan data XML yang menyimpan sejumlah


variabel string untuk penyesuaian daii relource'masukan, 'berikut
<?xml- version:"1. 0" encoding:",r11-8"?> contohnya:
<resources>
<array name:"nama_kota") :'xml version:,,1. 0,, encoding:-r11_8,,?>
<item>Jakarta<,/ item> r r:SOUf CeS)
<itemlsurabaya< / i tem> <pluraIs name:- jumlahBarangTersedia,, >
<item>Medan</item> <item quantlt.y:"satu,,)Satu baranE ditemukan. </
<item>Yogyakarta< / item> IIlm)
<i-tem)Semarang< / i tem>
<ltem quantlty:"lainnya,,>%d barang
< j-tem>Bandung<,/ item>
lrl(,rnukan.</item>
<item>Cirebon</iLem> <item quantlty:,,kosong,,)stok barang habrs . <,/
<i tem>MaIang<,/ i tem> l,lrl
</ arraY> . ,,'plurals>
< / resources>
I r't:()llI Cesj>

154 Pemrograman Smarl Phrtnrt Mttt11lltttt,rk,rtt i,l )h AlrrIrrrrlrl.rtr ll,rr ktttli Attrlrgid i /\11 l, l),r,,,rr l'r,rrrrol:t,rtrr,rrr Arrrhlrl j55
Fungsi element-element dari contoh di atas diantaranya (item name:,,android : textColor,, ># f f f f f f</
yaitu tag element pJ-ura1s dengan nama lD ltem>
jumlahBarangTersedia, sebagai kumpulan string
dipengaruhi oleh suatu nilai sehingga akan memberikan </style>
keluaran string yang berbeda. Contohnya jika pada kode aplikasi <styIe name:',edit_t.ext,,)
didefinisikan string item quantity bernilai kosong maka
akan memberikan keluaran string stok barang habis.
<1 tem name:,,androi-d : text S i ze,,> 1 6 sp<,/ tem>
i_

Tag element item dengan variabel quantity


dapat berupa <item name:,,androi-d: textColor->#000000</
tipe plural- (satu, lainnya, dan kosong) atau beftipe item>
singular yang nilai keluarannya dapat digunakan sebagai string
<,/ style>
resource.
Pada implementasi element plurals di kode aplikasi dapat
(/resources)
digunakan method getQuant ityS t r ing yang ditunj ukkan
di bawah ini: o File resource t.ipe rain, untuk meng-handre berbagai tipe data
yang spesifik diantaranya boor.xmr, corors.xmr, diiension.xmr,
int count : jumlahBarangTersedia O ; it)teger, array integer, typed array. Berikut beberapa contohnyai
Resources res : getResources O; . File bool.xml:
String j umlahDiketahui : res . getQuantityString (R.
pluraIs. jumlahBarangTersedia, count) ; <?xmf version:,,1 . 0,, encoding:-r11_g,, ?>
<resources>
o File style resource sebagai rujukan tiap lD resource terdapat pada <bo o l_ name:,,u ku ran_window_ke
i f ,, ) t rue < /bool- >
c
suatu file layout berfungsi untuk kustom display element-element <bool name:,,modifikasi bound,,>true</booI>
U/ berupa ukuran dan jenis font, warna teks, warna foreground (/resources)
atau background, contohnya yaitu file yang tersimpan/res/
file_Iayout . xml-). File style resource tersebut memiliki . File colors.xml:
nama file styles . xml, berikut ditunjukkan contoh isi file (?xm] version=,,1. On encoding:,,ttLf_g,, ?)
tersebut:
<resources>
<col_or name:,,merah_tua,,># f 0 0</col_or>
<?xm1 version:"1. 0" encodi-ng:"uLf-8"?) (cofor name:,,merah_transparan'.>#g0ffO000</col_or)
<resources> (/resources)
<style name:"intro_text") . File dimension.xml:
<i-tem name:"andro i d : texts i z e " > 22 sp< / iLem> (?xml versi-on:,,l. O, encoding:,,ut-f_g,, ?)
<item name:"android: textColor">#ee7 620</
<resources>
item) j-men name:,, t ex
item name:"andro id : textstyle
< " >bof d<,/ i tem>
<d tvi ew_he i ght,, > 2 5 dp<,/ dimen>
<dimen name:,,textview_width,, > 1 5 O dp< /dimen>
</ style>
<dimen name:,,bal-f_radius,,>3 0dp</dimen>
<sty1e name:"fabel")
(item name:"androld : texts <dimen name:,, f ont_si ze,,)1 6sp</dimen>
I ze ">1 B sp<,/ r tem)
.i/resources>

156 Pemrograman Smart Phorre Monlilitttl,tk,rtt lil )h Arrrltrrrrl rl,rtr ll.r, l'trrl' Attrlrrttd IJAIJ (r l),t,,,rr l!,nrrl1;l.rnr,rrrArrrlrlrrl
$7
Direktori Source
Direktori Binary
umlah file byte.code.dengan ekstensi Direktori ini berisikan source code aplikasi iava yang tersimpan dalam
Di rektori bi nary (/ bi n) menyimpan sej
package. Penamaan package menggunakan sistem direktori tree ber-style
*.class dan *.dex V.#'."iiip^i"" fi(" hasil kompilasi dari source code
layout resource, dan c/ass Java, yaitu mengikuti namapackage class java (diawali dengan nama general
,pri["ri vrne Jie"br.ir""-p,]i, J"ng"n juga
.fitejite dan diakhiri nama project aplikasi atau mendefinisikan fungsi komponen,
tersimp'" vang siap
;;;;;r;;r,; a.iava.d"tu- direktori ini
puOt"i',rlator aiau
1'l:
perangkat Android' l':fl misalnya com. contoh. widget . aplikasiku . service. Nama
didistribusikandan ar[iJiiuf"npin
package diharuskan lebih dari 2 nama (contohnya com. aplikasiku),
untr-rk jumlah maksimal package dan nama file tidak dibatasi.
DirektoriAssets
pada direktori assets tersimpan sejumlah file yang tidak berhubungan A d Projectad*aSr
Direktori ini E {i$ src
i;;;;;";gun p,olIi ipil"il vuitu fite-file selain resource.
file teks lisensi atau EULA dari
bt;;;;; Jisr;.,rtin ,"nri!i penyim.panan ES com.contoh.wdget.adikasihl
,r.*'Jpf if.rliain ftt" ["""nrtiipat diakses pada kode aplikasi menggunakan L{ U ad*as*<u.java
method readEula O.
Gambar 6.26 Direktori \ s rc suatu project Android
Direktori Gen Jika kita membuat project melalui menu Wizard, New Android Prolect. Dari
file class generated iava
Di dalam direktori ini terdapat sejumlah package dan string
input Package Name dan Activity Name di window properties, secara default
;;.g"; ,.;,"a file R. j rrru,-Atil
file ini merupakan indeks resource data tercipta satu class Activity merupakan main Acti-vity
(Activity tersebut
XML, sebagai antarmluia 4ndroid lnterface Definition Language)' pertama kali dieksekusi oleh interpreter). Setiap activity akan tersimpan dalam
Cf"r; n.llva akan ter-generate secara otomatis setiap user memodifikasi direktori sesuai dengan nama package, contohnya project yang ditampilkan
saiah satu fiie XML (l;y;; Ut string resource strings.' xml)' Jika pada Cambar 6.26, ditunjukkan suatu class yang terdapat di dalam package
"t"u
java secara manual dapat berakibat proses aplikasiku,
;;; ;;rJiri6ri cias, R. com. contoh . widget . yang secara fisis class tersebut
kompilasi aPlikasi akan gagal. beradadi dalam direktori com/contoh/ widget/aplikasiku/
Disararrkan kita tidak membuka class R.
java untuk menghindari modifikasi Aplikasiku. j ava.
class secara tidak sengala. blr"niUlr" filipse tidak mendukung fungsi read-
only fi le-file autogenerate.
,.lr:qPtdictl Androidjar dan Mapsjar
;; s$ rc
ir rl3 g*n l'.*r*;:r.J ':'; ' I irl{:.l Dalam setiap project Android hierarki akan tampak file Android .. j ar atau
1-; $ som..conbrr rnaps . j ar yang merupakan archive library Android dan Maps. Di dalam
r ili n.pra Archive Android. jar berisikan sejumlah class-class runtime Android,
lSr. y.ing menandakan project tersebut meng-inc/ude librari API Androi-d,
*l ott stdangkan archive librari maps . j ar akan di-include-kan jika project
I €{ *"*"a.
*tila rnengimplementasikan API Coogle Maps (Cambar 6.27).
a ill hro.,t
I rS rrtq,
r *J rtrdt

(a)

Gambar6,25(a)HierarkidirektoripadaprojectAndroid(b)isifileclassR.java

l'l )h Atrrltorrl rl'trr ll'rr kttlll Attrlrttttl llAlt (r J),r,,,rr l'r,rrrrolI,rrrr,rtr Atrrlturrl 159
158 Pemrogranlan Smart Pltorte Mtlttf il'1trrr'tk'rrr
*, ;$ src
*i l3 g*n lli,:',rr'l:: : .; l :r' r:,
-:
L) S eooele APis [Andrord 2, r]
I
ffiJ j,rl android,jar - l: 'f'r*rlr t*: lrrPs"&:
srl*s v:Rd'
lJ {:E rnaps.iar - F:'rlri$rer:
m S coar'soosle,android.rnry*

Gambar 6.27 Direktori suatu proiect yang terdapat librari


Android' j ar versi 2'1

(levelAPl /)
Project Dasar Aplikasi Android
Dalam hierarki project Android (cambar 6.27), secara tersirat
file librari
e"Ji":-O. j ar tersimpan dalam direktori. tersebut' Meskipun sebenarnya
file archive tetap tersimpl" Arf direktori /p1atf orms /android-x di
Jrlu,n ,r.krse'direkro;Sot< "*
nndroid (dengan nilai x adalah nilai level librari
proiect' sesuai
ffi;. ilb i;? ,l,rrnJtitrn saat menialani proses kompilasi.
tersebut. terdistribusi
dengan versi Apl target. iibrari nrchive Android.jar
repositori Android
secara open source y";;t;r;;;-nya dapat diunduh.pada
(pada i i nk U RL: http:i/git.sou rce'android'com)'

-oo0oo-

I'ada bab ini diberikan contoh pro.iect-project sebagai dasar penggunaan


kt>mponen diantaranya Activity
dan Widget. Juga proses pembuatan
.rplikasi memanfaatkan Layout XML untuk membuat tampilan User lnterface.
Scluruh aplikasi di buku ini akan dijelaskan proses pembuatannya secara
lrcrtahap menggunakan IDE Eclipse.

Aplikasi HaloAndroid (Ul Tanpa Layout XML)


\r'bagai pengantar awal sebelum membuat aplikasi Android, Kita akan
rrrcrnbuat aplikasi Hello world bersumber dari http:lldeveloper.android.
,,ttrrlldocslresourcesltutorialslhello-world.html. Dari aplikasi ini akan
rlrjclaskan konsep Activity, User lnterface, dan layout XML. Berikut tahap
| )r
( )\('s pembUatannya:
I . Buat Project baru pada Eclipse lDE. Pada main menu klik menu
l'roject..., kemudian pada menu wizard pilih Android -s Android

)K Atrrlrrrrrl il,rrr ll,rr krtrli Arttlrrltrl


160 Pemrograman Smart PhOrrO Mettlillttlr,rk,rtt lil
Project (Ganrbar 7.1a), atau klik Main Menu New -+ Android Proiect HaloAndroid dari IDE Eclipse.
(Cambar 7.1b).

!!&rdrl

r d! 6g1tr81
: !r! drdrM
diEE@
ArupdTffl
,Ir FrqFrt
a i::' C'15
I **' lx'r'g
$; 'i;:,Java lf
t * *&A,n firylcfoSm*rlt
r ;,,*: {ggn$s

i',1 -,$4ir*1ry,{
qry"*"",
*' :**iqr'
siai* **!+*
,firm:# :il&*tM:w*
*: sqsi
l;f L:.r*6
Gambar 7.2 Window New prolect aplikasiHatoAndroid
,.: sas**" fur ecir&x
*"'r a* x; Kolom isian pada window New project tersebut memiliki fungsi-fungsi
sebagai berikut:
Gambar 7.1 (a) Menu Wizard (b) Menu New Android Proiect
- Project Name yaitu untuk menentukan nama project dan nama
2. lsi kolom project dan properties seperti berikut: root direktori project yang menyimpan seluruh file project;
. Project name : HaloAndroid - Application Name,.digunakan untuk title atau judul yang akan
. Application name : Halo, Android! tampak pada Ul aplikasitersebut;
. Package name : com.contoh.haloandroid - lagkage Name, menggunakan format penulisan package
. Create Activity : HaloAndroid kebalikan dari nama domain web atau mengikuti styt" p"rnoJetin
. Min SDK Version .) package class java yang telah dijelaskan pada bab sebelumnya,
dapat juga ditentukan sesuai keinginan;
. Build Target AVD : minimal Android 1.'t
- Check box create activity, untuk meng-generate class main
Activity yang akan dijalankan pertama- kari oreh aprikasi
hilangkan centangcheck jika ingin membuat manual;
Kolom isian yang terdapat di window New Project (Cambar 7.2)
seluruhnya wajib diisi. Jika salah satu konfigurasi bernilai kosong - Min SDK Version, nilai integer untuk versi SDK yang akan
maka project tidak dapat dibuat karena sebagai referensi konfigurasi digunakan dalam merancang aprikasi disesuaikan padX versi
dasar dari project target. Untuk memulai membuat project baru, device target,. pada contoh ini digunakan level Apl 3, denlan
klik button Finish. Berikut ditampilkan window konfitlrrr,rsi projt'r:t lirrg()l rx'rilrgk.rt Andr,id versi 1.5 meskipun demikian teiap

162 -l)entrof{rantan Srtt;trl l'ltrrttt'Mt'tt,ll:tttt,rk.rtr iil)h Arrrh' r'l rl.rtr ll l I rrrr'Attrltrtttl llAll / l\olr,r I l),r,,,rr AtrIk,r,.r Arrrlrorrl 163
dapat dijalankan pada Android versi diatasnya berbeda. sebagai parameter context instance Android, tiap context
J. Ubah file haloandroid. 3 ava yang ada di dalam package com. akan di-hand/e oleh sistem. Sistem Android juga menyediakan
contoh.hafoandroid menjadi seperti berikut (tanpa nomor beberapa service lainnya, seperti sharing resource, akses ke
baris): database dan fungsi preferensi.
- Bagian this, pada baris ke-11 sebagai referensi context pada
01 package com. contoh . haloandroid,' TextView karena class Activi-ty merupakan turunan dari
02 import android. app.ActivltY; context dan juga class Hal-oAndroid merupakan subclass
03 i-mport android. os . Bundle; dari Activit.y yang juga merupakan bagian dari context.
04 import android. widget. TextVlew; - setText pada baris ke-12 merupakan pendefinisian isi konten
dari TextView.
05 public class Hal-oAndroid extends Activlty {
- Method setContentView (pada baris ke-13) berfungsi
06 /** Activity yang dipanggil pertama kal-i */ menampilkan konten teks pada activity Ul. Jika method ini tidak
07 GOverride digunakan maka teks tidak akan tampak pada Ul yang hanya
menampilkan layar kosong.
OB pub11c void onCreate (Bundl-e savedlnstanceState) {
4. Berikutnya untuk menjalankan aplikasi pada Emulator AVD atau
09 super. onCreate (savedlnstanceState),' + Run As -+ Android Application
perangkat Android, klik menu Run
10 setContentView (R. laYout.main) ; atau dapat pula menggunakan tombol shortcut Ctrl + F7 / (Cambar
1i TextView tv : new TextView(this); 7.3).

12 tv . setText ("HaI1o, Androi-d. Ini- program lt*


pertama saya ! ") ;
t_3 setContentView (tv) ;
t4)
1tr
lJ I
l
ffi13CIrM
i
Penjelasan kode haloandroid. j ava:
- Pada baris ke-1, merupakan representasi nama package yang Gambar 7.3 Menu Run AplikasiAndroid
digunakan pada project, dengan nama project ditentukan saat
konfigurasi pembuatan project baru. Setelah proses run berhasil, tab console di IDE eclipse akan tampak
- Di baris ke-5, class android.app.Activity merupakan proses konrpilasi berhasil. Selanjutnya otomatis diinstalasikan pada
bagian dari package androi-d. app sebagai base Activity yang AVD target yang ditunjukkan pada Cambar 7.4.
akan berinteraksi dengan user dan meng-hand/e display Ltl.
- class androld. os . Bundle (baris ke-3) merupakan bagian
dari package android.. os, class ini wajib disertakan pada ne:*tritil;
ld..ri ;run.nr
qg Ir mrElH *r*li.
tiap project aplikasi Android. faiotutr*1u I hrlrtNqt
lr:..e::.
*,siLM.nt tft.ud.ff .t*aj!i!d
IarF: xr#r jriry s,rc. .11i(:s9r9!.r:
l:: reil.t :air *i

- class androi-d. widget . TextView (baris ke-4) untuk :blarsrt


Isilltrq
!u.&to:c,rpr
&iBk *rr,ryt...
itiJ &!lit, llstntllglrtf .

fungsi drawing object TextView pada element layout Ul, lu.:14..:1rl.i ;e-...:(;!.tt'r{.ir!:1!.tr:r*laro:d rr_ f",-:,rr:!!it!tair.{i
yang dari contoh tersebut digunakan label teks. Object tersebut l.:i?r:lA.ine:r -lrnrir.!r fr:r!i ) .?:*!i{td:i,1i1tii.dE:!:._,$:ti:da-:lid:rra.1

merupakan subclass dari class View untuk meng-handle fungsi


display teks. Gambar 1.4 Tab Console output pada IDE Eclipse saat proses konpitasi project
- class TextView merupakan class constrtr( lor v,lng diilinkan

164 Pemrograman Smart Phorrc M|rrgl.lrrr,rk,rrr lil )x Ailrhrrrrlrl,ur ll,rr krn11 Arrrlroid t(At / I'to1t,r I I),r,,,u A1rlrk,r.,r ArrrlrorrI 165
5. Setelah instalasi berhasil, main Activity aplikasi HaloAndroid otomatis Edla*cionfu: &fxdt
berjalan. Dengan tampilan Ul, aplikasi ditunjukkan pada Cambar
7.5a dan menu aplikasi HaloAndroid akan tampak pada main menu
Aplikasi yang ditunjukkan pada Gambar 7.5b.
l&&*c'hie!grelr
@a*er*rer
Hr,rparc***r.
ffirrar*t-trert
fficrd+,*'
-rurere-.
$*w
i:l: ;,

M@, re:rr PU

Gambar 7.6 Tanpilan layout main . xmL


Garnbar 7.5 (a) Tampilan Ul dariActivity aplikasi 'Halo Android !' (b) Mah Menu File main.xml merupakan erement untuk main Actlvity, rayout ini
:rkan ditampilkan pada saat main Activity dieksekusi. untuk .emodifikasi
isi
file tersebut klik tab main . xm1 yang ada di bagian bawah *irar*
editor,
Moditikasi Ul menggunakan layout XML berikut ini adalah isi file main. xmt:
Pernrograman untuk layout Ul pada project HaloAndroid di atas adalah 01 <?xmf version:,,L.0. encoding:,,ur-f._g,,?)
langsung menggunakan source code. Cara ini dapat menjadi lebih sulit jika
membuat layout yang lebih kompleks karena dibutuhkan kode program 02 <Li-near],ayout xmrns : android:"http :/ / schemas. androi_ci.
yang lebih banyak. Sebagai alternatif, SDK Android menyediakan cara ,.:om/ apk/ res /androi-d,,
alternatif mengonstruksi Ul menggunakan layout XML (Ganrbar 7.6). Froses
pembuatannya dilakukan dengan rnemodifikasi file layout XML pada direktori
0J android:orientation:,,vert._ica1,,
/ res / layout/main . xml dan string resource (sebagai sumber variabei 04 android: iayout_width:-{ifl_parent,,
string) didefinisikan pada file / res / values/strings
. xml. 05 android:layout_hei-ght:,,fi11 parent.,,

07 <TextView
08 android:layout_width=,,fi1l_parent,,
09 android:layout_height:,,wrap_content,,
I0 android:text:,,0strj.ng,/hel1o,,
II />
|? </Linearl ayorrt)

166 Pemrograman Smart Phone Mettgl4tttt,rk,trr lil)X Alrltutrl rl'rn ll,rt krrrli Artdroid llAlt / llolcr:l D;rr,;rr Aphk,r..r Anriorrl
167
Dari atribut xml-ns: android (baris ke-2) kedua merupakan deklarasi baris kode.yang terah ditambahkan. Berikut ditunjukkan
tampiran
namespace XML yang menjadi definisi acuan common atribut. Atribut ini source lengkapnya:
wajib dimasukkan pada tag terluar tiap layout Android. 01 package com.contoh.haloandroid,.
Atributandroid: Iayout height dan android: layout width 02 import andro j_d. app.Actlvit.y;
untuk mendefinisikan ukuran!anjang dan lebar layar yang diperlukan, value
fill_parent berfungsi menerapkan mode layar penuh (ful/screen). 03 lmport androj_d.os.Bund.l-e;
04 / / import android. widgret . TextView,.
Atribut android: text (baris ke-l0) mendefinisikan teks dari TextView
yang akan terlihat oleh user. Dari source tersebut secara default digunakan 05 public cl_ass HaloAndroid extends Act.lvity
{
parser. string resource, ditandai karakter "@" mengacu pada file strings . 06 /** akan dipanggil saat activity pertama kali
xm1 (terletak pada direktori / res / val-ue/) berfungsi sebagai localization. berjalan */
Atau dapat pula didefinisikan string resource langsung melalui layout file
main. xmI, contohnya: 0"7 @Override
08 public void onCreate (Bundle savedlnstancestate)
android:text:"Halor Android. Ini adal-ah strinq dari {
09 super . onCreate ( savedlnstanceState
Iayout main.xml" ),.
10 setContentView (R. layout. main) ,.
File strings . xml sebagai tempat penyimpanan seluruh data text string
11 //TextView tv : new TextView(this),.
Ul Aplikasi, pada project HaloAndroid tersebut terdapat dua variabel string, t2 / /tv. setText (..Ha1o. . . Inl program pertama
yaitu app name (baris ke4) dengan value string tersebut menyesuaikan dari saya!"),-
application name saat membuat project baru, sedangkan pada string hello l3
akan dilakukan perubahan nilai string menjadi seperti berikut: ,/,/setContentView (tv) ;
L4 )
1 <?xml version:"I.0" encoding:"utf-8"?> i5 )
2 (resources)
3 <str j-ng name:"he11o")Ha1o, saya memodifj.kasi I)ari kode tersebut, method setContentView
tligunakan karena terah tergantika" ;u-n;;naun O
(di baris ke_.t3) tidak
menggunakan string resource! </string> ieteie"ril"ro""r."
l":: I . layout - ma i.n (b"aris ke-]0) ya,ifrurrprtrn rayout
4 <string name:"app name")Ha1o, Androidl</string> I file clasi-autogenerare
lrasil dari kompilasi dari referens i t,te' r"Z
5 <,/resources> l ) tayour,/main . xml.
S.telah modifikasi selesai, Iakukan proses kompirasi,
rrraka menampitkan Ut seperti padi
cambai ?:/;;;;";.;1.
"'"'",
seterah Activity berjaran
Pada data string yang ada di dalam body tag dengan nama string hell-o
digunakan sebagai data acuan pada main layout (file main. xm]) di dalam
object TextView pada element layout Ul yang merupakan bagian dari tag ffiGl z:oearr,r ffi@ a:rsam
LinearLayout. Tag Linearlayout berfungsi sebagai pengatur
seluruh child element agar susunannya dapat diurutkan secara vertikal atau
horizontal. Untuk tag app name sebagai title aplikasi dari yang dibuat
(terlihat di bagian teratas tiap aplikasi). (a) b)
Untuk menguji penggunaan layout XML dilakukan beberapa tahap berikut:
(iambar 7'7 Tampiran
ur menggunakan nirai string dari (a) main . xml
1. Pada file class HaloAndroid. j ava, ubah source tersebut menjadi dan (b) strings .
kondisi sebelumnya atau berikan karakter argumen (tanda "//") pada xm.l

168 - Pemrogratttatt Smarl ['ltont' Mt'ttlifitrrr,rk,trr ',1 )h Atrrlt,,r,l rl,rrr ll.rr l ,rr, Arrrlrrrirl liAlt / lIr4cr:t [);r,,;rr A1rIk,r..r Arrrlrrrrrl
169
w i dt h= "wrap_con t e n t. "
Dari kedua gambar di atas, terlihat Ul hasil modifikasi string menghasilkan
tampilan lay-out yang tr*a, brik main . xml atau strings ' xml
karena 08 android: layout-_height="wrap_content"
l;;;;;, ;"ns6r"ikr" definisi string'. J ika memprogram langsung lavou.t andro j-d : 1 ayout_marginLe f t :" I )px"
Uf-r"gl1iJ.[ Xi" perbedaan, dapat disimpulkan penerapan layout XML 09 android: layout_marginBottom:"15px" /)
*"iufufrn cara yang lebih mudah untuk mengonstruksi Ul'
10 <Button android'16:"@+id/button" android:layout
width:"wrap_content "
WaktuSaatlni - Aplikasi penerapan Widget Android I1 android: Iayout_height="wrap_content"
android : I ayout_ma rglnLe ft --" l)px"
Seperti yang telah dijelaskan pada . contoh pertama -.di.. atas'.. berikutnya
aitir"irdi""puta contof, apli[asi. _berbasis layout XML. yaitu Aplikasi 12 androj-d: layout_marglnBottom:"15px"
WakiuSaattni yang merupakan modifikasi dari buku "Unlocking Android-A .rnd::oi-d:text="Cek Waktu" />
widget l3 </Lj-nearLayout)
il;ilp;;,r CuiAE' yang ditulis Abelson W.F mengimplementasikan
TexLView dan
Android dibuat *"ngi,inut [ayout XML, diantaranya
"n
e"li".- Aplikasi iniiienerapkan pula class android. view. Menu dan
Penjelasan:
android.view.subMenuuntukmembuatmenudansub-menuyanS
diimplementasikan dalam kode aplikasi' - Di baris ke-7, seperti pada contoh pertama yang menampilkan
Beri kut proses PembuatannYa:
widget TextView di Layout XML dan nilai string mengacu
pada G+id/output. Dalam Resource ini tidak
l.BuatprojectbaruAndroiddenganrinciansebagaiberikut: menggunakan parser string resource strings. xml karena
a. Nama Project WaktuSaatlni string didefinisikan langsung dari kode aplikasi yang ditLrnjLrkkan
pada bagian source.
b. Application Name Waktu Saat lni?
c. Package name com.contoh.waktusekaran g - Pada kode baris ke-'I0, berfungsi untuk membuat widget Bufton
dengan value text button berupa string yang didefinisikan daianr
d. Create ActivitY sekarang
file main . xml- (baris ke-12).
e. minimum SDK 3
f. Build Target AVD Android 1.5 hingga Android 2-2
i. Modifikasikan file AndroidManifest.xmt- pada main root pi-oject
WaktuSaatlni meniadi seperti berikut:
2. main.xml yang terdapat pada dkektori /
Ubah kode layout XML I <?xml version="7.0" encoding:"rtLf-8"?>
res/Iayout/main-xml menjadi seperti di baw.ah ini' Nomor
1r

ti.prL di bagian paling-kiri tiap baris menandakan keterangan ' <manifest xmlns:android:"http:,/,/schemas.androicl.
V"r.,g
;;;", uiut tiap biris yangiidak perlu ditulis, menandakan jika di
program melampaui ' 'n/ apk/ res /android"
t^1u Lrtit tidak ada nomor-maka panjang kode
baris kode berikutnya. rI package="com.example.waktusekararrg"
batas halaman dan berlaku seterusnya untuk
,t.l android:versionCode:"1" android:versionName="1.0">
01 <?xml version:"1. 0" encodi-ng:""1;-8"?>
l'r <application androi-d:icon:"Gdrawable/icon"
02 <Linearlayout xmlns : android:"http: //schemas'
android. com/ aPk/ res /android" , (, android:1abe1:"Gstrlng/app_name"
03 android: orlentati-on="verticaf" t) t androi.d:theme="Gandroid:style/Theme.Light">
O4 android: layout-width:"fill-parent" <acrrvirv
05 android: layout-helght:"fill-parent" ,;, l::::i:,ill];:;;:::iili;", name,,,
i rit en1 -filt-er>
07 <TextView android.: id:"G+id,/output" androjd: J ayout-
<

ll lll\ll / l'rrrlr,r I l),r',,tr Alrlth,r'.r Arrrhlr,l 171


Pemrollr;rrnln Srrrirrl [-lrorri'Mr,rr litrtt.th,rtt lil)h /\ll,hr,r,l,l
rrr rr l'rrtll Alrrltrtttl
170
11 (action android: name:"android. intent. Dalam kode baris ke-3 hingga ke-5 file layout, secara berurutan
didefinisikan nilai string resource nama Aplikasi, button menu quit,
action.MAIN" ,/> dan timeformat.
t2 <category androld: name:"androj-d
intent . category. LAUNCHER" ,/>
13 intent-filter>
< /
5. selanjutnya modifikasikan kode class public sekarang. java di
dala.m package com. contoh. waktusekarang ,"n-ludi seperti
L4 </activitY> berikut:
t5 </application>
001 package com.contoh.waktusekarang.;
t6 (uses-sdk android:minSdkVersiQn:"3" /)
002
17 </manifest)
003 i-mport android. app.Activity,.
file AndroidManifest.xml tampak aplikasi tersebut
Pada baris ke-7 004 import android.os.Bundle;
menggunakan mode Theme /ight. Penempatan atribut theme harus di () 05 j-mport android.view.Menu;
dalam node appiication sebagai kustom theme layout. Untuk melihat
perubahan mode Theme.Light Ul pada Eclipse, melalui konfigurasi layout {)06 import android.view.Menuftern;
pada menu Theme seperti yang terlihat di Gambar 7.8. 0 0 7 import android. view. SubMenu,.

()0 B import android. vi-ew.


View;
{)09 lmport android.view.View.OnClickl,istener;
(l [0 import android.widget.Button;
(l L1 import android.widget.TextVlew;

() L2 import java.utll.Date;

ol3
() I 4 lmport com. contoh . waktusekaranq. R,.
ol5
tt I 6 pub1lc class sekarang extends Activity
{
Gambar 7.8 Menu Theme Layout
0l'/ /** Called when the activity is first created. */
4. Ubah kode layout XML strlngs.xml untuk fungsi /ocalization ttlS pri-vate static final_ i-nt MENU eUIT : Menu.FIRST +
yang terdapat pada direktori /res/values/ menjadi seperti t;
berikut ini:
ol() private stat.ic fi.naf i-nt MENU FORMAT : Menu.FIRST
1 <?xmI version:"1.0" encoding:"uLf-8"?> | ') -

2 (resources) o.'0 private static final int LOCALE:Menu.FIRST+3;


3 <string name:"app_name")Waktu Saat Inl ?</string> o.' l private statlc final- int. GMT:Menu.FIRST+4,.
4 <string name:"quit")Keluar</string> I ) .' ,) private static final int DEFAULT : Menu.FIRST + 5,.
5 <string name:"timeformat")Format tr{aktu<,/string> i).' j private TextView output;
6 </resources> t). ,1
;> r i vate Button button;

PemrOgramatt Smart Phon0 M|ttllgtttt,tk,ttt lil )h Atrrltiltrl rl.rtt ll,rcktttll Anrlrttttl l'tr4cr.l l)ir:,,rr Aphk,t,,r ArrrlrrrrrI 173
172
A25 048 subMenu. setcroupcheckable {MENU_EORI"IAT,
A26 Goverride true, true);
O21 public void oncreate (Jinat Bundle savedlnstancestate ) 049 menu.add(0, sekarang. MENU_OUIT, 1, R.string.
{ quit) . serrcon (

o28 super. oncreate savedlnstancestate ) ;


( 050 android.R.drawable.ic menu
A29 this . setcontentvie, R.1ayout. main ) ;
( close-clear_cancel ) ,
030 this.output = (Textvie!,) findviewByld(R. 051 return true;
id.output); O52 )
031 this.button = (Button) JindviewById(R. 053
id.button); 054 "override
032 Lhis.button.setOnclick],istener(neB 055 pub.Iic boolean onMenultemselectecl int featurerd, (

Onclicklistener O { Menultem item) i


033 public void onclick(final view v) I 056 switch (item.getltenId0) {
034 output. setText (new Date0. 057 case MENU_QUIT:
tostringo), 058 quit0;
035 ) 059 return true;
036 )); 060 )
037 ) r)61 switch (iten.geErremrd0) {
038 t)62 case LocAlE:
039 @override r)63 if item. ischecked O ) (

040 public boolean oncreateoptionsMenu (Menu nenu) { 064 item.setchecked(fa]se);


041 super . oncreateoptionsMenu (menu ) ; r)65 else
A42 SubMenu subMenu = menu. addsubMenu (R. strinq. 1166 i tem. setchecked (true ) ,
timeformat ) . setlcon ( n61 this.button.setonclicklistener{new
043 android.R.drairable.ic nenu ,)r,CtickLislener0 {
nore), r)h8 public void onclick(finat Vie$
A44 subMenu. add (I'IENU_FOB.MAT, LOCALE, 0, ") I
"Loca1e" ) . setcheckable true ) ; ( rr('9 output. setText (new
045 subMenu . add (MENU FORMAT, GMT, 1, 'GMT"). I
' l-e )
, ( . tolocalestrinq ( ));
setcheckable ltrue) ' tt lA )
A46 subMenu . add (UENU FORMAT, DEEAUIT, 2, trtl \)i
t t. return !rue;
"Defaut" ) . setcheckable true ) (

A4'l .selchecked(true); t t" )

174 - Pemrograman Smart Phortc Mlrrlillurr,l[,s11 lll )h Aultrrtrlrl.rtr ll,rr krrryi Attrlrotrl lii\lJ / l'tolr,r I l),r,,,rr Aphk,r,,r Arrrhrrrrl 175
0-14 switch (item.getItemIdO ) { item) ;
075 case GMT: 101 )

016 if (i-tem. isChecked O ) 702


077 1tem. setChecked ( false) ; 103 private void qu j_t ( )
078 e1 se 104 this.finish O ;
0'7 9 item. setChecked (true) ; 105 ]
080 this . button . setOnCf ickI,istener ( new 106 )

OnClickListener () {

081 public void onClick (finaI v.t_ew

v) {
082 outpuL. setText ( new Berikut penjelasan dari kode class Sekarang. j ava:
Date () .toGMTStrinSO);
- Pada baris ke-3 hingga ke-1 1 dapat dijelaskan bahwa class
083 ) diimplementasikan class android. view. Menu berfungsi
084 )); untuk membuat menu aplikasi (tampak di bagian bawah apliklsi
pada Cambar 7.ga). Class android. vlew . Menultem
085 return true; sebagai interface untuk fungsi eksekusi suatu button dan
086 ) class android. vi-ew . View . OnCl- i ckI,i_ s tener
087 switch (item.getItemIdO ) { sebagai fungsi interface callbackjika suatu item (dalam hal ini
adalah button) diklik, akan menjalankan method out_put.
088 CaSe DEFAULT: setText O yang terdapat pada baris ke 34,69, 82, din 96.
089 j-f (1tem. isChecked ( ) ) Class-class tersebut tidak perlu dimasukkan manual karena
090 item. setChecked (false) ; otomatis d i masukkan oleh I D E Ecl i pse saat kita mengi m plementasi
suatu method.
091 else
- Class I ava . util . Date berfungsi untuk menampilkan data
092 item. setChecked (true) ; tanggal dan jam secara realtime sesaat setelah method new
093 Date O dipanggildan ditampikan menggunakan format default
String, CMT dan Locale.
094 Lhis.button. setOnClickListener (new
OnCfickListener (
- Pada baris 48 hingga 49, merupakan fungsi untuk membuat sub_
) { menu bertipe floating (yaitu LOCALE, GMT, dan DEEAULT)
095 public void onClick (final- View dan merupakan bagian dari menu t.imeformat, dengan value
v){ string resource yaitu Format Waktu. Display Ul dari s.-ub_menu
tersebut ditunjukkan di cambar 7.9b saat aplikasi berjalan di
096 output setText (new emulator.
DateO.toStrlnSO );
091 )

098 ));
099 )

100 return super. onMenuftemSelected ( feat-ureId,

176 Pemrograman Sntarl ['ltrtttc Mt'ttli11rtt,rk,rtr l,lll" Atrrlt,rrlIl,rrlllrr l'rrr1'Attrlrtttfl llAll / I'rrrjr,r I l),r,,,rr AlrLk,r.,r Arrrh,rrrl
177
,nrmlJ* ::il Fl,l irtffit €r r'3r F\l (baris ke-71 ,82, dan 94) yaitu mode LOCALE (Cambar 7.lOa),
GMT (Cambar 7.1Ob), atau DEEAULT (Gambar Z.9a).
- Pada baris ke 103, terdapat method finishO untuk fungsi
menutup Activity melalui button MENU_QUIT. Karena pada
aplikasi ini hanya terdapat 1 Activity makl-secara otomatis akan
menutup apl ikasi secara keseluruhan.

6. Jika project berhasi I terkompilasi dan telah ter-i nstal I pada AVD maka
akan tampak display layout Ul seperti berikut:

1-:
{$ iii li,

Gambar 7 .9 (a) Tanpilan Aplikasi WaktuSaatlni dan menu, (b) sub menu floating t ime f o rma t (a)

- Di baris ke-.|6 didefinisikan Activity sekarang. Pada Activity


tersebut terdapat sejumlah method, diantaranya onCreate fit[W& t:m p*t
(baris 27), onCreateOptionsMenu (baris ke-40),
onMenultemselected (baris 55).
Jan 13,.20!'l 1:l.t.l4 PM
Anotasi GOverride
- Pada method-method class tersebut digunakan anotasi G
Override (salah satunya di baris ke-26) berfungsi untuk
memberitahu compiler method tersebut menggunakan nama t$ffiaffiffiil
sama dengan super class. Dan digunakan oleh compiler
(b)
saat kompilasi untuk mengecek parent c/ass dan interface
apakah function sudah tersedia (jika tidak ada, compiler akan
Gambar 7 Jl0 (a) Format Locale (b) Format
mengeluarkan pesan error). Pada pemrograman Android, GMT
anotasi ini sangat diperlukan karena setiap method akan
dipanggil berdasarkan siklus Activity (Activity lifecycle). )ika
tidak dilakukan override, besar kemungkinan framework tidak -oo0oo-
dapat memanggil method tersebut"
- fase onCreate,
Baris ke-35 terlihat saat Aplikasi dalam
akan mengeksekusi method onClickListener
untuk menjalankan fungsi onCl-ick dan langsung
menjalankan method Date O yang keluarannya ditampilkan
ke layout TextView menggunakan fungsi output.
setText O . Method ini juga dipanggil pada method
onMenulLemselected setelah user memilih forrnal waktu

178 Pentrograman Smart ['hont' Mt'tt,:litttr,tli,rtr ',lth Alrltrrrrl 'l.rrr ll,rr lttrll /\tltltottl llAlj / l'rnllr I l),r.,,rr Alrhk,r,.r ArrrLnrrl 179
Location Service dan Google
Maps

Project CariLokasi - Penerapan lntent Google Maps


l',ula bab ini akan dibahas pembuatan aplikasi yang menerapkan Apr coogle
rrr,rlls dan package androj-d.locati-on untuk fungsi location service.
l'rrjcct CariLokasi dalamActivit.y cariLokasi akan mengirimkan
Editrext
rl,rl.r string dari input sebagai referensi URI dan vj-ew untuk
rrr.n<'iptakan rntent Activity Google Maps. project ini hasil modifikasi
r,rrtoh aplikasi pada dari buku Unlocking Android - A Developer,s cuide
rlrtulis oleh Abelson w.F. Berikut dijabarkan proses pembuatan project
t .rrrlokasi:
1. Buat project Android baru dengan rincian sebagai berikut:
2l android: layout_hei-ght:"wrap_content"
a. Nama project : CariLokasi 22 android: text="TampiJ-kan"
b. Application Name : Cari Lokasi 23 />
c. Package name : com.contoh.carilokasi 24 <TextVi-ew
d. Create ActivitY : CariLokasi 25 android: layout_width="wrap_contenL"
e. minimum SDK :3 26 android: layout_height:"wrap_content"
f. Build Target AVD : minimal Google API platform 1.5 (level 21 android:text:"Contoh Aplikasi Memanfaatkan APf
API 3)
{}oogle Map"
Dalam project ini digunakan build target coogle API karena aplikasi
ini akan mengakses Coogle Maps melalui intent tetapi tanpa ?-8 />
diterapkan API Google MaPs. 29 </Ltnearlayout>
2. Pada project CariLokasi, ubah file main layout (maln - xm1) menjadi Penjelasan desain Ul main.xml:
seperti berikut: - Atribut TextView (baris ke-7 dan 24) digunakan untuk
01 <?xml version:"1.0" encoding:"r11-8"?> menampilkan layout teks "Masukkan Alamat Anda:" dan
"Contoh Aplikasi Memanfaatkan API Coogle Map".
02 <Linearlayout xnlns :android:"http: //schemas. android'
- Dalam body EditText dan Button (baris ke-12 dan
com/ apk/ res/android" 18) terdapat atribut o@' menandakan element Ul tersebut
03 android : orientation:"vert tca\" digunakan sebagai lD-assignment (lD-penugasan) untuk
pengimplementasian EditText ke dalam Activity
04 andro i d : l ayout_wi dth: "fil- l-parent "
Caril-okasi yang akan membaca nama lokasi sebagai input
05 androld : layout_height:"fi1 l-parent" teks bernilai string, sedangkan Button diimplementasikan
melalui method onclicklistener ( ) .
07 <TextVi-ew 3. Modifikasikan source class carilokasi . j ava menjadi seperti
berikut ini:
08 andro i d : l ayout_wi dth:"wrap-content "
09 android : layout_height:"wrap-content " 0l package com. contoh. carilokasi,'
10 android:text:"Masukkan A1amat Anda i" t)?.

11 /> o.l import com. contoh. carilokasi- . R;


t)4 import android. app . Activity,'
12 <EditText
[],) i,mport android. os . Bundf e,'
13 android.16:,,@+id/address,,
()() import android. app . AIertDiaIog;
t4 android : I ayout_width:"fil I-parent "
t) I i.mport android. conlent . Intent ;
l-5 android:layout-height:"wrap-content"
t)tl import androld. net . Uri,'
76 androld: autoText:"Lrue"
o() import android. view. View;
7'7 />
18 <Button l0 i mport android. widget . Button;
ll i mport android. widget . EdiLText ;
19 android.16:,,@+id/launchmap"
android : layout_wrdth:"wrap-content " t.'
20

Pemrograntan Srlarl l,lrorro Mtrrllllrrrr.rk,rlr )lt Atrrlttrrl ,l,rrr ll,rr l,tttl, Atttlttttri llAlltl Aphk;r,r lx.n{,rtrl).ur Al'l (iooplr M,rI', 183
182
"l
13 public cl-ass Caril,okasi extends Activity { 34 Al-ertDialog ad : adb.createO;
t4 /** Method ini akan dlpanggil saat pertama kali 35 ad. setMessage ("Aplikasi Gagal
Activity tercipta *,/
Mengakses");
15 GOverride JO ad. show O ,-
16 public void onCreate (Bundle icicle) {
3'7 )
17 super. onCreate (icicle) ; 38 )
18 setcontentView (R. layout.main) ; 3e |);
t9 final- Al-ertDialog.Builder adb : new AlertDialog. 40 )
Builder (this) ; 47)
20 final- EditText addressfield: (EditText)
findViewByld (R. id. address) ; Beberapa penjelasan dari class carif okasi . j ava:
21_ final Button button : (Button) findViewByld(R. - Pada. baris ke-6, package android. app . AtertDialog digunakan
id. l-aunchmap) ; untuk menampilkan Alert message (baris ke-34) saar intenitidik dapat
22 button.setOnClicklistener(new Button. mengakses event OnCl- i ckLi s tener.

OnClickListener O { - Pada. baris ke-7, package android. content. Intent digunakan


untuk membuat rntent dan package android.net.url (baris
23 ke-9) menyediakan
.fungsi referensi URI pada Activity Coogle Maps
24 public voi-d onClick (View v) { (dengan method pada baris ke-31).
z5 trY { - Pada method setContentView (R. layout . main ) di baris ke_
18, digunakan untuk menciptakan Ul mengacu dari referensi main.
ZO / / berikan action saat dl-kIik xm1 seperti yang telah dijelaskan pada contoh sebelumnya.
2'7 String address : addressfield. - Pada method findViewByldy (baris ke-20) sebagai penghubung
getTextO.toStrlngO; dengan resource R. id. address menggunakan" instanie clas!
28 address : address. replace ( ' ', EditText.
t+'); - Methodfinal Button button: (Button)findViewByld (R.
id-raunchmap) akan mengkoneksikan button dengan-element
29 / / buat lntent baru untuk dikirimkan launchmap UI sebagai pem roses lanj utan. saat ter-kr ik akan iren jalan kan
ke API Google Maps method findViewByld dikaitkan dari referensi EditText.
30 Intent geofntent : new Intent (android. - Fungsi androi_d. content . Intent . ACTION VIEW (baris ke_
30) untuk menampilkan informasi yang telah didefinislran dari masukan
content.fntent.ACTION VIEW, Uri.parse("qeo:0,0?q:" + data komponen URl. lntent juga menyediakan command modifikasi
address) ); seperti EDf T dan PICK.
31 startActivity (geolntent) ; - Saat teks alamat dimasukkan, ACTION VIEW memproses
data query untuk pencarian lokasi menggunakan method Uri.
32 ) catch (Exception e) { parse ("gfeo i0,0?q:" + address) .
33 //tampilkan alert message jika apllkasi - Terakhiraplikasi akan me.request ke sistem untuk menjalankan rntent
gagal mengakses Google Maps geolntent dari masukan URI geo:0,0?q: menggunakan method
start Activity. scheme geo digunakan untuk mendefiniskan
i ntent yang akan menjalankan method startActivity (
) (baris
184 Pemrograman Smart Phone Menggttnak;rtl Sl)X Arrtlrrrrrl tl,rrr ll,rr:krtrg Android ItAli tl AJrlikar;t lxlnt,r;tl).m Al'l (irrrrHh, Map,, 185
Pada Tabel B. 1 d itampi lkan sej um lah format U Rl yang didukung oleh Android.
ke-3 1). Pada Cambar 8.1 berikut ditunjukkan diagram sequence dari Dalam tabel tersebut terlihat sebagian format URI tidak memasukkan bagian
aplikasi CariLokasi. Authority karena secara default sistem telah mengenal scheme URI untuk
Arl,'Ily [:ar]" !"ohaE:l aplikasi default (Contact, Google Maps, E-mail).

) --
t t.)ill.-;rri;Ilc
r
l I rrnt:r+ ] i'*t-[#i
W
Tabel 8.1 Contoh URI dan Acti1n lntent yang didukung Android (Abelson W.E et. al. 2009)

Tioe lnformasi Content Provider Format data URI Tioe Action lntent
,
I Melihat daftar com. android. content: // fntent.ACTION_
T:_.1
;I
**-J*-**
I U!1;'l3y kontak contact contacts/people VIEW
I
ta* lolrri
I la+:ut I *d{5f ca I Mencari lokasi
com. google .
qeo:0, 0?q:11"1irrt Intent. ACTION_
L------J out,'t melalui Coogle
android. maps
ang*S Ieman+Yogya VIEW
add:rez c karta
Akses ke browser
com. android. http : /,/qoogle . Intent . ACTION_
browser co. id VIEW
Akses Pencarian com. androi,d. Tanpa URI hanya Intent.ACTION_
(looele Search browser pfain text WEB SEARCH

Request aplikasi com. contoh .


cuaca:. / /com. Intent. ACTION_
l&.rtgi ,trti\,itv contoh. rsscuaca/ VIEW
qsoln?6fik RSSCuaca rsscuaca
.l-oc ?:vosvakarta
Membuka aplikasi
com. android. t.ef : nomor_
rrntuk akses I ntent . ACT ION_
Gambar 8.1 Diagram sequence aplikasi CariLokasi phone tefepon
lelepon CALL

4. Setelah kompilasi dan upload ke AVD atau perangkat fisik Android


lmplementasi API Geocoder akab tampak Ul aplikasi Location Map yang ditunjukkan pada Cambar
8.2.
URI merupakan suatu path data informasi yang terdiri pada empat bagian'
Yaitu : scheme, authority, path dan id request yang tiap bagiannya dapat
dideflnisikan sebagai berikut (Abelson W.F, et, al, 2009).

contentapl itasi / /corr.contoh- apl ikasikr/alernaV loc?nameYogryatarte


LrrJ#
Scheme Authority Path lD request

Bagian Scheme adalah prefix standar menandakan akses data ke suatu


Content Provider. Bagian Authority berfungsi sebagai pendefinisian
alamat content provider, dari path URI contoh tersebut menggunakan content
provider com. contoh. aptikasiku. Pada bagian Path berfungsi untuk
mendefinisikan tipe data yang akan diakses, nilai path dapat bernilai kosong
atau menggunakan lebih dari satu segmen. lD request, digunakan untuk nre-
request data spesifik ke Content Provider. Format URI yang rlitltrktrng pacla
sistern Android berformat generic yang didefinisikarr rl.rri ',l,tttrl,rt lil
( l()B(t.
ItAll t3 Agrhk,r,,r l)r,nr,r,rl),rr Al'l tirrul;k, M,rp,, 187
186 i)etnrrigrantan lltrr,trt ['lrorrr. Mr,ttllfltttt,rk,rtr ',l llr Arr,lr"r'l ,l,rrr l l,rr hrttll Atrtltottl
a. Nama project Contohceocode
b. Application Name Geocode
c. Package name com.contoh.geocode
d. Create Activity GeocodeApp
e. minimum SDK 2
f. Build Target AVD minimal Android 1.1
Project ini tidak digunakan build target API Coogle Maps karena
aplikasi ini hanya memfungsikan class android.location.
Geocoder bagian dari API Android.
2. Ubahlah layout main XML (main. xml-) yang tersimpan dalam
direktori / res / Iayout menjadi seperti berikut ini:

<?xmI version:"L.0" encoding:"utf-8"?>


<ScroIlVi-ew xmlns : android:"htt.p: /,/schemas . android. com,/
,rpk,/ res,/ android"
, r ndro id : layout_width:"fiI l-_parent " android : layout
(a) (b)
I ight: "wrap_content ")
re
menu Google Maps
Gambar 8.2 Aplikasi cariLokasi (a) entri lokasi (b) akses lntent dan display , Linearlayout xmlns : android:"http : //schemas. android.
,'om/ apk/ res /android"
Dari Cambar 8.2a dan B,2b saat user memasukkan lokasi yang dicari
pada
android: orientation:"vertica1" android: layout
,pfif"ii CariLokasi akan menciptakan intent, dan menialankan Activity
w idth="fil1_parent"
Google Maps.
android : 1ayout_height:"fiI l_parent" )
<TextView android . i6:,, + id,/ input_1abe1,,
Geocode - lmplementasi API Geocoder @

,r rdroid : layout_wldth:"wrap_content "


akan diterapkan API (class) android '
r

Pada project Aplikasi ini androj-d : 1 ayout_he ight:"wrap_content "


Local_ion. Geocoder sebagai penyedia proses Geocoding bagian dari
Ceocoding yaitu konversi dari rrl roid : layout_marginLe f t:" 70px"
a".k;g" android. 1ocati6n.'Proses tempat, jalan,. atau, daerah ke
, rr

masuk"an string nama lokasi berupa nam.a


android : layout_marginBottom:" 5px"
Jaii* nilai ko6rdinat longitude dan latitude yang bertipe float.. Geocoder
dan long,itude rr, ir:o id : layout_marginTop: " l1px"
ruea mendukung konversisebaliknya, dari krordinat ldtitude
r

irSriral Tokasi dari database location service bagian dari Coogle android:text="Masukkan lokasi yang dlcari,
services. "rr" l,,t rll(rt :" />
project ini adalah hasil modifikasi dari aplikasi yang diperoleh dari buku < Texl-Vi ew anciro j-d' 16: " + id/ i nput-_1abel2 "
;uiioif.ing Android - A Developer's cuide" ditulis oleh Abelson W.F. @

android : 1 ayout_width:"wrap_content "


Untui f"fif., memahami fungsi class Ceocode, berikut diterangkan proses
pembuatan project ContohCeocode: ,tr,It,, i rl: layout heiqht,:"wrap_Content"
1. Buat project Android dengan rincian sebagai berikut: ,ul(lt () i ri : l,ryoul mar:ginI,eft:"LApx"

188 , Pemrograman Smart Phone Metttrlgututkixt lil)x Arrrhorrl rl,rrr ll,rr krrlli Arrdroid llAll ll AIhk,r',r l]r,n(,r,rl),rn Al'l (irrrr]4h, M,ril',
android : layout_marginBottom:" 5px" <TextVj-ew androld. i6:"@+id/output,,
android : 1ayout_marginToP: I)Px" " andro id : layout_width:"wrap_content,,
android:text:"nama kota/daerah/jafan atau android: layout_height:"wrap content,,
dal-am bentuk koordinat/ contoh: -7.44L,110.241)" /> android : layout_marginLe f t :" 10px"
<EditText android. 16:,,@+id / inpuL,, android: layout_marginBottom:,, 75px,, / )
android : layout_w j-dth:"fi1 l_parent " < /LinearLayout.>

andro id : 1 ayout_he j- qht: "wrap_content " <,/ Scrol lView>

android : layout_marginLef t:" l)px"


3. Modifikasikan file Manifest (AndroidManifesr. xm]) pada root direktori
android: layout_marginBottom:"5px" /) project menjadi seperti berikut ini:
(TextView android: 16:"@+id/text_address"
01 <?xml- version:"L -0" encoding:,,uLf-8,,?)
android : Iayout_width:"wrap_conLent" 02 <manifest xml-ns :android:"http: //schemas.android.
android : 1 ayout_he ight.: "wrap_content " com/ apk/ res/android"
android : l ayout_margi-nLe f t :" LlPx" 03 package:"com. contoh . geocode"
android : layout_marginBottom: " 5px " o4 android: versionCode:" 1 "
android:text:"Input berupa alamat atau 05 android : versi-onName:"1 . 0 . 0">
l-okasi?" /) ()6 <app1 icat j-on android : theme:" G android :s tyle /
<CheckBox android . id=" G + id,/ checkbox*addre s s "
Theme. Light" android : icon:"Gdrawabf e/ j-con,,
andro id : 1 ayout_wi dth: " wrap_conten t. " , ndroid : label:"G string,/app
r name")
android : J- ayout_he i-ght="wrap_contenL " t )'/
android : Iayout_margi-nLe f t --" L }px" ()tl <activity
android: name:" . GeocodeExample,,
androld: layout_marginBottom:" 75px" / ) t)(l android : l-abe1:,,G string/app name,,)
<Button andro id : id:,, G + id,/ geocode_button,, l0 <i-ntent.-fil ter>
android : Iayout_width:"wrap_content " ll <acti-on androld : name:"android
android : 1ayout_hei ght:"wrap_content" r rr t ent . act.ion .MArN" />
android : layout_marginLe f t:" t1px" t' <category android : name:"android.
androi-d : layout_marginBottom:" 1 5px" r rrl ent . category . LAUNCHER" />
android : text:"Konversi",/) 1l <,/ intent-filter>
<TextView android. 16:,,@+idloutput_labeI" t4 </activity>
andro id : I ayout_wi dth: "wrap_content " t" </applicat ion>
android : 1 ayout_he ight:"wrap_content " It, <uses -permis sion android : name=,,android
android : layout_marginLef t :" 70Px"
.

l)ermission. fNTERNE!" />


android : I ayout_marginBot.t om:" 5px" t / ' ,/manifest->
androi-d:text:"Output :" /)

Pemrograman Smart Phorre Mtrtgl.lttrtak;rtr !i[)K Arrrlrorrl rl,rrr ll,rr.kttt11 Atltlrottl


llAlt 8 Aphk.l,t lxltctitl),lt Al'l (ioop,ls' y,1g,,, '191
190
Berikut dijabarkan sejumlah fungsi tag-tag body dari kode layout main. xmf
dan AndroidManif est. xml-: If"-". lA.''b,.-J[;*lltu' b-. Il-"*--8r".
. Pada tag-tag dengan atribut body TextView dan nama lD lnput_ I l::r-!ri 3r; r:::t:.l'1r ,.r'df f{ llit& i I lt r'}t3rl
labe1, input*IabeI2, text_address, dan output labeI
difungsikan untuk menampilkan layout teks pada Ul untuk pemberian
keterangan input.
. Tag TextView dengan nama atribut output untuk menampilkan
teks dari Ceocode yang diimplementasikan oleh class GeocodeApp
dan Activity GeocodeApp dan menggunakan method
getEromlocationName dan getEromlocation.
. Pada bagian body EditText, CheckBox, dan Button terdapat it (,rJl l. itiil.r ]4iltdl i'.1, t{ : .

id atribut "@" untuk difungsikan sebagai rujukan atribut id-resource


EditText, CheckBox, dan Button yang diimplementasikan
oleh class GeocodeApp.
. Seperti contoh sebelumnya, tag Linearlayout untuk mengurutkan
vertikal semua child element yang ada di dalam node, pada konstanta
layout width dengan nilai fill parent untuk mendefinisikan
lebar disfll-ay Ul mengacu pada ukuran dan resolusi display.
. Layout main . xmt seluruh tag dari element Ul adalah bagian dari
Gambar 8.3 Layout Ul Main XML menggunakan theme Light
tag Scrollview. Desain ini digunakan agar child element dapat
ditampilkan dengan mode scroll, yang akan berfungsi saat nilai string
dari Geocode melebihi batas dari panjang display (Gambar 8.3).
. Pada baris ke-16 digunakan atribut uses-permission INTERNET
4. Ubah class public GeocodeApp. j ava yang ada di dalam package
com. contoh . geocode menjadi seperti berikut ini:
karena aplikasi ini membutuhkan resource koneksi internet, yaitu saat
proses request ke server Coogle Services, untuk mendapatkan data package com. contoh. geocode;
Address berupa nama lokasi target atau konversi ke koordinat longitude-
latitude. i-mport android. app . Activity;
. Pada Cambar 8.3 ditunjukkan Ul setelah modifikasi dari layout main .
import android. l-ocation . Address,-
xml dengan mode lheme light (baris ke-6). Berikut tampilan UI layout
theme Light. import android. Iocat.i-on . Geocoder;
import android. os . Bundle,'
import android. util . Log,.
import andro j-d. view. View;
import android.vj-ew.View. OnClickListener;
import android. widget . Button,-
import android.widget. CheckBox;
import android. wi-dget . EditText;
import android. widget . TextVi_ew,.
import java. io. fOException,-

192 Pemrograman Smart Phone Meng,{utt;tkart lil)K Atrrlrrrrrlrl,rrr ll,rt ktttpl Attdroid ItAll 8 Apltka:;t p(]ncrirl)ln Al'l (ioogk, M,r1r,, 193
import j awa. util. List; i),
import con. contoh. geocode. R; )
// class pelformceocode untuk proses konversi
public class GeocodeApp extends Activity { Geocode
private EditText input; private String prosesceocode (finaI String
private Textvieer outpui, textlnput, final boolean isAddr) {
private CheckBox isAddress; String hasil = 'Konversi geocode - - +
private Button button; tsextlnput + 'gagal"r //definisikan result stlirlgr
if (this.input != null) {
Goverride Geocoder geocoder = nes
public woid oncreaLe (Jina] Bundle Geocode!(this), //instansiasikan ceocode!
savedlnstancestate) { if (isAddr) (
supex . oncxeate ( savedlnstancesta te ) ; Lty I //baca input lokasi,
this . setcontentview ( R. Iayout. main ) ; nenggunakan method getEromlocationName
// masukan lokasi dari TextBox List<Address> addresses =
this.input: (EdilText) findviewByIcllR. geocoder. getFronLocationName {text Input, 1);
id.input), if (acldresses I= nu1]) {
// keluaran hasil geocode. hasil = addresses.get(0),
this. output = (Textview) JindviewByld (R. tostring O;
id.output); I
this.button = (Button) JindviewByld(R. I catch (IoException e) {
id.geocode button) i Log.e("ceocode", nEr!or,,, e);
this. isAddress = (checkBox) ]
findvie{ById R. id. checkbox_addres s ) ;
( } else {
// setelah di-klik, jalankan proses // saat checkbox isAddr fa1se, jalankan
Geocode method getFromLocation
this.butlon. selonclicklistene. (new try {
Onc]icklrstener O I / / baca masukan fongitude-latitude dengan
public void onclick(final Viei{ v) { memparsing text dari tanda penisah ",,,
oulput. Stringl] coords = textlnput.
setText (prosesceocode (input. getText ( ) .tostrinq () . split(",");
isAddr:ess.ischeckedo)); if ((coords != null) &&
I (coords.lenqth == 2)) {

154 - Pemrograman Smari Phone Mcttgl1ttttakittt lil)K Atttltrrtrl rl,rtt ll,rr ktrr11 Atttlrotd ltAlJ fl Apltkast penr!r,rl)nr Al'l (irxrpllr,M,rgr,, 195
List<Address> bentuk data unformatted text. Untuk lebih jelasnya pada Gambar 8.4
addresses : geocoder.getFromlocation (Double. ditunjukkan diagram sequence Aplikasi ini.
parseDoubl-e (coords [0] ) , Double
tu]ltub Grccoddpp

.parseDoubl-e (coords t1l ) , 7) ;


hasil : addresses. get (0)
GT ffi)
I
toString O ,'
[*,uJ-r*,u".-l
I sreoedrr I
)
)

//tampilkan error pada 1og saat


# i
proses geocode gagal
t t Y$ar l,rrLtr. i nf i**t*
catch (IOExcepti-on e) {
Log.e ("Geocode" , "Error", e)

j
irda:.a,:;::1 :.r,
)

return has1l;
6JLPU: -ii'iI'JrL tt

]
Gambar 8.4 Diagram sequence aplikasi CzntohGeocode
Penjelasan class GeocodeApp . j ava: Setelah aplikasi terkompilasi dan diunggah ke emulator AVD atau
Dari class ini tampak saat instantiate Ceocoder menggunakan method perangkat android, akan tampak Ul Geocode luaran dari method
Geocoder geocoder : new Geocoder (this) sistemmenganggap getEroml,ocationName dan getEroml,ocation setelah user
user membuat Ceocoder yang dikonstruksikan menggunakan Context . memasukkan nama lokasi seperti yang ditunjukkan pada Gambar 8.5.

Saat user telah memasukkan nama lokasi dari textbox EdltText input
dengan memberikan centang pada check-box isAddress (dengan nilai
boolean True), selanjutnya akan diproses oleh geocoder menggunakan
rnethod geocoder. getFromlocaLionName (textf nput, 1)
dengan l-iasil keluarannya berupaString hasil yaitu nilai koordinat
longitude, latitude yang akan ditampilkan pada TextView output.
Method tersebut hanya difungsikan untuk menampilkan keluaran 'l lokasi
yang didefinisikan nilai maxResu-l-ts : 1 (nilai yang ditulis tebal dan
digarisbawahi).
Sedangkan pada proses geocoder sebaliknya, yaitu dari masukan longitude,
latitude dengan menentukan boolean isAddress bernilai Fa1se, yang
selanjutnya akan menjalankan method geocoder . getFroml,ocation
dan memasukkannya ke List Array Address untuk ditampilkan pada
TextView dengan lD outpuL label pendefinisian nama lokasi dalam

196 Pemrograman Smart Phone Menggunakan S[)K Arrrlrorrl rl,rrr ll,rt:kttrg Arrdrord llAIl B Anltka:;t Don(.r;rtlnn Al'l (iorruh, M,rtr:, 197
i.:'! !.';i .i :;iii:r'i:l I r: .rjil iiji
i,
t
', I
li i - i. itrir-1r:. 1 I 11. t ,rIll ;' jtr

ii - .1 tr: .1 1". 1: l',,'..i .


f
'1ll:::iit:',t:lJ --."--
I
..-"1

1".",rtl

v I iliili'fJrirfl i
1***-*:ill

. t'dq.r",rrs.i
," illl.r-r1
. .. r..... ... 'l

;J,, i11l.}13'lr,.,rr.'!t,.i*,it i.!iii,.r i1; i :;f li:' ll


r! :.' :1 1:,,1.r:':,' i':' : i f ]'.i' l' :,"r il,,J' "!rl I ::jr::{ - i:;l Gambar 8.6 Salah satu satelit konstelasi GALILEO (sunber:
:ii:. hrtp.://www.esa.int/esaNA/galileo.html)
I:l::r:r:il':i: al J. ;; ,;.-I:.,,$ln, r'":l,lir"tr. a,xtl, .r

.i:.l:,:-: r" ... I"'r-1r'


i...il.ii t .il,- "'. .-,, I I 1,; y;:, 1.,1 ;1.1-1, fl. Ketepatan pengukuran dari geo pos.itioning tergantung
.- ;-tr. . \:t- ^ 11:-..,..n ',1,i,1,,f -r.:r"_r,r: dari faktor cuaca,
1*:f .L:a: :..:.i.:Xa ! !rlt! i"1;IL{lr!r kondisi geografis perangkat riceiv'er dan *i"riiv3"s
r,i..
dengan receiver. untuk
.lumiah ;rpliilrnrnrng
(a) (b)
teknologi navigasi yang terah.meningkatkan
keakurasirr' ;;;g;;'beberapa
diterapkan pada perangt ut nnJrolJiiantaranya:
Gambar 8.5 Ul aplikasi Geoclde (a) input nama tempat dan (b) koordinat latitude dan longitude 1. gPS, merupakan teknologi navigasi yang telah berkembang cukup
Iama sejak peluncuran perdana sa-terit beipada tahun
t oia. ,twarnya
sistem. navigasi ini diperuntukkan untuk sistem pe.tahanan
miriter
Amerika serikat. saat ini sistem cps telah melibai[an :o
lonstelasi
satelit (Cambar 8.7) yang. dapat digunaka.n drt;; 6r;;u['
Teknologi Geo Location diantaranya transportasi, edukasi, dai penelitiar.
bidung,
Perangkat Android umumnya memiliki fitur Ceo-location (Ceo Lokasi)
ilg" ;6.g,an besar
layanan GpS saat ini dapat diakses secara u"uus Jin'grr,i;.-''
memanfaatkan chip penerima sinyal GPS yang tertanam pada perangkat
Android atau BTS Location Service. Kini beberapa negara maju masing-
Sistem cPS adalah konvergensi dari sejumrah perangkat
masing memiliki konstelasi satelit yang berbeda untuk sistem navigasi sebagai komunikasi
nirkab.el vang m.enggunakin jarur frekuensi tinggi isui ;ii"rit cps
penyedia layanan geo positioning diantaranya CPS (milik AS), CAtlttO (Uni-
dapat be rkom u n i kas i ian gs u ng dengan receiver c Fi t"""pi
Eropa), CTONASS (Rusia), dan BeiDou (Cina). d i pen garu h i
dari faktor cuaca atau geografis.
lnformasi lokasi posisi yang diperoreh dari rayanan cps
ke perangkat
receiver cps berupa nirai satuan koordinat Bumi, yaitu
nirai looroinat
longitude dan latitude (bersatuan derajat, UTM,'atau lainnya),
dan
altitude dalam satuan kaki atau meter.

198 - Pemrograman Smart Phone Menggunakan SDX Artdrotrl rlarr llar:krrrg Android llAltli Apllka:;r lxll(!r,ll),ut Al,l (iooglr M,rp,,
199
GambarS.TsistenkonstetasiGpSyangmeribatkan30saterit(sumberKapranE.D,Hegafiy,c',
J., 2006)
Gambar 8.8 llustrasi Pengukuran lokasioleh satelit-satelit GPS (Sumber: Kaplan E.0., Hegany, C.,

peranekat receiver CPS (dalam hal J., 2006)


Agar satelit dapat mengetahui lokasi
ini mobile fitlr cPSl harus berada da.l,am posisi
nnaroil'iuig'r"riiiti
IOS (Line-of-sish;;i;;; selum]4' satelit' vaitu p'aling,sedikit 3
buah 2. Assisted CPS (A-CPS), merupakan navigasi turunan dari sistem CPS
a"pr, I iiuiSiln-pbsisi 2 d i mensi'yaitu'. koord i nat longitu de, yang lebih advance. Sistem ini tidak hanya menggunakan satelit sebagai
sare/ir agar
dan latitude. pr;H';"["p",r"". informasi koordinat perangkat
p e r b a n d i n ga n
penentu koordinat perangkat receiver, juga melibatkan jaringan BTS
recei v e rC PS te rsef,rli d ;;;;il;; t'r i I i te r as i' va tu' p ro ses
i
operator seluler yang terhubung dengan perangkat receiver A-CPS
(Gambar 8.9). Antara perangkat receiver yang menggunakan sistem
kekuatansinyalyangditeiimaolehsejumlah,satelltCPSdalambentuk
H egarty' C'' l'' 2006) D''
oerDotonrantirr"ttJt'i") (Sumber: Kaplan E' A-CPS dan CPS konvensional tidak saling korlpatibel karena A-CPS
yang ditunlukkan Pada gambar B'B' menggunakan sistem receiver CPS parsial (dengan tingkat presisi yang
Iebih rendah dari CPS).
harus diperoleh informasi Pada perangkat A-GPS selain memperoleh informasi koordinat
Untuk menghitung posisi secara 3 dimensi
m9nggu13!an 4 buah satelit' Iangsung dari satelit, juga dikirimkan pula informasi assistance ke
tambahan altitude-(ketinggian)' minima[
Setiap satelit ;; l:;;;ff; f iu' ton'tekallcPS mengorbit 2 kali satelit, dimulai dari lokasi BTS yang terhubung dengan perangkat,
kemudian melalui MSC (mobjle switching centre) untuk mengirimkan
dalamseharideigan-lintasanpresisidankontinumentransmisikan
6;and"'d; pada frekuensi
si ny a! L I RiSh;"
rlu,t r-ri pil arized L-B and) data hasil intersection kekuatan sinyal antar-BTS tersebut ke server
i"n'l;;;iLai;!a frekuensi 1227'6 MHz (Sumber: A-CPS. Data tersebut akan digunakan sebagai informasi detail
1s7s,42 uH. koordinat untuk dikirimkan kembali ke satelit CPS untuk mendapatkan
fiplin E.D., Hegarty , C', J',2006)'
verifikasi informasi detail koordinat.
Sistem ini memiliki keunggulan yaitu pengurangan waktu searching
saat di daerah yang banyak bangunan penghalang, dan dapat mengatasi
efek doppler yang diakibatkan dari pergerakan orbit satelit (Djuknic,
C., M., Richton, R., E., 2010), tetapi sistem navigasi ini tergantung
pada keturst.rli.r.rrr j.rringan operator, sehingga lebih cocok digunakan

llAll 8 Aphk,r,,r lx,n(!r,tp,ln Al'l (irxrgk, M,11r., 201


200 PemrogramanSmarlPhonr.Mr.ttggttttnkatt]i|)XArrllrrrrtIrl.rrrllirr'krnllAndrotd
yang sudah memadai' navigasi GPS atau A-CPS. Provider ini memiliki kemarnpuan
di area perkotaan karena cakupan iaringan presisi 50 meter hingga 2 meter (saat perangkat telah terhubung
kemampuan navigasi
Sedangkan kekurangan lainnya . diantaranya j 3 hingga 10 buah satelit). Sistem navigasi GPS ini tidak
re ce i v e r sa n gat r" rg^n,, n!'J'ii
k"te.ts"d aan a ri n gan
i
^o-?:l'.:^".1 ^1"" memerlukan jaringan internet atau operator, sedangkan pada
|;;h';r.;k;Grn"f"n untuk area perkotaan karena coverage A-CPS harus melibatkan server ACPS melalui jaringan operator
'arrngan
yang mencukuPi. selular.

a*rrn&

,d_:-

lntormasi
Assistanc€

Server A-GPS
BTS B

Android dengan
Receive(A-GPS
\
-{.
I 1...1.,,..

t't''''tt' Gambar 8,10 Fungsi location prlvider pada Google Maps menggunakan koneksi GPS
l
Jika kita mengimplementasi tipe provider GPS PROVIDER
pada perangkat yang tidak mendukung CPS atau A-CPS maka
akan memberikan keluaran return error.
GPS
Gambar 8'9 Baqan sistem navigasiAssisted
Richton' R'' E'' 2010)
b. ProviderNtrTWORK PROVIDER, providerini jugamemberikan
(suiter Diuinic' G'' M, keluaran constant xring longitude dan latitude dengan presisi
'
yang lebih rendah (50 meter hingga 3 km). Tipe provider ini
menggunakan lokasi service dari jaringan BTS Seluler atau
Fungsi Geo-Lokasi pada Aplikasi Android HotSpot Wi-Fi.

package librari Android yaitu android ' Jika kedua jaringan ini dalam kondisi aktif, secara otomatis
Seiumlah c/ass di dalam geo sistem akan memilih salah satu yang memiliki keakurasian
i=j:";i";'ltrr*eii"U"s; ,1.[' s^eo-lokasi, yang dapat mengakses dari tertinggi. Pada mode jaringan operator koordinat diperoleh dari
p"ti"i%t rt"''bPS',A-GI'S' Hot Spot Wi-Fi atau
lokasi menggunakan 'koordinat informasi lD BTS seluler hasil request ke server MSC seluler,
longitude dan /atitude'
BTS operato, ,"trnlrtnlr"r?rn Jipuroleh kemudian informasi lD BTS yang diperoleh digunakan sebagai
;;tfi;; ;"ns ar("*'bltt'g" "iiatoid ' 1 ocation tersebut vaitu :
referensi request ke server Google service untuk mendapatkan
. Class LocationManager, menyediakan fungsi akses'ke location pengembalian nilai koordinat. Pada koneksi menggunakan
longitude' latitude' dan
provider y"ng ,L'n'ie;;l# posisi
-prr"m koordinat
location
WiFi HotSpot, lokasi koordinat perangkat diketahui langsung
class ini terdapat 2 tipe dari request ke server Coogle service yang menyimpan
p"r"ieLiii"Jr"ii
altitudeorrt
provider'. database koordinat HotSpot tersebut. Jika pada database Coogle
belum tersedia database koordinat Wi-Fi tersebut maka akan
a.ProviderGPSPRoVlDERdeneankeluarankoordinatbertipe
hanya tlilirrrr'rkan sistem
constant titr"f p"a' GPS-PRo\irDER
ntcnrl rcrik.rtr kolrr.rr:rn error.

lJ)h Atrrltorrl rl'ril ll'rt'kttlg Androtd ItAlS 8 Allhk,r:,r lx.nr,r,rl),rtr Al'l (1r111pr11. 16,t;,' 203
202 Pemrograman Smart Phonrl Mttttggttttrtkntr
Konfigurasi Geo-Location
l. Emulator AVD
Dari penjelasan emulasi geo-location di atas, posisi koordinat diperoleh dari
berbagai sumber baik hardware cps internar'aiau emulasi cpa ;;;ggunakan
tool ddms atau melalui emulator console dari akses telnet (pajic'ommand
prompt).

Lsc.atim{ql!"ols
!,I*rd lo* | ${- |
f xomg
i. $€x&lesma,

lin$*Unlt
La&i.lde

Gambar 8.11 Location Provider pada Googte Maps menggunakan


(a) wi-Fi (b) operator GSM
*sl
. Class Addresses, berfungsi untuk menampilkan sejumlah informasi
singkat definisi nama lokasi berupa string array <Address> yang Gambar 8.12 lnput koordinat Longrtude dan Latitude pada location control
ddms
Jif.""tinui dari referensi koordinat longitude dan latitude menggunakan
provider Gps_PRovIDER atau provider NETWORK_PROVIDER.
bata array <[ddress> merupakan penyederhanaan dari format St'dangkan p.ada penggunaan tool consore based telnet, untuk akses
bahasa *AL (extenrible Addresies Language). Meskipun demikian, ronsole emulator AVD dengan perintah:
iorrit tersebut tidak sepenuhnya sama untuk informasi alamat seluruh
aunii trit"lnya, di ,riu n"gar" digunakan lokasi hierarki terendah t elnet loca]host 5554
u"ru p"'noror'b ok, sedan gka-n negara lai n nya men ggu.nakan ke u rahan
I
I

,tu, i"i"nl. Sehingga data y-ang tersimpan di array 0 tidak selalu berisikan sclanjutnya telnet. tersebut akan terhubung dengan console dari emulator
nama jalan atau kecamatan. AVD sehingga kita dapat menjalankan periitah-p'erintah padi lingkungan
. Class Geocoder, fungsi class ini telah dijelaskan pada contoh , onsole yang telah dijelaskan pada bab sebelumnya.
geocoder.
t.Jrtuk menjalankan emulasi geo-location setelah emulator console
. Class GpsSattellite, menyediakan fungsi pembacaan state
r l,rpat menggunakan perintah:
berjalan,
r"irrnfun satelit GPS yang terhubung dengan receiver,. beberapa
iniorriri yang dapat diakses diantaranya sudut Azimuth, sudut elevasi, ,r, ,o fix <longitude> <f atitude>
irri" SfVn'fSilna/-to-wo;s e Ratio), data almanac dari tiap sate/it' Class Nil.ri longitude dan latitude tersebut menggunakan separator angka desimal
ini didukung untuk level APt 3 ke atas (OS Android versi 1.5 atau lrcrupa tanda titik (standar US).
Cupcake).
\t'lt'l.rh emulator console terhubung dengan emulator Android, masukkan
t rttrttrtand geo fix yang diikuti dengan nilai koordinat,
misalnfa [ongitude
I 10.3837 dan latitude : -7.76-45!26a jika comman'd tersebut
dire"sponi
,,l.lr p.r..gkat atau emulator AVD akan memberikan keluaran oK.-

204 Pemrograman smart Phonr-. Mtlrrggrtttakarr lil)K Arrrlrorrl rl,rrr ll,rr.krng Android
ItAl{ tl Agrhk;t.,r lx,n(,t,rlr,lt Al,l (iouglr.M,r1r., 205
geo fix -1 .7 6454264 1L0 ' 3937 RegistrasiAPl Map
Karena dalam pengimplementasian aplikasi ini diterapkan API Map untuk
OK mengakses Coogle Maps yang bersifat proprietary maka diperlukan registrasi
untuk mendapatkan nomor unik API key yaitu nomor MD5 fingerprint sebagai
PadaversisDKAndroidyangdigunakanpadabukuiniuntukfungsiemulasike sertifikasi aplikasi yang mengakses Coogle Services. Nomor API key terdiri
terhubung
g""l.f.rliierkadang *irin"*J*iliki bug, vaitu tidak dapat dari dua tipe sertifikasi yaitu sertifikat default debug dan sertifikat production.
emulator saat menS-ufaut" tolasi nvo itau Emulator gagal mengaktifkan
Untuk mengetahui nomor MD5 fingerprint, dengan menggunakan
digunakan
CPS saat aplikasi ,"-ffi",t koordinat' Di sarankan
sebaiknya
Debug Certificate yang disediakan dalam paket SDK Android, berupa file
command geo fix n]"tlLi t.rnet karena cara ini sangat iarang menemui
debug.keystore dan tool MD5 Fingerprint generator keyt.ool,
permasalahan. tool ini merupakan aplikasi conso/e based yang merupakan bagian dari
paket JDK (tersimpan dalam direktori C: \Program Eil-es\.rava\
jdk1. 6.0_22\bin).
ll. Perangkat Android
Berikut ditampilkan perintah lengkap untuk mendapatkan MD5 Fingerprint
PadaperangkatAndroiddiperlukankonfigurasiuntukmengaktifkanfungsi
jaringan wireless dan hasil keluarannya pada command promptwindows 7:
L"":rI..ti"i- Untuk;;";k;at;ng hanla mendukung tanpa.perangkat keras
(baik melalui wi-Fi irrT"grn ciu/:c-operator)
"t-r, gs -+ Loc.ation and Security
6il';;Gg;n"trn t onfiguirtip"a, menu Seitin
Networks, disertai tap tombol Agree
-+ berikan centang *"n',i Uiu Wireless lkan data lokasi
C:\Users\user_name\.android>keytool -list -keystore
(permission rgar ur"r";l*i"'Oof"hfan Coogle me,nsu1gy debug.keystore -storepass android -keypass android
'lioin.,ioug. "Sedangkan- p[r^ngkrt yang *eiitiki f itir CPS dapat diberikan
CpS sate//ites yang tampak pada Gambar
8'13a dan
centang pada menu ui"
8.1 3b. Keystore type: JKS
Keystore provider: SUN

Your keystore contains 1 entry

androiddebugkey, 20 Okt 10, PrivateKeyEntry,


(lertificat,e fingerprint (MD5) : B1 :E0:C1 : 3B:BF:B5:CB:DC:A
Il :46 :AC : C3 :21 :D8: B9 : BB

(a)
(b) Nilai Iuaran keytool adalah nomor MD5 fingerprint, yaitu B1:E0:C1
:3B:BE:85:CB:DC:AB:A6:AC:C3:21:DB:89:BB, nomor ini
rligunakan saat proses registrasi pada website Android developer pada Iink
Gambar8.l3(a)menulocationseruicenenggunakanjaringanwielessdanGPS(b)Menu
l.lRL: http://code.google.comlandroidlmaps-api-signup.hrml (Cambar 8.14b)
Permission
rli dalam teks box My certificates's MD5.
provider maupun gps provider,
Kedua tipe provider tersebut baik network
daDat aktif secara kedua provider tersebut memiliki
b"r;;;.-i"trpi,
keakurasian Yang berbeda.

pemrogramanSmartphoneMr.rrggrrrrirkarr iillhArrlrorrl rl,r||ll,rr.krttl1 Atttlrottl ltAlttt Alrltk,r"r p|n|r,rlr,rrr Al 'l (ioolih'M,rlr" 207
206
"Professional Android Apprication Deveropment,
2nd Edition,, yang dituris
oleh Meier R. Datam p..oju.t ini &Jr;;'6;';r;;r,'""rrL1r,
.1 1: ri.". ft t
provider tersebut yang masing-masing "[an kedua
beke4'a secara mandiri dengan tingkat
yan g berbeda. Blri kut'.",
, ttflrltt.!rdtt!\rtsl
l:i:ll.r',"" ";i;; ;"*b;"l";;q
;J
"'fr
i uri t"r.
llr fiiif.ii'* *{E4t{

ffiffiJe'' 1. Buat project Android dengan rincian sebagai


(b) berikut:
a. Nama project CekLokasi
Gambar 8|14 (a) Screenshot halaman register API Map (b) pengisan MDS fingerprint b. Application Name Cek Lokasi
c. Package name com.contoh.ceklokasi
d. Create Activity CekLokasi
Setelah MD5 dimasukkan fingerprint akan diperoleh API key yaitu e. minimum SDK
0mlMptBb4uHpsxOdgmnBIkTZpDovkZsDk0qOZPA yang pada halaman 3
web tersebut diberikan contoh implementasi pada layout XML (Gambar f. Build Target AVD minimal Android 1.5 (disarankan tidak
B.1s). menggunakan emulator)

Googlc ikpc AFI


af*grslltbt!, ! ;@1. lr*t 4El \ *oot{ Ar.Fe .&q 5{Frp Saat aplikasi ini
akan dijalankan, sangat disarankan di_run
m en ggu naka n pe ra n gkat And io i d f i s i
kyanl riem i ki f it u r C i s(;; k;" Ii
tlrent you lor rignbg up f,or rn Andrrid ltlapr API kayl Emulator AVD), disebabkan u.rtrtoi--nlnya
mendukung emulasi
GPS, yang tidak menyediakan fungsi emulaii Network provider.

.'hii
t.y rr csqd h( r! 9ctrr cai.d rrti lsr cldfEnte fihe irgwnl Pada project ini menegunakan build
target Apl Google Maps karena
aplikasi ini mengimplementasikan;;.i;;";'ptMaps
a: : a::._ L ia :3:ra5: a?: &. lE:&(: l:: a I i:: , !:: !: I :! com . sooq f e .
tirn rs * uampb rni brM to qEt f@ trtrd sn you ey lo mrpFng ghry ? l9"I :., * ; I
Anorotct.
up
:,d i m a n a pac k ige te e b u t n u
Jrka suatu perangkat Android tidak mendukrnE pl.f.ueu
i
r-n- i i i I [ ;;;i^;;
API Map (bagian dari Apr coogre rurupsr ..,u[a
",
(- -r tlqlt.a:.i: - r j.e-_.XSVr.s
ra:r61cl I r:or:_*: dip. ar I 1_pr.6rt aprikasi ters?fri;id:k
dapat berjalan dengan nor'.nril nprilaii in1'jrg'"
.s!crlt I5:iu'- !.-i:t-':!tJ -t!.Dt'
iriat: 1dr.a,t!{/"t*H.a51.rx!!{;_{:s:t' ;ok1'(:.Lr},r:itl' android. location. Geocoder sebagai"fungri f.",i"urii ,;";;i#;Ll,
J*i
koo.rdinat.longitude dan latitudl
project sebelumnya.
;;","dffir"
frfliri ruili p;;
Gambar8.l5 PerolehannonorAPl keysetelahregistrasi MDS lingerprint(Sumber: http.://code.

goog le. com/a nd roid/maps ap i-sig n up htm l) 2' Modifikasikan fire AndroidManifesr. xml menjadi seperti berikut
ini:
r) I <?xml version:,,1.0,,
encoding=-r51_g,,?>
Project CekLokasi - lmplementasiAPl Google Maps dan tt.t ..rnanifest xmlns :android:,,http:,/,/schemas.android.
Geo-Location ' 'n/ apk/ res,/android,,

Project selanjutnya adalah aplikasi Cek Lokasi untuk menorapkan fitur Ceo- () i packagq:,,com. contoh. Ceklokasi,,>
location untuk memperoleh koordinat longitude rl.rrr l,r(ittr<lc tti<'rtggtrnakan t)4 <appJ.jcal ion
Network Provider dan CPS Provider. Projccl irri ,rrl.rl,rlr rrrrrrlili[,rsi rl.rri lruku

208 [,r'rlrgJlrartrarr Sttrarl l,lr6rr1 Mr,rr]:t:rrrr,rk,rrr ',1 )lt Arrrhrrrrl rl,rrr I l,rr krrrt, Arrrlrorrl llAll tJ Aplk,r,l lx'nlr,rp,lt Al ,l (ir)()t:k, M,rl),, ZOg
05 android : icon:" Gdrawable/ lcon") Pada permission ACCESS trINE LOCATION (baris ke-16)
06 (uses-library android: name="com' google' android' diperlukan agar dapat mengakses fungsi navigasi menggunakan
provider CPSatau A-CPS, sedangkan penggunaan permisson ACCESS
maPs"/> COARSE LOCATION diperlukan agar perangkat dapat menjalankan
01 <acti-vi-tY fungsi navigasi melalui network provider (dengan jaringan operator
08 androi-d : 1abeI=" G string/ aPP-name" atau Wi-Fi).
android: name:" . Ceklokasi") 3. Selanjutnya modifikasikan file Main. xml- yang terdapat pada
09 <intent-fifter> direktori /layout menjadi seperti berikut ini:
10 (action android: name:"andrord' intent' 01 <?xml version:"I"0" encodinq="uLf-8"?>
action.MAIN" /> 02 <Linearlayout
11 <categorY android: name:"android ' intent '
03 xml-ns : androld:"http: //schemas . android . com/ apk/
caLegory.LAUNCHER" /> res /android"
LL < intent-fifter>
/ ()4 android:orientation:"vertical"
13 < / activitY> 05 and.roid:Iayout_width:"fill_parent"
t4 </aPPlication> 06 android:layout height:"fill parent">
i5 <uses-Permission android:name="android' 01 <TextView
permi s s ion . INTERIiIET" /> 08 andro i-d . 14: " + id,/ network],ocat ionText "
@

i6 <uses-Permission android:name="android' 09 android : Iayout_widLh:"fiI l_parent "


permi s s ion . ACCES S-FINE-LOCATION" / > 10 androld : 1 a yout_he i ght: " wrap_con tent "
l1 <uses-Permi-ssion android:name="android' t1 android:text:"Gstrlng/he11o" />
permission . ACCESS-COARSE LOCATION' / > l2 <TextView
18 </manifest> l3 android.l6:,,@+j-d,/gpslocationText,,
l4 android:layout_wrdth:"fill*parent"
Pada file AndroidManifest'xml baris ke-6 di dalam node l5 android:layout height:"wrap content"
applicati"" AJ"f.i'rasikan librari com' go.ogle,t,android'Google android:text:"Gstring/heffo" />
maps mengg"""f.r" trJ uses-Iibrary deklaiasi librari dapat
16
tersebut
fr^ibs ini fip"riuLrn iebagai syarat agai aplikasi eksplisit
I I <com.google.android.maps.MapView
secara
mengimplem'unirii npl laap"dengan meng-inc/ude-kan I il andro i- d : i d: " G + i d/ goog1eMapV5-ew"
bukanlah
dalam Manituri.-iiri ini iisena6tan libiari Coogle lr4aps
an droi d : I ayout_wi dth= "fiI l_pa rent "
yang sifatnya ()
librari standa, f".tig" Android, tetapi merupakan API I

opsionat or, n1[rgiifiiiar[a,auiung'oleh salah satu produk perangkat 'o andro id : l ayout_he i ght:"fif I_parent "
Android. f ungrl' p'"nd"[t"r"rlun ini I uga d iperl ukan untuk perl uasan
.' I android: enabled: " Lrtre"
(extend) dari Activity MapAct ivi ty'
INTERNET
Pada baris ke-16 terdapat penambahan perm.ission
menjalankan request 'j
Vrng Jip"tf ukan agar aptiLa* dapat. -!to::t
akan
android:apiKey:"0mlMptSb4uHprcIILHrfQR2CBT4RHn9N
dengan *.nuiup[Jo class Geocoder yang .
dimasukkan
cGPkVhUw" / >
dalam Array Addresses menggunakan method
geocoder'
' | /l,in,',rrI, \.,,,r1
getFromI,ocationName'

?11
210 Pemrogramattsntarll)lrrrtrt.Mr.trgllttttak;rrr,;IlKn||t||lllllrl.rtrll.rrkrrttiAtrrlrtlttl
Pada tag T extVi two r kLo ca t i onText
ew dengan referensi I D n e
rmport android . l-ocation . Location,.
digunakan untuk menampilkan string value longitude-latitude dan import android. Iocation. Locat j_onlj_stener,.
konversi Addresses dari pengimplementasian class Geocoder import android. location.LocationManager;
menggunakan provider wireless network, untuk TextView
gpslocat.ionText digunakan untuk menampilkan data string import androld. os. Bund1e;
Iongitude.latitude dan hasil konversi GeoCoder dari provider CPS. import andro j-d. widget . TextVj-ew;

Dari layout Main . xml, Ul terdapat tag com. gooqle . android. public cl_ass Ceklokasi extends MapAetivity
{
maps.MapView yang merupakan syarat untuk display MapView GOverride
sebagai penerapan API Coogle Maps dan pada pengimplementasian
MapView di setiap aplikasi diharuskan memasukkan nomor API key,
protected bool_ean isRouteDisplayedO
{
yang dapat diperoleh dengan meregistrasikan MD5 fingerprint yang return fa1se,.
telah dijelaskan sebelumnya. Tetapi, jika menggunakan nomor APlkey ]
dari pengembang lainnya, aplikasi tersebut sulit men-tile image dari
server Coogle Services, disebabkan APlkey tersebut sudah digunakan
pengembang lainnya. MapController mapControl l_er ;
Overlaylokas i pos itionOverlay,.
4. Selanjutnya, modifikasikan class Cekl,okas i . j ava yang tersimpan
dalam package com. contoh. ceklokasi menjadi sepefti berikut GOverride
ini: public void onCreate(BundLe savedfnstancestate)
package com. contoh. ceklokasi,' {

super. onCreate (savedfnstanceState) ;


import ; ava. io. f OException,' setContentView (R. layout.main) ;
import java. uti1. Lj-st,
import java. util- . Locale,' MapView myMapView = (MapView)
I indViewByld (R. id. googleMapView)
;
import com. google . android. maps . GeoPolnt; mapContro.l-l-er : myMapView. getcont.rol-ler
O,.
import com. google . android. maps . MapAct.ivity; / / set mode mapVj_ew
imporL google. android.maps.MapController;
com. myMapView. set.Sal_elf ite (true) ;
,// tampitkan
import com. google . android. maps . MapView,' ul.ige sate-l-it
import com. google . android. maps - Overlay,' myMapView. setstreetView (true) ; / / Lampilkan
import com. contoh. Ceklokasi. R; i rrr,rqe j alan raya
myMapView. displayZoomContro ).s (false) ; / /
import android. content. Context; I i :;,rbl e kOntrof zooming
import androj-d. locatlon . Address; mapControfler. setZoom (20) ; / / set nilal
import android. location. Geocoder,' I,'l.rul-L zoom

212 - Pemrograman Smarl Plrone Mr,rrggutraknrr i'l th Arrrhorrl rl,rrr llar.krrrg Android
ItAII tl Apllkirsr lxlncr,rl,,ln Al,l (ioogk, M,t1r.,
213
/ lalankan update request setiap 2 detik
/
dan perubahan posisi min lm
// tambahkan Over]aY],okasi
locationManager . requestLocat ionUpdates
posi:tionoverlay : new overlaylokasi () ;
(

List<Overlay) overlays : myMapView'


Locat ionManage r . NETWORK_
PROVIDER, 2000, L, locati-onlistener) ;
getOverlaYs O ;
l-ocationManager . requestLocationUpdates (Loc
overlaYs ' add (Posit'ionoverlay) ;
at i onManager . GPS_PROVI DER,
2000, L, locationlistener) ;
LocationManager Iocat ionManager i
,/,/ request instance dari LOCATION SERVICE
l

menggunakan method
melalui private final Locationllstener focationlj-stener :
/ / la1ankan System Service
new Locatj-onl,istener() {
interface context publ1c void onlocationChanged (Location
String context : Context.LOCATION
locatlon) {
SERVICE;
updateNewNetlocation ( location ),'
l-ocationManager : (LocationManager)
l
getsystemservice ( context) ;
/ / guoakan location provider GPS
dan
public void onProviderDisabled (Stri-ng
wireless network provider)
String gpsprovider : LocationManager'GPS- t
updateNewNetI,ocation ( nu11 ) ;
PROVIDER;
Location gps locaLion : locationManager )

. getl,astKnownI,ocaLion
gpsprovi (

public void onProviderEnabled (SLring


der) ;
grrovlder) {

updat.eNewGpsLocation ( gps-location ); I

public void onStatusChanged (String


String networkprovider : LocationManager'
provider, int status, Bundle extras) {
NETWORK PROV]DER;
Location net location = IocationManager t-
)

. getLastKnownlocation net'workp ( It

rovlder) ;
private void updateNewNetLocation (Location
updateNewNetLocation (net-Jocation) ; l,rr:ation) {

ItAll tl AlrLk,r',t l)r'rt{tr,ll),ln Al'l (rorr11ll M.rlr'. 215


214 PemrogramanSmartPlrontlMt,ttplgttn;tkattlil)KAttrlrrrrrlrl,ttrll,rrktttliAtldrtlid
String latlongstring; Geocoder gc : new Geocoder(this,
TextView mYLocationText ; Loca1e. getDef ault O);
mylocationText : (lextView) findViewByld(R. try {
id. network],ocationText) ; List<Address) addresses :
Strlng addressString : "Tidak di-temukan gc . getPromlocation ( l-atitude,
nama f okasi",' longitude, l) ;
StringBuil-der sb : new
if (location !: null) { StringBuilder ( ) ,.

positionOverlaY. if (addresses.slzeO > 0) {


setNetlocation location) ;
( Address address :
addresses. get- (0) ;
/ Update menggunakan network
/
provider I posislkan pada tltik tsb for (inti:0,. i<
Double geolat = location. address. get-MaxAddressLi-nelndex (),. i++)
getlatitudeO * 186; sb. append (address
Double geolng = location. getAddressline (i) ) . append ('., ");
getlongitudeO * LE6; sb. append (address .
GeoPoint point : new qetLocalityO ) .append(.., ..)
;
GeoPoint (geo],at. intVafue O , geolng. intVafue O ) ; sb. append (address .
r;etPostalCode O ) .append(.., ..) ;
mapControlf er . animateTo (point ) ; sb. append (address
r;etCountryName O ) ;
double l-at : location.qetlatitudeo )
doubfe lng : l-ocation. addressString : sb.t.oStrlngo
getlongitude ( ); ) catch (IOExceptlon e) {
lat],ongstrlng : "Latltude:" + lat * )

" Longitude:" + lng; ) else {


latl,ongSt.rlng : "Provider Wirel-ess
double fatilude : location. tlr,twork 1-idak menemukan koordinat,,;
getl,atltude ( ); )

double longi-tude : focation. mylocationText.setText(..posisj- saat ini _


getLongltude O; ll,,l work Provlder (merah) : \n,,
+ fatlongstring + "\n,, +

216 Pemrograman Smart Phonc Mt'ttl4gtttt,lk,ttt lil )K Arrrltorrlrl,rrr ll,rr:ktn11 Android ItAlt ti Agrhk,r,,r l)r,nr,,,tl),lr Al'l til,rHlr,M.rlr 217
addressString) ; longitude, !) ;
) StringBuilder sb : new
StringBuilder O;
private void updateNewGpsLocation (Location j-f (addresses. slze O > 0) {
location) { Address address =
String IatlongString; addresses.get (0) ;
TextView myl,ocationText ;
mylocationText : (TextView) findViewByld(R. for(inti:0,.i<
id.gpsLocationText) ; address. getMaxAddressLinelndex ( ),. i++)
String addressStrj-ng : "Tidak dj-temukan sb. append (address .
nama lokasi"; getAddressLi-ne (i) ) . append (.., .') ;
sb. append (address .
if (l-ocation != nul-1) { getLocalityO ) .append(.., ..) ;
// upOate koordinat l-okasi sb. append (address .
menggunakan gps provider getPostaf Code O ) .append(.., ..);
pos itionOverlay . sb. append (address .
setcpsLocat j-on ( locatlon ),' getcountryName O ) ;
double tat - location. getlatitude ( ) ; I
double lnq = location. addxessstring = sb.tostring0;
getlongitude0; ) catch (IoException e) {
latlongstring = \latitude:z + lat + )
" Longitude:" + Ing, ) else {
latlongstring = "Provider GPs tidak
double latitude = Iocation. rnenemukan koordinat,,;
getlatitude O , ]
doubte longitude = location. mylocationText. setText {.,posisi saat ini _
qetLongitude O; r;ps (biru):\n,,
+ tattongstring +..\n,, +
Geocodel gc = nei{ Geocoder (thi ddressstring);
Locale. getDe fault ( ) ); )
try { l

List<Address> addresses =
gc. ge!Fronlocation (latitude,

218 _ Pemrograman Smart Phorrr,Mtrrggrrrr,rk,rrr ',1 )h Arrrhrrrl rl,rtr ll,rr:ktttli Antlrottl llAlt 11 Al)lrk,r,,r l)r,nr,t,rlr,lr Al'l t,or,1,11, y,,,,
?19
Dari class Cekl,okas i dapat dijelaskan class ini digunakan Class overlay]-okasi akan difungsikan untuk membuat overlay
sebagai pengimplementasian API Coogle Maps sehingga pada ba.ru atau layer tambahan di atas layer tile image peta Mapview
Main Activity class Ceklokasi diharuskan menggunakan extend seh.ingga pada interface aplikasi seolah-olah gambir peta yang terlihat
dari MapActivity, juga harus mengimplementasikan method oleh user telah "ditandal" oleh aplikasi tersebut. Overlay ya"ng telah
isRouteDisplayed. Activity tersebut akan mengarahkan ke terbuat tersebut dapat dig.unakan sebagai bidang draiing d"engan
layout lD untuk penempatan tile image peta yang telah ditunjukkan menerapkan canvas (untuk menggambar garis, kurva, atlu kolak)
pada layout main XML di atas. Pada state OnCreate tersebut sebagai penanda untuk koordinat tertentu, ylng nilai posisi koordinat
diimplementasikan class MapControl-fer menggunakan method akan diperoleh dari Provider Wireless Network dan piovider CpS.
getcontroller O untuk meng-enable fungsi zooming dengan
memanggil method setZoom (2 0 ) dan pengaturan posisi tile
image. Base class Overlay digunakan untuk penambahan overlay
l:::_lEj.xll
yang ditampilkan pada layer teratas, yaitu dengan cara rnenciptakan te claie
instance dan ditambahkan pada List yang diperoleh menggunakan
method getOverlays O.
!'t6E€,tn ]n.! C61:.
i*
turu **rr ,aa*'e &
LOCATION SERVICE digunakan ,rlry,,,1
sebagai reguest instance
menggu nakan system service ge t S ys t emS e rv i ce melal u i i nterface
Context. LOCATION SERVICE. Karena suatu aplikasi tidak
l*dmr
r
,.r
-s,
ir';'q:,,, I
dapat diinstansiasikan seZara langsung c/ass LocationManager, Itlr<!3t lkLrrdrrl
class LocationManager menyediakan fungsi kontrol update ,*}{e . rglt .,.f'a*Ur. l. i i:.:i! l';'*r:rlr
lokasi.
l.rt'lidj-sd f .r itl: '

A,fFdS i st.bnc.tltd
Class CekLokasl diimplementasikan sebagai location service f"".&*o :

provider NETWORK_PROVIDER dan GPS_PROVfDER yang


keduanya aktif secara bersamaan untuk memperoleh nilai koordinat 'r". f
llmffiExl**lhb6ra
longitude-latitude dan dilakukan proses konversi menggunakan class ,.i'r pd*,.i&$l!ni*sr{,8*irS ',.,,,, . .:.r.,,.
Geocoder yang prosesnya telah dijelaskan dari contoh Geocoder. ,, f* criirlct*:*.tliEd*r '. r.

Hasil dari pengujian penulis menunjukkan nama lokasi yang diperoleh . r ' fir.Ltiir**an*ir{iir
q i1,t s!!1.dr$.r*d6{ftr'r.*ft nt*ir.6drs.iLrrdilqg}
antara kedua provider dapat berbeda karena tergantung dari ketepatan i-krrffi
. l

koordinat yang d iperoleh.


Pada Activity ini secara otomatis meng-update data lokasi dari
salah satu atau kedua provider dengan menianggil method
getLastKnownlocation, dengan jangkauan waktu
update diperoleh dari variabel yang dijaiankan method Gambar 8.16 Window New Java Class
requestlocationUpdates ( ) .

Selanjutnya, masukkan source code di bawah ini dalam class


Overlayl,okasi yang telah terbuat tersebut:
5. Sebagai tahap terakhir dalam project ini akan dibuat class public baru
Overlayl,okasi . j ava ditempatkan dalam
dengan nama package package com. cont.oh. Ceklokasi;
com. contoh . CekT,okasi-.
Untuk membuat class baru dapat dilakukan dengan cara klik kanan import android. graphics. Canvasi
pada project CekLokasi -+ pilih menu New + C/ass -+ kemudian
i mport androld. graphics. paint;
masukkan nama class yang akan dibuat pada textbox Narne di window
New lava C/ass (seperti yang ditunjukkan pada Camhar 8.16) dan i mport android. graphics. poi_nt;
diakhiri dengan meng-klik Finish. i rl;rort Artrlr,, i rl. rJr,rpl-ri cs.RectF,.

220 Pemrograman Smart l)honc Mr,ttggtttt,rk,rtr i'l lX Arrrltorrlrl,rtr ll,tckrttll Artrlrotd llAll fl Aphk;r.;r l)t'nrr.rlr,lr Al'l (,rxrglr,M,rp', 221
import android. location. location; @override
import com. google. android, maps . GeoPoint; public void draw(Canvas canvas, Mapview mapview,
impor! con. google . andr:oid. maps . Mapvie{, boolean shadow) {
import com, googfe . android, maps . overlay; Projection projection =
mapview. getProj ection ( ) ;
inport com. google , android. maps . Proj ection; if (shado, == false) {
// update lokasi nenggunakan network provider
pubtic class Ovellayl.okasi extends overlay { Dou}rle latitude = n€t locatlon.
// definisikan radius titik ctisplay koordinat getl.atitude () r'tE6;
private final int mRadius = 5; DoubLe J.ongitude = n€t tocation-
getaongitude O *1E5;
location net_Iocation; GeoPoint geoPointi
Location qps_location, qeoPoint = new
GeoPoint (latitucle. intvalue O , longitude.
public tocalion getNetlocation ) { ( intvalue0);
return net_locatio^i // konversikan nilai net location ke foflrat
pixel
public Location getcpslocation O { Point point = nev PoinEO,
return gps_Iocation; projection' toPixels (geoPoint, point);
)
public void setNetlocation (Location location) { RectE owal- = new RectF(point.x - mRadius,
this . net_location = location; point.y - mRadius,
) point.x + nRadj.us.
public void setcpsLocation (Location locatsion) { Point.y + hRadius);
this . g"s_location = focation;
1 / konliqurasi tipe paint
/
// Anda dapar menant,ahkan suatu fungsi yang akan Peint Paint = n6!r Peint(l;
aktif saat user nen-tap Paint. aetNlGB (250 t 255,7,55r;
// ritik tsb Paittt. aetlntir,Iiat (t!u€r;
Goverride p.int. 3€tFak€BotdT€xt (true) ,
public boolean onTap (GeoPoint point, Mapviev, Paint backPaint = ne{ Paint0;
napvie{) { backPain!. setARGB (175. 50, 50, s0),
relurn false; backpaint. setAntiAlias (true);
1 // Buat gamba. ma.ker

222 Pemroflrantan Snrarl l'lrorrl Mr,rrl:l:lrr,rh,rlr l,l )l\ ArrrLr,rrl rl,rrr Il,rr krrlli Artrirrtttl ItAll ti Agrlrk,r',r lr('rr,r,rlr,rr Al 'l (,r'r'1'h,M,pp', 223
canvas.drawOval (oval-, Paint) ,' )

sllper . draw (canvas, mapVj-ew, shadow) ;


1f (gps_location!:nulf) { )

Double gpslatitude : gps_location. )

getlatitude ( ) *1E5;
Doubl-e gpslongi-tude : gps_locati-on i
Pada class.ove r l ayLo ka s digunakan untuk fungsi overray, yang d i dalam
class tersebut terdapat method draw ( ) untuk drawlng overlay dariioordinat
getlongitude ( ) *1E6; yang diperoleh provider network dan cps. Class ini juga mendukung method
GeoPoint gpsGeoPoi-nt; callback OrrTap O untuk fungsi tapping pada suatj marke r.
gpsGeoPoint : new Pada class cek],okasi dan overJ-ayI,okasi- terdapat fungsi perkalian
GeoPolnt (qpslatitude . longitude dan latitude dari rocation yang bersatuan deraiatiengan nilai
lE6 atau'l x106:
intValue O, gpslongitude. lntValue O ) ;
Doub1e geolat = location.getlatitudeO * 186;
/ / konversj-kan nifai gps_location ke format Dorrble geoLng = location.getlongitudeO * 186;
pixel Perkal.ian tersebut diperlukan
.karena object ceopoint sebagai penyimpan
nilai koordinat latitude dan logitude menggunakan t^tu^i m,icro-degree
Point gpspoint : new Point ( ) ; (mikro-deraja0,
titik koordinat tersebut akan digunakan sebagai referirrsi
projection.toPixels (gpsGeoPoint, gpspoint),' MapView. Dengan demikian, titik koordinat yang terah di[eroieh clari
kedua provider (wireless network dan Gps) harus dikonversikan ke satuan
rnikro-derajat, dengan cara dikalikan nilai -Ix106.
RectF gpsoval : new RectF(gpspoint.x -
Pada cambar 8.17 ditunjukkan diagram sequence sebagai keseluruhan
rnRadius, gpspoint.y - mRadius,
l)roses apl ikasi CekLokasi.
gpspoint.x + mRadj-us,
gpspoint.y + mRadi-us) ;

Paint gPsPaint = new PaintO;


gpspaint.setARcB (25O, 0, 7 , 2451 ;
gpspaint. setAntiAlias (true) ;
gpspaint . setFakeBoLdText ( true ) ;

Paint gpsBackPaint = new PaintO;


gpsBackPaint.setARGB (175, 50, 50, 50)
gpsBackPaint. setAntiAlias ( true ) ;

canvas . drawOwal (gpsoval, gpspaint) ;

224 Pemrograman Snrarl Phono Mottggttttakntl lil )K Arrrltorrl rl,rrr ll,rr:krrr11 Arldrgrrl Apltk,t',t grlnlr,rl),rr nl 'l 1 ,,,, M.r1r,
225
'1,h,
OnCreate

Gunakan
NEI'IUK PRO\IIDER,

Gambar 8. latitude dan longitude dari provider Network dan GpS

getlongitude o qretlongitude o -oo0oo-


getlatitude o getlatitude o

Gambar 8.17 Diagram sequence aplikasi CekLokasi

Setelah proses di atas selesai, kemudian lakukan kompilasi CekLokasi dan


jalankan perangkat Android, yang akan tampak Layout Ul seperti di Gambar
B.'lB. Pada aplikasi tersebut akan tampak titik koordinat pada Ul yang secara
otomatis akan ter-update setiap periode 2 detik.

226 Pemrograman Smart Phone Mcttl.lgtlturk,ttl lil tK Atrrltorrl rl,rrr ll;rr:krrrg Androttl liAll tl AlrIk,r,,r l)(,nr,t,tlr.rrr Al'l (,,r,1,1, M,t1r
?27
[..ryanan RSS (Really Simple Syndication) merupakan suatu sindikasi
informasi /eed dari suatu web service sehingga publik dapat lebih mudah
nremperoleh informasi terbaru yang terangkai dalam bentuk ringkasan dan
t.rnpa membuka website tersebut. Saat ini layanan RS,S feed sudah menjadi
st.rndar umum yang telah diterapkan banyak website diantaranya layanan
lrerita, forum, weather report (laporan cuaca), kurs, BitTorrent, dan socia/
trctworking. RSS diciptakan oleh Ramanathan V. Cuha saat masih bekerja di
Netscape tahun 1999, versi rilis pertama tersebut bernama RDF (Resource
I)ascription Framework) Site Summary. Kemudian pada rilis versi lanjutannya
rrronggunakan nama RSS versi 0.90 dan kini telah mencapai versi 2.0.

I),rta RSS adalah data text berformat XML dan yang masih dalam keluarga
Nl,rrkup Lang,uage, diantaranya HTML atau WML. Format XML banyak
tlrlcrapkan di sejumlah tipe data, seperti file dokumen, database atau RSS
lr.r'rl rli mana rlirta tcrsebtrt merupakan hasil request dari server.areb service.
XML telah cukup lama diimplementasi ke berbagai software aplikasi untuk setelah registrasi, akan dilakukan verifikasi di mana kita diminta membuka
PC, tablet, hingga perangkat mobile J2ME. email untuk mengaktivasi akun. selanjutnya kita akan menerima email dari
server berupa informasi nomor API key contohnya yang telah penulis buat
RSS feed dari awal hingga saat ini umumnya digunakan sebagai data feeder yaitu 1cfad9a4d0094747111701, API key ini digunakan saat proses requesr
pada browser web berbiiis PC (yang bersifat multi-platform) atau sebagai tool ke web service (Gambar 9.2a).
gadget pada os windows Yista/7 dan Mac os-X. Kini, setelah masuknya era
i.,o5il"'trrrt phone memungkinkan layanan RSS Feed diimplementasikan Untuk mengakses laporan cuaca, user tidak diharuskan melakukan proses
ke dalam aplikasi mobile sehingga memberikan pengalaman baru bagi user registrasi seperti pada registrasi API Key Android Map. Disebabkan layanan
yang akan semakin mempercepat dan mempermudah dalam mengakses web service tersebut mengijinkan dalam satu akun melakukan multi-request
informasi dari web service. APl sehingga dari 1 API Key dapat diakses oleh multi-user pada aplikasi
APK yang sudah didistribusikan. Tetapi, penulis sarankan daram proses
Bab ini akan memfokuskan bagaimana cara membangun suatu aplikasi pengembangan aplikasi, gunakan APt Key sendiri melalui proses registrasi
sebagai R55 Feeder dimulai dari tahap mem-parsing data XML berbasis java agar server web service tidak terlalu terbebani.
hingga cara membuat aplikasi Android sebagai R55 Feederyang diintegrasikan
dengan fungsi location Service.
*cc{Urut Actlrirfl,an . WOrl* $lsa[rer Ontlns,,tq*
$tu 1{ lll*Sxr sihr !*xn qr,t&m&&atixr*L!..{snr
RSS Feed lnformasi Cuaca 'ls, *l$!qd ($ni
firah t !i** * rl I tE!6.! !fu I IrBr I &r!ree,
Pada sub-bab ini akan dibahas cara memperoleh data R55 Feeddari suatu web llcx
service. Yaitu akan digunakan salah satu (weather report). Layanan ini dapat
{pl l;rt r[ acr(t. &fi i'tr&l.! &ft(rfl :!
diperoleh gratis, tetapi karena bersifat propietary sehingga dari web penyedia I,y"l. tdSlld{ffigallM l f*t
jaia tersebut harus melalui proses perijinan dari web service dengan registrasi Erl*** r'fid {ft:l* l,.It urra* .r'' &,F{ t{rr rr&,t !* !*6*f lltd rrit&: tJ{fl{irl y*! *{l *r}t,i *t*1 r

melalui akun email untuk memperoleh nomor API key. Data laporan cuaca I* ai*:ili.i lp,' rdr*c$r radt{s'*!: #afr,t{t &t t ,k ii*q*.
trrf!.
yang tersimpan pada server tersebut akan selalu di-update se_cara periodik
dan-data informasi dapat mudah ditampilkan dalam berbagai format luaran. ,:&tnri:!w,::llilSr.**mt ,.*s*grftr*xarE4.l.r.qrr:-:ilrd5*ti*;*Sil:l::ri1
Untuk membuat akun bukalah link URL: http:llworldweatheronline.coml ! lh* ,&te! l$r dl{r n0a rynrt. FlGsrr {&y ,tr!:t F{:tr tp.t {C} tlltl F i bqs*rr
register.aspx melalui browser (Gambar 9.1). (a)

t&& ;t*,ils!*
l*rfr*fr&**
l;;."-
,xiil*

r?w a:,*r : arp:


riie

!;ajl:ri:1,.nrrlii r':1r
ts,e&..*L&,.yserkt
tri *r.ar r.tl, f,,1 | ,.! ,a.mlr nla

.-'i-....-
lrr, r t- 6{;
'rF

!EJe*i&. rnnlst

(b)
(a) (b)

Gambar 9.2 (a) Notifikasi enail pada akun yang telah teraktivasi, (b) Hatanan Apl request
Gambar 9.1 (a) hataman form registrasi (b) infornasi notifikasi email (Sumber: http.l
generator
wo rl d we ath ero n Iin e. c o m )

tl" ArlIr'trlrlrttll'rr lrrrli Attrlrtrttl ItAl3


() Alrhk;r,,r lllili I r,r'rl
230 Pemrogranlatl Sntarl l'ltorrl Mt'tt1i1'tttt'th rrt 231
"l
Untuk mengetahui struktur data XML dari API request web service key:1cfad9a4d0 09 4i 47 1 1 1 7 0 1.
yaitu
worldweatheronline.com, kita dapat menuju ke halaman API request
Pembahasan dalam buku ini hanya mencakup ekstraksi data Rss Feed
ge n e pada U R L : wo r I dwe ath e ro n I i n e. co m I fee d-ge n e rate r. aspx yan g saat
r ato r
berformat XML, yaitu dapat dilakukan dengan cara me-request langsung pada
proses request tersebut diperlukan memasukkan nomor APl Key user. Berikut
halama.n web pada browser Firefox dan akan terlihat data xML haiil request,
ini ditunjukkan format API request dari web service World Weather Online:
sedangkan untuk browser lainnya (Safari, Opera, atau Chrome) data XML
dapat dilihat dengan mengklik button View Source (Cambar 9.3).
http: //m. worLdweatheronlina com,/feed/weather. ashx?qaffi_lokasi&fornat=ml
- <drta>
Enum-of-days=1&kel-1cfadea4doo94747111?01 h# }}j - <raqueit>
request XML {r}}e}Cir}<.!.p€>
<qa eq'>Yogyalcara, &darusia<,,qr ery>
Jumlah request
Weather forecasl
API key <lrtqIect]
(hari) - <runsul_coaditio:>
.ibs{n,rtii}.*ti6€:r09J0 Ai{<.:ob$sr"t rtior litne>
{tenin-C}}:{ i€elp*C>
Pada web service tersebut didukung 2 ripe input request lokasi, yaitu: <remp-f>9O<,t*up,f>
<r retber(odo> I l6<'n *lrlrrCade>
1 . Nama kota atau daerah, diikuti nama negara (masukan nama negara - <ts.eatL€.rlisoIrl>
tidak diharuskan, kecuali daerah atau lokasi yang di-request juga htg.',rrrr"e' wcr<ldu.eatierordir:e rom inrages rurymbols0l*p*rg_6d,x1rnbr
rnem iliki nama yang sama di negara lain). Berikut d itampilkan pen u lisan < rrarilerlc*rl.lr{>
<x catLerDot<>Patch.l- mA rceby{r"eatf, rrDssr>
lengkap format request, untuk data hasil APl request ditunjukkan pada .:riud speedl\liles>5.:.'risd :pte{}f.il*:>
sub-bab Aplikasi Parser XML: <ritdtp*rd limpl>S<.nind:pe*dHapl>
<n'inddirllegro*> 305<.windrlirD eg:e*>
f ree. worl-dweatheronf ine. com/f eed,/weather. ash
hf-t,i-r: I / <rfu ddil I 6Poiut>\IV< \nirddi;l 6Foirt>
x?q:yogyakarta&format:xmf &num of days:1&key:1s1.69- <:prrr$1Ii\I;.0- 5 <precipl$l>
<ldulMit-i'>6lq'L um idil'>
4daD94i 4'7111701 <rirfu ili(r >9<, visibilitr'>
dprsrslro> I 006.1 prtri ssrG-\
<rl$sdaorer-! i k (lood(01,er>
)". Koordinat longitude dan latitude, koordinat ini dimasukkan pada <'cnrreo:-ccr*ititrr}
request ke server dengan panjang angka desimal tidak dibatasi. Berikut - <w{trh€r>
ditunjukkan format request tersebut. irlets>]0l 1.01. I l<, dete>
{t f Ep}l r.rC>31<,,reoplIar C>
http: i / free. worldweatheronllne com/ feed/weather. . <teupllrxF>90< teatpllaxF>
,..- *_1 l:*ri 1 ! r ,r -*- r a:_aa
a.shx?q:-7 .182911, 110. 361021eformat:xml&num of days:1ek
ey:1cf ad9a4d0 0 9 41 41 1 1 1 7 0 1 Gambar 9.3 Data RSS Woldweatheronline pada Firefox

API WorldWeatherOnline.com juga mendukung request informasi Pnoses Parsing Berkas XML
weather forecast (perkiraan cuaca) hingga 5 hari kedepan, dari kedua P"irsing adalah proses untuk merepresentasikan suatu berkas XML terstruktur
contoh di atas hanya menggunakan request weather forecast'l hari. (berbasis teks) menjadi data (berkas) string, kemudian data string tersebut
Yaitu pada bagian "&num of days:7" yang mendukung request rJigunakan untuk berbagaiaplikasi, dalam bab ini akan dibahas implementasi
hingga 5 hari kedepan dengan menggunakan request "&nurn_of_ khusus dalam aplikasi. Proses pembuatan aplikasi parser diawali dengan
days:5" dan untuk format data RSS lainnya ditentukan dari input rrrembuat aplikasi conso/e based berbasis java, menerapkan fungsi parsing
"f ormat:", diantaranya /sOrV, tab delimited, dan XML. XML untuk membaca data text R55 Feed dari web service.
Pada bagian terakhir API request harus disertakan Nomor API Key

232 Pemrograman Smart Phone Menglltrrr,rk,rtt l.il)K Arrrhorrl rl,rrr ll,rr kttrpi Attdrotd l3Alj 9 Aphk;r,r lllili I r,r'rl 233
Data RSS Feed dan Aplikasi Parser XML l7 <winddirl 6 Point>N< /wlnddlr 1 5point>
Untuk mem-parsing dokumen XML dapat digunakan berbagai metode 18 <precipMM> 6 . 3</precipMM>
diantaranya NanoXML, inyXML, kXML. Beberapa API Android telah tersedia 79 <humj-di ty>8 9< /humidi t y>
sejumlah parser, diantaranya SAX menggunakan class org.xml .sax 20 <vi s ibi 1 ity>1 1< /vl s ibil ity>
atau XmlPul-lParser atau parser DOM (Document Object Model),
menggunakan package j avax. parsers dan package org. w3c. dom. 2t <pre s sure>1021,< / pre s sure>
22 (cl-oudcover>10 0 <,/ c l- oudcover>
23 (/current_condition>
Pada sub-bab ini dibahas proses parsing document XML menggunakan parser
SAX yang juga akan diterapkan pada project RSSCuaca di bab 9, sedangkan 24 (weather)
untuk parser DOM akan dibahas pada project aplikasi RSS-USCS. Berikut 25 <date>20 1 0-1 1-30</date)
adalah contoh dokumen XML berupa data R55 Feed yang diperoleh dari
26 < tempMaxC> 8< / t empMaxC>
web service worldweatheronline.com (hasil request menggunakan browser
Firefox yang telah ditunjukkan sebelumnya, setelah registrasi dan diperoleh zt (tempMaxF> 4'7 < / tempMaxF)
API key) dengan nama file weather_data . xmf : 2B <tempMinC>3 <,/ t empMinC>

01 <?xm1 verslon:"\.0" encoding:"UTF-9"?> 29 <tempMinF>3 7< / tempMinF>


02 <data> 30 <wlndspeedMi les > 12 <,/windspeedMi l_e s >
03 (request) 31 <windspeedKmph> 1 9< /windspeedKmph>
04 <type>Zipcode<,/type> 32 <winddi rect ion>S< /wlnddi rect i on>
a?
05 <query>98101<,/query> <winddi- r1 6Poi-nt>S<,/winddi r1 6 po int>
06 </request) 34 <winddj-rDegree>1 8 1</winddirDegree>
07 (current*conditlon) 35 (weatherC ode>302< / weatherCode)
0B (observation time>O9:40 AM<,/observalion Jb (weatherlconUrf)( ! [CDATA thttp : / /www.
time> worl-dweatheronl ine . com,/images
09 <temp C>S<,/temp C> ,/ws ymbol s 0 1_png_6 4 /ws ymbol_0 0 1 8_c1 oudy_wi th heavy

10 <temp_F>4 1<,/ temp_F> rain.pngl I ><,/weatherlconUrl)


11 <weathe rC ode> 3 0 2 < / weathe rCode) 31 (weatherDesc>< I [CDATA[Moderate rain] ><,/
I
L2 (weatherlconUrl)(! [CDATAlhttp://www. weatherDesc)
worldweatheronline . com 38 <precipMM>3 3. 1</precipMM>
,/ image s / ws ymb o 1 s 0 1 _png _6 4 / ws ymb o 1_0 0 3 4_c 1ou dy_w i t h_ 39 (/weather>
heavy_raj-n nlght.pnSl I ></weatherfconUrl> 40 (weather)
13 (weatherDesc>< ! [CDATA [Moderate rain] I ></ 4l <dat.e>2 0 1 0-1 2 -1</date>
weatherDesc) 42 (tempMaxC> 1 2 <,/ tempMaxC)
74 <wlndspeedMi 1e s > 0 <,/windspeedMi Ie s> 4.) (tempMaxF>5 5< / tempMaxF>
1tr
AJ (wi ndspe e dKmph> 0 < /wi ndspe e dKmph > 44 <tempMinC>5 <,/ tempMinC>
76 <winddi rDegree> 0 <,/wi nddi rDo g ror,', 4tt < t,empMinF>3 9</tempMinF>

234 Pemrograman Srrt;rrl ['ltorrt Mlrtlllittrr,rk,rrr ',1 rlt AnrIlrrl rl,rrr ll,rr krnl: Artrlrortl IlAll () Aphkasr liSll I r,r,rl
235
45 <wi-ndspeedMi es>2 1< / windspeedMi 1e s >
l- 1l <,/weather>
41 <wi ndspeedKmph> 2 3 < / wi ndspe edKmph> '72 </daLa>
48 <winddi re ct i on>N< /winddi rection)
49 <winddi r 1 6Polnt>N< /wi-nddirl SPoint> Class ContohParsersAx. j ava
50 <w j-ndd j- rDegree>2 3 0 < /w j-nddi rDegree>
Selanjutnya dalam sub-bab ini ditunjukkan pembuatan aplikasi parser
51 (weatherC ode>229< / weathe rCode) XML berbasis console. Parser ini modifikasi dari tutorial yang dibuat
52<weatherlconUrf>< I ICDATAIhttp:. / /www - Nazmul, 1999 (http://developerlife.com/tutorials/?p:29). Menggunakan
class ContohParserSAX. java sebagai parser dan class ,elther.
worldweathe ron I ine . com/ image s /ws ymbo I s 0 1-png-6 4 / j ava untuk deklarasi variabel-variabel class parser SAX. Kedua
ws ymbo I_0 0 1 8_cf oudy-wi th-heavy-rain . pnS I I >< / mengimplementasikan librari standar JDK, yang tidak berkaitan dengan Apl
weatherlconUrl> Android, aplikasi Notepad atau Notepad+ + dan dikompilasi menggunakan
compiler java.yang tersedia dalam paket JDK melalui command-prompt
53 <weaLherDesc>< ! [CDATA [Moderate rain] I ></ (tanpa IDE Netbeans / Eclipse).
weatherDesc> Berikut adalah source code public c/ass ContohparsersAX sebagai
54 <precipMM>33.1</PreciPMM> parser SAX, menggunakan pemodelan event based:
55 </weather>
56 (weather)
<date>2 At0 - 72-2</date>
import j ava. io . IOException,.
51
< t empMaxC> 6 < / tempMaxC>
import j ava . util- . Arraylj-st;
5B
<tempMaxF>4 6<,/ temPMaxF>
import j ava. utif . Iterator,-
59
60 <tempMinC> 4< / tempMinC>
import ; ava . uti-l- . Llst;
6t <tempMinE> 3 3< / tempMinF>
<wi- ndspeedMi te s>12< / wi-ndspeedMj- 1e s >
import j avax. xml . parsers . ParserConfigurationException;
62
<windspe e dKmph>2 3 <,/ wi ndspeedKmph>
import j avax. xm1 . parsers. SAXParser,.
63
<winddi- rect ion>S< /wi nddi rect i-on)
import j avax. xml- . parsers . SAXParserFactory;
64
65 <windd-i r1 6Point>S< /winddirl 5Point>
<winddi rDegree>1 8 1<,/winddi rDegree>
import org. xm1 . sax. Attributes ;
65
(weatherCode>1 1 3</weatherCode) import org. xm1 . sax. SAXException;
61
58<weatherlconUrf)< ! [CDATA Iht.tpl. / /www.
import org. xm1 . sax. helpers . Def aul-tHandler,.
worldweatheronl ine . com/ image s /ws ymbol s 0 1-png-6 4 /
ws ymbo J-_0 0 1 8_c I oudy__wi th_heavy_rain . png I I >< /
publlc class ContohParsersAx extends DefaultHandl_er {
weatherfconUrl)
69 <weatherDesc>< ! [CDATA IModerate rain] I ></
weatherDesc)
List WeatherArray;
'10 <precipMM>33.1</PreciPMM>
/ / n,t inl.r in context

236 J)emroflrantan Smirtl l'ltottt' Mt'tt111'tttr,rh,rtt ',1 tl\ Atrrltntrl rl,rtr Il,rr krrrl' Attrlrrttrl llAIl 9 Ap|karr l{lili I r,r,rl 237
private Weather tempEmp,' [JeatherArray : new Arraylist O;
)
private Boolean inntag_query = false;
private Boolean inntas_current_condition = public void runExanple O {
fa]se, parseDocument O ;
private Boolean innlag_obser:vation_time = false, printDatao;
private Boolean inntag teinp_C = false; ]
private Boolean inntag_weathercode = false;
private Boolean inntagjrecipitation = false; private void parseDocument O {
priwate Boolean inntag_hunidily : false; // deklarasi factory baru
private Boofean inntag_visibility = false, SAxParserEactory spf = SAxparserEactory.
private Boolean inntagjressure - false; newlnstance0;
private Boolean inntag cloudcover : false; try {
// dektarasi insrance parser
private Boolean inntag_seather : false, SAxparser sp = spf. newsAxparser ( );
private Boofean inntag_date = false;
private Boolean inntag_tempninc = false; // parsins file target dan me-
private Boolean inntag_tenpnaxc : false; register class untuk call back
private Boolean inntag_$indspeedkmph = false; sp.parse ("forecast.xint,,, this);
priwate Boolean innlag windclireclion - false;
private Boolean inntag_weathercode = false; ] catch (SAxException se) {
printstackrrace O;
se.
private String query value; ) catch (parserconliqurationExceprion pce)
private String observ_time; I

private Suing tenp_c; printstackTrace O ;


pce.
private Strinq weathercode; ) catch (IoException ie) {
private string precipMM; ie. printstackTrace ();
private String humidity; )
private String visibility, i
private string pressure;
pr:ivate Strinq cloudcover; /**
x fterate-kan darj- l-ist and print out content
pub1lc ContohParserSAX O {
*/

238 Pentrogratttirtt Stttirrl l'lrrlrl Mt'tt;11lrttt,tk,ttt ',1 )lt Atrrltrrtrl rl,rrr I l,rr krtr11 Atttlttlttl ItAll() Aphk,r,,r liiiti I r,r,rl 23g
sb.append("Visibility :" + thj-s.
Private void PrintData O {
visibility);
sb. append (", ") ;
System'out'println ("Location Name'/ZIP Code
sb.append("Pressure :" * this.pressure),'
: " * guery0); sb.append(", ");
System'out'println (currentCondiLion O ) ;
sb.append("Cloud Cover ;" * this.
System'out'println("No of Eorecast : "
*
cloudcover) ,'
WeatherArray.sizeO ); sb.append(". ");
Iterator it : WeatherArray'iterator() ;
return sb. toString ( ) ;
while (i-t.hasNextO) {
System.out.printl-n (it'next O ' )

,/* Method ini dipanggil saat opening tag Event


tosLring o );
)
* (tag)
) * juga dapat membaca value attribute, dengan
public String guerY O {
format :
strinq query : thi-s'querY-value; * (tag attribute:"attri-buteVafue")
return querY'toStrlngO ; */ I

)
public void startElement (String uri, String
pubJ-ic String currentCondition O t
focafName, String qName,
StringBuffer sb = new StringBuffer O ;
Attributes attributes) throws
sb'append("Current condit-ion : ") ;
SAXException
sb.aPPend("Ti-me:") ; / /
{

sb'aPPend(" :) ");
if (qName.equalslgnoreCase ("guery") )
sb'append("Observe Time :" I t'his"observ-
{

thj-s.inntag_query : truei
time); )
sb.aPPend(", ");
if (qName. equalslgnoreCase ("current-
sb'aPPend("Weather Code :" f this"
r:ondition" ) ) {
weatherCode); t.his.inntag current condition :
sb.aPPend("' ");
lrue;
sb.append("Precipitati-on :" + this'
)
preciPMM);
if (qName. equalslgnoreCase ("observation_
sb.aPPend(", ");
t ime") )
sb'append("Humidity i" + this'humidity );
{

t-his. inntag_observatj-on_time = true,'


sb'append("' ");

ItAllrl Alrhkrr',r llliii I lltl 241


240 PemroBramattsnlitrl[,lltlttoMr.ttlil'1tttl.rh.rtr..IthArrrltrrtrIrl.rrrll.xkrrttiAtttlrtlt<l
)
)

if (qName.equalslgnoreCase ("temp-C") ) {
if (qName.equalslgnoreCase ("date") ) {

this. inntag-temp-C : true; thls.i-nntag date : true;

)
)

if (qName. equalslgnoreCase ("weatherCode") if (qName.equalsfgnoreCase ("tempMaxC") )

this. inntag tempmaxc : true,'


this.inntag weatherCode : true;
)
if (qName. equalslgnoreCase ("tempMinC") )
)
if )
(qName.equalslgnoreCase ("precipMM") i this. lnntag_tempminc _
-
+ f,,^
L!UY,
-

:
this.inntag PreciPltation true;
)
if (qName. equalslgnoreCase ("windspeedKm
i
ph") )
if (qName. equalslgnoreCase ("humidity") ) {
{

this.lnntag humidj-tY : true; thls. inntag_wi-ndspeedkmph : true,-


)
)

1f (qName. equalslgnoreCase ("visibj-tity") )


if (qName. equalslgnoreCase ("winddirecti
on") ) {

thi-s. inntag-vislbilitY : true; this.inntag wlnddirection : true,'


)
i
j-f (qName equalslgnoreCase ("pressure")
. )
if (qName. equalslgnoreCase ("weatherCode")
this. inntag Pressure --
I rri^.
ur ue,

this. i-nntag_weathercode = true;


)

if (qName. equalsTgnoreCase ("cfoudcover") )

/* Method ini akan dipanggi-l saat membaca value yang


this.inntag-cloudcover : true;
ada dj-dal-am tag :
)
* (tag) karakter </tag>
if (qName.equalslgnoreCase ("weather") ) {
*/
this.inntag-weather : true;
publ- j-c void characters (char [ ] ch, int start, int
/ / buaL instance Weather baru
ength)
temPEmP : new Weather O
I
,'

WeatherArraY. add (t-emPtrmP) ;


throws SAXExcepti-on {

ItAl3 () 41rhk,r,t lllili I lrtl 243


',1 )h Atr,lt,,r,l rl,lrr I l,rr krtt11 Atttltrtitl
242 Pcptroflrantalt Srlarl I'lrrr1r, Mr,rrt:l,tttt,tl,,rtr
if ( this . inntag_query) { start, lenqth);
this . query_value = nefl StrinS(ch, 1

start, length); if (this. inntag_cloudcover) {


l rhis. cfoudcover = nelr
if this . inntag_current_condition ) {
( strinq(ch, start, length);
i
if (this. inntag_observation_time) { }
this.obselw time : neld if {lhis.inntag weather) {
String(ch, start, length); if (this.inntaq_date) t
) renpEnp. setDale (new String(ch,
if thi s . inntag_temp C) {
( start, Iength));
l
this.lenp_C = new String(ch, if ( this . inntag_tenpmaxc ) {
start, lenqth); tempEmp. setTempMaxc (Inteqer.
) parselnt(new String(ch, start, Iength)));
if (this. inntag_weathercode ) { }
thi s . reathercode = new if ( this . inntag_tempninc ) {
String (ch,start, length); tenpEmp. setTempMinc (Integer.
] parsernt(new String(ch, start, Iengrh)))i
if (this. inntagjrecipitation) { }
this.precipuM : new String(ch, if ( this . inntag_windspeedknph ) I
start, length); tenpEmp.
) serwindspeedKmph ( rnteger. parselnr (new string (ch,
if (this. inntag_humidity) { start, length))),
this.hunidity : new String(ch, )
start, length); if (this.inntag winddirection) i
1 tempEnp. setwinddirection (nei{
if (this. inntag_visibility) { :iLring (ch, start, lengrh) ) ;
this. visibility : new )
string(ch, slart, length), if ( this . inntag_lreathercode ) t
) tempEmp.
if this . inntag_.pressure ) {
( i:cLlieathercode (Integer.parsernt (nei, Srrinq(ch, start,
this.pressure - n.u i;t ri nq (ch, I .nqth) ));

()
244 - Pemroliranr,rrr finr;irl l'lrottl Mltrllylurt,rk,rrr l,l tl', /\rllrrtrlrl,tn ll,rr ktrtl,Attrlrotrl l3All Aphkl,;r l(liti I r,r,rl 245
I if (qNane. equatsrsnorecase (..precipMM,,) ) {
) this.innLag precipitation = false;
)
/* ini dipanggif saat closing tag,
Method )
misalnya : if ( qNane. equals Ignorecase ("humidity,,) ) {
* </tag> this.inntaq humidity = false;
*/ I
public void endElement (string uri, Strinq if (qName. equal s Ignorecase ("visibility',) )
localNane, Str:ing qName) {

throlrs sAxException { thls.inntag visibility = false.


I
if (qName.equalsfgnoreCase ("query") ) { if (qName.equalslgnoreCase ("pressure,,) ) {
thj-s. inntag_query : fal-se; this.lnntag pressure : false,-
) )
if (qName. equalslgnorecase ("current if (qName.equalslgnoreCase ("cloudcover,,) )

condition") ) {

this. inntag current condition = this.innt.ag cl_oudcover : fa1se,.


fa1 se; l
) 1f (qName.equalslgnorecase (..weather,,) ) {
if (qName. equalslgnoreCase ("observation t,his.inntag weather : false;
time") ) { )

this. inntag observation time : if (qName. equalslgnoreCase (..date,,) ) {


faf se; this.inntag date : false;
)

1f (qName.equalslgnoreCase ("temp_C") ) { )

this.inntag temp C : false; if (qName.equalslgnoreCase (..tempMaxC,,) ) {

this.inntag_tempmaxc = false;
)

if (qName.equalslgnoreCase ("weatherCode") ) )
if (qName. equalslgnorecase (..tempMinC,,) ) i
this.inntag_weatherCode : fafse; thi-s-inntag_tempminc = false;

) l

246 PemroJlraman Snrarl ['ltolrr,Mlrrlllgtttr,rk,rtr i'l tlr Atrrltrrrrlrl,rrr ll,rr l.,rrr11 Arrrlrrrtrl ItAIt() ApLk,r:,r lili1, I r,r,rl 247
if (qName. equalslgnoreCase ("windspeedKm , haracters(char[] ch, int start, int lengt_h)
ph") ) {

i-his.inntag wlndspeedkmph : fal-se,' Agar Class ContohParserSAX dapat mengekstraksi data vieather
]
,lata.xm1, diperlukan penyesuaian sejumlah listening, event call bac?
y.ritu pada startElement, endEl-ement_, dan event chraracters
if (qName. equalslgnoreCase ("winddirecti ti.rri nilai tag yang terdapat pada data weather_data.
on") ) { Schingga, saat parser Conr,ohParserSAX menemukan string opening tag
this. i-nntag_winddirecti-on : false; weatherCode), event startEfement akan memberikan keluaran
)
lroolean inntag_weathercode bernilai True, sedangkan pada event
,'ndElement memberikan keluaran Fal-se. Event characters
if (qName.equalslgnoreCase ("weatherCode") ) rrrer.upakan handler yang akan membaca seluruh karakter string yang ada
{ tii dalam tag saat boolean i-nntag_weathercode dengan niiai ielaiu
'l'rue.
thj.s . inntag_weathercode : false,'
)
sctiap event tersebut berjalan terpisah tergantung dari event charact.ers
s.rat tagqName tertentu dan data string di dalam tag tidak membedakan tipe
) k.rrakter yang dapat berupa angka, simbol, atau huruf.
public staLic void main(String[] args) {

ContohParsersAx spe : new Class weather. java


ContohParserSAX O ;
I trngsi interface dari variabel-variabel string digunakan
class parser sAX
spe. runExample O ; (lontohParserSAX akan dibuat public c/ass weather. java sebagai
) ponggabung data string. menggunakan method append, selanjutriya
rliberikan pengembalian data string ke class contohparsersAX untuk
)
ltrint-out menggunakan method system.out.println. Berikut isi
\o(/rce code dari class weather. j ava:
Dari class ContohParserSAx. java dapat dijelaskan, parsing data
tergantung pada event saat menemukan tag yang akan memanggil salah satu ^ pubJ-ic c.l-ass dengan keJ-uaran sLrj_ng dari
,/ masukan
method tag handler, diantaranya ialah: lr,rndler SAX */
.Opening tag, contohnya event tag <request> (baris ke-3 dari l,ublic class Weather {
weather_data. xm1) yang akan menjalankan method: private Strlng date,.
startElement (String uri, Strlng localName, Strlng pri-vate int tempMaxC;
qName, Attributes attributes) private 1nt. tempMinC,.
private int windspeedKmph;
. Saat closingtag, contohnya </request> atau </data> maka class private String winddirection;
ini akan menjalankan method: private int weathercode;
endElement (String uri, String localName, String qName)

public Weather O {
. Karakter string di dalam opening tag dan closing tag, contohnya pada
<date>2010-11-30</date> yang akan menjalankan method:
)

248 Pentrograman Smarl ['hottt' Mltr;i;1tttr,rk,rtr 1il th Atrrlrottl rl,rtt ll;rr ktttli Attrirotrl llAll() Aphk;r.;t lllili I r,r,rl 249
this.tempMlnc : tempMinC;
publlc Weather (String date, 1nt tempMaxC, int )

tempMinC, int wj-ndspeedKmph, Stri-ng winddirecLion, int


weathercode) { public int getWindspeedKmph O {
this.date : date; return windspeedKmph;
thj-s.tempMaxc : tempMaxC; )
this. t.empMlnC : tempMinC;
this . windspeedKmph : windspeedKmph,' public void setWindspeedKmph (int windspeedKmph)
thi-s . winddirection : winddi-rection;
this.weathercode : weathercode; this.windspeedKmph : windspeedKmph;
] )

public Strlng getDate O { public String gettlinddirectionO {


return date,' return winddirection;
i )

public woid aetD6te (String date) { public void setnl.lraLlilectioa (String


this.date = date; winddirection) {
) this - uinddirection = v.inddirection,
l
public int getTeq>MaxC O t public int getWeatherCode O {
return tempMaxC; return weathercodei
) )

public void setTempMaxC (int tempMaxC) { public void setlteatherCode(int weathercode) {

t.his. tempMaxC : t.empMaxC; this.weathercode = weathercode;


) )

public int g€tlq)iniac ( ) I / * string output */


relurn tenpMinc, public String toAttilg ( ) I
) StringBuffer sb = new StringBuffero,

public woid setlqruinc (int tenpMinc) { sb. append ('Forecast Details \);

250 _ Pemrogranrarr Srrrarl ['lrorrc Mr,rrliplrttr,rk,rtr


"l
th Airrltortl rl,ur ll,rlkrrtli Attrlrotrl llAlt() Agrhk,r:;t llSl'i I r.r'rl 251
sb.append("DaLe: " + getDateO); Current condition : Time: :> Observe Tlme :,09:40 AM,
sb. aPPend (" :) ") ; Weather Code :302, Precipitation :6.3, Humidity :89,
sb.append("Temp Max (C) :" + Vrsibillty :11
getTempMaxC O ) ; , Pressure :702L, Cloud Cover :100.
sb.append(", "); tl-o of Forecast : 3
sb.append("Temp Min (C):" + Forecast Detaifs Date: 201-0-11-30 :) Iemp Max
getTempMinC O ) ; (C):8, Temp Min (C):3, Wind Speed (Km/h):19, Wind.
sb.append(", "); direciion:S, Weather code:302.
sb.append("Wind Speed (Km/h) :" + t-orecast Det.aiis Date: 2070-12-L :> Temp Max
getWi"ndspeedKmph ) ) ; ( (C) :\2, Temp Min (C) :5, Wind Speed (Km/hl:23, Wind
sb.append(", "); direction: N, Weat.her code:229 .
sb.append('Wind directj-on:" + Forecast Details Date: 2010-12-2 :> Temp Max
getwinddirectj-on ( ) ) ; (C):6, Temp Min (C):4, Wind Speed (Km/h):23, WinC
sb.append(", "); direction: S, hTeat.her code: 113 .
sb.append("Weather code:" +
getWeatherCode O ) ; Dari luaran contohParsersAX terlihat proses parsing data weather:
sb.append("."); data - xml. Proses penerapan RSS Feeder untuk data XML lainnya,
ditunjukkan tahap proses pembuatan class parser sebagai berikut:
return sb. toStrinq ( );
a. Simpan data R55 Feed hasil respons dari web service dengan format
)
data XML ke dalam file menggunakan browser Firefox (umumnya file
) akan berekstensi *.xml);
b. Buat class parser SAX untuk aplikasi console atau command prompt
Saat melakukan kompilasi, kedua file di atas (ContohParserSAX. j ava based dengan penyesuaian event handler mengacu dari strukiur daia
dan weather . j ava) harus diletakkan dalam direktori yang sama, berikut XML yang tersimpan;
perintah kompi lasinya: c- Buat librari interface untuk membaca sejumlah data string hasi!
dari proses parsing, selanjutnya Activity akan memprosesnyiuntuk
C:\kompilasi\>javac -cl-asspath ContohParsersAx. java ditampilkan pada layout LJt;
d. lalankan aplikasi di command prompt apakah proses parsing sesuai
Dari kompilasidi atas akan diperoleh keluaran class SAXParserExample .
yang diinginkan, jika belum cek proses parsing dari masing-635;ng
class dan weather.cfass. Selanjutnya untuk menjalankan proses event handler;
parsing, file data weather_data. xml harus berada pada direktori yang
sama yang dijalankan pada command prompt dengan perintah:
e. Jika. parsing. selesai, agar dapat diimplementasikan ke project
Android modifikasikan c/ass parser SAX. Dari luaran method'out..
C:\kompilasi\>java -cfasspath ContohParserSAX println menjadi method Log. v untuk ditampilkan pada Logcat
DDMS disertai penyesuaian librari yang berhubungan derigan
Kem udian akan diperoleh keluaran hasildariparserSAX ContohPar se r SAX apl ikasi Android tersebut.
pada comma nd prompt seperti berikut:

Locati-on Name/zIP Code : 98101

['ernr0grantan Strtarl ['ltrtttl Mt'ttp11ltttt,tk,rtr',1)h Atrrltotrl rl,rtr ll,rr krtrli Atrrirotd llAll (i Aphk;r.;r lilili I lrrrl 253
Aplikasi RSSCuaca
Pro.ject aplikasi adalah weather reporter aplikasi sebagai R55 Feeder. Kini <?xml- version:"1.0" encoding:,,utf-8,,?)
sudah sangat banyak tersedia aplikasi sejenis dalam bentuk widget weather <manifest xmlns : android:"http : //schemas . anciroid. com,/
reporter dari web service, beberapa yang terpopuler yaitu Weather.com atau
apk/ re s,/ android"
AccuWeather.com.
package:"com. contoh . rss . cuaca,,
Project aplikasi RSSCuaca ini
merupakan modifikasi dari source code
buku "Unlocking Android-A Developer's Cuide" oleh Abelson W.F., android: versi_onCode=" 1 "
mem anfaatkan web serv i ce dari www.w o r I dwe ath e ro n I i n e.co m ya n g ri n c an i
android : versionName="1 . 0">
data tersebut telah ditunjukkan pada penerapan ContohParserSAX
RSS
<appJ- i cation andro j- d : l- abel:" G s tring/ app_
(file weather data.xml). Aplikasi ini juga mengakses lntent dengan
cara yang berbetla, melalui Broadcast Receiver dan Service. name" android: theme:"Gandroid: sty1e/Theme. Light,,
Sejurnlah Activity yang diimplementasikan pada aplikasi ini menggunakan android : icon:" G drawabfe / icon3,, )
fungsi -i- ntent dan I nten t F i I t e r yang merryediakan sistem konrunikasi <activity android: l-abel_:,,Gstring/app name,,
antar-Activity. Hal inidimungkinkan karena sistem Android memilikiarsitektur androi-d : name:" Di spIayDataRS S ->
rnenyeru pa i 5OA (Servic e-O r i e nte d-A rch i tectu re) seh i n gga satu Ac i i v i t y
dapat mernanggil suatu Intent
melalui obiect UR/ untuk mernberikan <intent-filter>
perintah ke Activi'ty iain" Aplikasi ini iuga menerapkan database SQLite <action android: name:,,android.
yang telah ter-inc/ude dalam sistem Android dan ntenggunakan fungsi cluerv
sebagai penyimpan data lokasi dan koordinat.
intent.action .VIEW" />
<category
[Jntuk lebih jelasnya, berikut rincian proses pembuatan aplikasi RSSCuaca:
andro j-d: name="android. intent . category. DEFAULT,, ,/>
1. Buatlah project Android dengan rincian sebagai berikut:
<data android : scheme:,,cuaca,,
. Nama project RSSCuaca
. android : host:"com. contoh . rss,, / )
Application Name RSS Cuaca
. <,/ int.ent-filter>
Package name com.contoh.rss.cuaca
< intent -fil ter:>
Create Activity DisplayDataRSS
Minimum SDK 3 <act.ion android : name:,,android.
Build Target AVD : MinimalAndroid 1.5 (disarankan intent. acti-on .VIEW" l>
bukan emulator) <data a ndroid : scheme:,,cuaca,,
androld : host:"com. contoh. rss,, / ),
Untuk menjalankan aplikasi ini disarankan menggunakan perangkat < / intent -fil- te r>
fisik karena diterapkan fungsi Broadcast Receiver untuk
menentukan lokasi user (class Locatj-onManager) dan juga <intent-fil- te r>
diterapkan provider NETWORK-PROVIDER untuk memperoleh (action android : name:,,android. int.ent..
koordinat lokasi melalui CPS atau n-CpS. Jika dijalankan pada ,rction. MAIN" />
emulator, aplikasi tetap dapat berjalan, tetapi fungsi provider
NETWORK_PROVI DER tidak dapat diakses. <category android : name:,,android.
r ntent. category. LAUNCHER,, />
2. Proses selanjutnya modifikasikan File AndroidManifest. xml <,/ i ntent -filter>
meniadi seperti berikut:
' /activ,i Ly>

254 PemrOgraman Silutrl l,lr0rrtl Mt'rrt:t":rril,rl .rrr ',lth Arrrltorrlrl,rrrll,tt ktttli Atltlrrtttl ItAll() AgrIkrr:,r lllili I r,r,rl 255
<act ivity androld : labe 1:" G s tri-ng,/ app_name_v j-ew* pada receiver memungkinkan aplikasi "melihat" data broadcast yang
rs s_saved_l ocat i ons " android : name:" Di splayRS STe rs imp di transmit dari Activity lainnya meskipun pada kondisi aplikasi tidak
aktif (yaitu Activity MAIN_LAUNCHER).
an"></ acLivity>
<act ivi- ty andro id : I abe 1:" G st r ingl app_name_specific_
Pada manifest aplikasi RSSCuaca, receiver seryice
RSSA]-ertServiceReceiver (Gambar 9.4) akan aktif di latar
l- ocation " android : name: " Di spf ayMenu I nputloka s i" ), { / belakang setelah booting sistem operasi selesai dan juga dijalankan
activi-ty> atert service.
<receiver androi-d: name:" . ser/ice. fr E,rervice.R5sAlertserviceReceiver Fecdvs)
RSSWorLdl{eatherAlert" > , s trllnkrtFdb
<intent-filter> @ u"*"e.nhnt.adion.B00T_CCIt4ptElED {Act En}

<action andro id: name:"android. intent .


P . ser*ce.nSSWoddWea*rerAlert (Service)

action . BOOT_COMPLETED" / > Gambar 9.4 Konfigurasi service pada Manifest Aplikasi RSSCuaca
< / intent -fiI ter>

(7'receiver><service androi-d: name:" . service.


Activity DisplayDataRSS sebagai Activity MAIN
RSSWorldWeatherALert " /> LAUNCHER dengan fungsi intent agar bisa diakses
< /app1 ication> service RSSWorldWeatherAlert dan ListActivity
(uses-sdk android:minSdkVersion:" 3" /) DisplayRSSTersimpan melalui LJR|, dengan
mengimplementasikan intent filter untuk mendefinisikan nama
<u ses-pe rmj- s s ion androici : name="android . permi s s i- on . scheme "cuaca" dan authority "com. contoh. rss" tanpa path.
ACCES S_COARST! LOCATION" > <,/ u s e s -pe rmi- s s 1 o n > Pada Cambar 9.5 ditunjukkan ilusrrasi hubungan IntentFif ter
<uses-permission android: name:"android.permission. yang mendefinisikan nama URI dan implementasi method intent
dalam class service RSSWorldWeatherAlert (pada package
INE_LOCAT I " ) ( / u s q s -p e rm
i s s j- o n >
ACCE S S_E. ON
com. cont.oh. rss.cuaca.service). Format euery URI
<uses-permi s sion android : name:"android - permi ssion - be rupa n a m a I okas i atau koo r d i nat I on gitude-l atitu de yan g iel anj utnya
RECEM_BOOT_COMPLETED " >< / u s e s -pe rmi s s i on> diproses oleh class Handler sebagai parser SAXyang ditunjukkan pada
ContohParserSAX-
<uses -permi s s ion androld : name:" andro j-d. permi- s s ion .

INTERNET" >< /use s -permi s s ion>


<,/manif est> Sn*ir fillri
€c:roi $d::r&.Dc , . -cirj lDtcot &tkgf!f' />
<.e{g6r!, &Li lt:& -,J!6td toMtartwlyjE fEft| ,}
{dain !*oa*&BF.@a{d. aD{lloid hoES'oa. ffi torr a!a, a
4irt.a${ilb6
Dari file manifest RSSCuaca ditunjukkan sejumlah intent filter Activity
yaitu DispJ-ayDataRSS, DisplayRSSTersimpan, dan
DisplayMenulnputlokasi. juga mengimplementasi service rtfftr@EudilliEX .:ocrtt4 StrrEg loil .l

RSSWorldWeatherAIert yang masing-masing class activity dan !r1 = UA"F.t3cr'&a*


iEht,-
/ lctu. emtotl rrrrofr
rw l6hltnrrnr.tgflora !tir, !.ni
G" 4 th1 !. loE.t: (,rS*Fl

service tersebut tersimpan dalam package yang terpisah.


Atribut service RSSWorldWeatherAlert berfungsi sebagai a/ert
responst merupakan sebagian kecil dari aplikasi yang berjalan di level
background dan memungkinan service tidak terlihat pada running
Gambar 9.5 Kesamaan uRl antara rntentEi iter dan implenentasi dalam rntent
task service (telah dijelaskan pada sub-bab lnlt'nl Scrvir:e). Sedangkan

Perrtrogratttatt Sttt;trl l'ltpttl Mt'ttrlf:tlrr,rk,ltr',1)K Arrrlrorrl rl,rrr ll,rt:krrtpl Attdroitl llAlt () Aphk;r,r liSli Inlrl 257
256
Pada manifest tampak permission ACCESS FINE LOCATION dituf i-s !<,/string>
digunakan sebagai navigasi GPS atau A-CPS, sedangkan permisson < s trlng name:"mes s age_inval- id_locat i on " ) 1 nput
ACCESS coARSE LocATroN untuk mengakses geolokasi
menggunakan network provider (jaringan CSM atau Wi-Fi). Permisson salah, nama l-okasi terlal-u singkat</string>
RECEIVE BOOT_COMPLETED diperlukan agar aplikasi RSSCuaca <strlng name:"mes sage_report_
menerima Tlag boot complete sebagai event /isten ing yang adapat unavailabl-e")Layanan laporan cuaca tidak tersedia,
mengaktifkan lntent Service RSSWorldWeatherAlert sehingga
service dapat membaca informasi dari broadcast sistem setelah booting masukkan lokasi lainnya.</stri-ng>
Android selesai. Maka lntent Service RSSViorldWeatherAl-ert <string name:"alert_labe1 ")peringatan ! <,/ string>
selalu aktif setiap Android dihidupkan. Untuk lebih jelas penerapan
fungsi ini dapat dilihat pada bagian 'Penerapan Event Listening pada
<string name:'/menu goto saved")Buka Loka_si</
Service". s t ring>
Activity DisplayRSSTersimpan berfungsi untuk display Ul <string name:"menu view report,,)Cek cuaca<l
data lokasi atau koordinat yang telah ter-request dari web service dan string)
disimpan dalam database RSSDatabases menggunakan layout (stri-ng name:"menu specify location,,) Tentukan
XML view lokasi tersimpan. Rincian proses pembuatan dan
manipulasi ?atabase flssoatabases dapat dilihat pada bagian Lokas i<,/ string>
class RSSDatabases . j ava. <stri-ng name:"menu device location,,)Lokasi
DisplayMenulnputLokasi (menggunakan
Activity ketiga yaitu Saya<,/ string>
class DisplayMenulnputlokasi. java) sebagai penyedia Ul <string name:"menu remove location,,)Hapus
dari referensi input nama tempat atau koordinat longitude'latitude
menggunakan method location. getText ( ) . toString ( ) Lo kas i<,/ string>
yang selanjutnya menjalankan Activity DisplayDataRSS melalui <string name:"menu save focation,,>Simpan
URI.
Lokasi<,/string>
3. Selanjutnya modifikasikan file string resource strings . xml untuk <!-- display lnput lokasi -->
fungsi /ocalization yang tersimpan pada direktori ,/res,/values < s tring name:" spec i f y_locati on_intro,,>Defini s i
dari project menjadi seperti berikut: laporan lokasi :</string>
<?xml- version="1,.0' encoding:"utf-8"?) <string name:"specify_1ocation labef,,)Masukkan
<resources> Kota atau Daerah</string>
<!-- string untuk alerL,warning dan menu --) <string name:"format")Format :<,/string>
<string name:"app_name">RSS Cuaca</string> <string name="city_country.>- koLa/
t ri ng name: " app_name_spe c ific_l- ocat i on " )RS S
<s tlaerah, negara<,/ strlng>
Cuaca - Masukkan Lokasi</string> <strj-ng name:"fat_lng,,>- latitude, longitude<1
<string name:"apP name weather detail-">Detail</ r; Lring)

string> <string name="zip'>- Zlp code</string>


< string name:"app_name_view_rs s_saved_ <sLrj-ng name:"specify_location button
l-ocations")List Lokasi</string> I .rbe1 ")Tampilkan Cuaca</strlng>
<string name:"message no_location">Lokasi befum < !-- cti.splay rlncian data RSS -->

258 Penrrograrnan Stnarl l'hont'Mltr11;itttt,rk,rrr',1)K Arrrlrorrl rl,ttr ll,rt:kttr11 Attrlrotd llAll () Aphkrr.,r lllili I n'rl 259
<string name:"view location 1abef">Lokasi z</ ilec nrndroid )&&. Frt*
str j-ng> {r*tr* I n*r* An*'sd:rA!l i.lt,
<str j-ng name:"vi ew_date_l abe 1 " >Tanggal : <,/ s t ring>
<string name:"view condiLion label">Kondisi Prqj$qt B5;trryr

Cuaca: </string> f* I!fl.r.w'lt


<stri-ng name:"view forecast fabei">Perkiraan Wh^{. rypt i:I it 6u}{t *.dd ysq Sta.k .:rl{i:
Cuaca: </string> t!yEr.( f:..ilf-:
< s tring name:"view_checkbox_cur rent " >Enable . $ldeaxr ::. lcrr.rlubk

alert. cuaca dari koordinat GPS perangkat?<./strj-ng> ffi& ryP" Y:ryT::y,lYrt * "s-cld
ru* ri&cr

< s tr i ng name: "view_che c kbox_spe c ifi.c " )En ab 1 e i *i,lllbtatllslrtr{

alert untuk lokasi ini ?</string> i#{otxtn c*ac -"-:l


EOf*atorlt (cor
< s tring name:" t ime_interva.l-_labe 1 " >Waktu l$rore*rgo
I
a^
Interval (s) </string>
<string name="view workinq")Proses reguest...</ Fq$tr
": Llfitrtied Text Filu irq,Ltv!&x*

string> ,.r Ardrn'd X&*L $ik Itltrl th* roat ltsnr{'lEr i*x t}& f**;
<string name:"server addr")Woridweatheronline. &"irtif T*,*t {a*{ 'rj,:'Jlt{!

com</string> (a) b)
<l-- display data tersimpan -->
Gambar 9.6 (a) Menu fileAndroid xML (b) window preferensifite XMLAndroid
<string name:"view_saved_locations_
i-ntro")Tampllkan lokasi tersimpan:</stri-ng>
Berikut ditunjukkan isi data styles . xml:
<,/resouries> ':?xm1 version:"1-. 0" encoding:-rg6-A,,?>
<resources>
4. Berikutnya buat /rile XML baru untuk digunakan sebagai resource font
< style name:',intro_blurb,,>
style dengan nama styles . xm1. Untuk membuat file XML tersebut
dengan cara: klik kanan proiect -) New -+ Android XML File -+ <item name:,,andro j-d : texts i ze,,>2 2 sp<,/ 1 tem>
masukkan nama file styles. xml pada textbox File (Gambar 9.6a), i t em name:,,android
< : textColor,,)#ee 7 62 O < /
dengan memilih tipe resource Values (Cambar 9.6b), file XML tersebut
tersimpan di direktori / res,/va1ues.
i tem)
<i tem name:,,androld : textstyle,,>bold< / 1 tem>
</sty1e>
<style name:"Label")
<i tem name:,,android : t exts i ze,,> 1 6 sp<,/ i tem>
<item name:,,android: textColor,,>#eel 620< /
r I (.m>

260 Pemrograntan Smart Pltottl Mt'rtp1l"ltttt,tk,rtr 'il )h Arrrlrorrl rl,rrr I l;rcktttli Artrlrortl ItAlS 9 Aphk;r:,r lll,li I r,r,rl
261
<i-tem name:"android : textsty1e")normaI</ 5. list item lokasi. xml, menu input
Buat file XML yaitu:
i-tem) fokasi.xml, rincian cuaEa.xml, dan view 1oklsi-
</style> tersimpan. xml . KeGmpat layout menggunakan resource
Layout (dipilih pada window New Android XML) yang seluruh
<sty1e name:"view_text") Layout tersimpan di direktori / res / layout. Dari tiap layout akan
<item name:" android : textsi ze">1 4 sp<,/ item> ditunjukkan desain layout UI dari IDE Eclipse, berikut kode program
masing-masing layout:
<item name:"android : textColor">#000000</
item>
a. Source code layout l-ist item lokasi . xm.l_:
</style>
<style name:"edit_text")
<item name="android : texLSi ze">1 4 sp</ item> <?xm} version:"1. 0" encoding:"91'p-8,,?>
<item name:"androi-d : textColor">#000000</
item> <TextView xmlns : android:"http: ,/,/schemas - android . eom/
<,/style> apk/ res,/android"
<style name:"1ist_text") android : 16:"@ +idl list_j_tem,,
<item name:"android : textSi ze">1 8sp</ item> android : layout_width:"fi1 l_parent,,
<item name="android : textColor">#000000</ andro j-d : Iayout_hei-ght:"50dip"
item> style:"Gstyle/1ist Lext" />
<item name:"androld : textStyle")normal(,/
item> Layout l_ist item Iokasi.xml berfungsi sebagai

</sty1e>
penyedia list layout text menggunakan nama referensi lisi
item, data tersebut diperoleh melalui ArrayAdaptei
<style name:"button_text") Savedlocation akan me-/oad database lokasi berbasis
SQLite hasil request.
<i Lem name:" android : Lext S i ze "> 1 2 sp<,/ I tem>
<item name:"android : LextCol-or">#000000</
item> b. Source code layout menu input l_okasi . xml-:
</stYIe>
</resources> <?xmI version:"1. 0" encodi-ng:-r1;-8,, ?>
<RefativeLayout
Filest.y1es. xml sebagai referensi untuk kustom font style layout xmlns : android:"http: ,/ / schemas . android . com/ apk/
Ul di suatu aplikasi yang didefinisikan ukuran, text style, font dan
lainnya. Penggunaan konfigurasi styles . xml- akan mempermudah
r es /androld"
pengembang dalam memodifikasi display font aplikasi tanpa mengatur andro id : layout_width:"fiI 1_parent,,
satu persatu tiap TextView dengan menggunakan acuan font style salah ,r ndro id : layout_height:"f111_parent,,
satu string resource, contohnya TextView menggunakan kustom style
style:"Gstyle/intro blurb" mengacu pada style dengan anclroid : gravi ty:" center_hori z ontal',
nama lD style intro nlurn di dalam file styles. xm1. , r rrrlroid: padrl i nq:'10px")

262 Pemrogranran Smart ['ltttttt' Mt'rrliplttrr,tk,rtr 'il )h Arrrlrrrtrl rl,rrr ll,rr krrtli Atrrlrotrl ItAll() Aphk;r,,r l{li!i I r,r,rl 263
<TextView android' i6:"@+j-d/speclfy ]ocation android : textSi ze: " 75px"
I dL)C -L
android : textCof or:"#000 0 0 0"
andro i d : l ayout_width: "wrap_content " android : layout_margi nLe ft:" 5F)x"
android : 1ayout_height:"wrap_content" andro j-d : layout*marginBottom: " 5px"
android: 1ayout_marg j-nLef t--" 5p7" android: 1 ayout_befow:" j-d/ c i ty_country',
@

android : 1ayout_margj.nBott om:" 5px" style:"@style/1abe1" androi-d : text:,,G


android : 1 ayout_marginTop: " 25px" string,/1at _)-ng" />
style:"G style,/1abe1" android : text:"G <TextView android: id:" @+id/ zip"
s t ring/ spec i fy_Iocat 1on_1ab el-" / >
android : Iayout_wi dth: "wrap_cont.ent,,
(TextVi-ew android ' 16:"@+id / formaL"
android : 1 ayout_he i ght:"wrap_content,,
android : layout_width:"wrap_content " android : textSi ze= " 1-5px"
androi-d : layout_helght:"wrap_content " android : textColor:"# 000 0 0 0 "
android : textSi ze:" L5px" android : Iayout_marginI,ef 1: " 5px"
androi-d : textColor:"+00 000 0 " android : I ayout_marginBottom:" 5px"
android : I ayout_marginl,e f t:" 5px" android : layout_be1ow:" id,/ 1at_]ng"
@

android : layouL_marglnBottom:" 5px" style:"Gstyle/Iabel" android : text:,,G


android : layout below:"Gid/specify sLring/zip" />
locati-on_label- " <EditText androi-d: 16:"@+id/1ocation,,
style:"Gstyle/1abe1" android: text:"G androici : layout_width:" 2 0 Opx"
string/formaL" /) android : 1 ayout_he i ght.:"wrap_content,,
<TextView android: i6:" @+id/city_country" android : Iayout_be1ow:" G id/ z ip"
andro id : layout_widLh:"wrap_contenL " android : layout_marginl,ef t :" SE)x"
android : 1ayout_heig,ht:"wrap_content " androi-d : layout_marginBottom:" 5px"
androi-d : textSi ze: " L5px"
android : textColor:"#0 0 000 0" style:"Gsty1e/edit_text,, /> <!--androi-d:nu
android : layout_marginLef t:" 5Px" rne r i c:" _integer" -->
android : layout_marginBottom:" 5px" <Button android: id:"@+1dlspecify location
android : layout_be1ow:"G id,/ format" lrutton"
st.yle:"G styIe,/1abeI" android : texL:"G id : layout_wi dth:"wrap_con tent,,
andro
string/city_country" /> android : layout_height:"wrap_content,,
<TextView androj-d : i6:"@+idl1at_1n9" android : layout_margJ-nTop:" 5 0px"
andro j-d : 1 ayout_width:"wrap_content " android : layout_marginLe f t :" 1 px"
android: layout height="wrap cont-enL" ,rrr<iroid: I ayorrt marginBott.om:,,5px,,

264 Pemrograman Smart ['hottl Mlttl"lpltttr,rk,rrr ',1 lh Atrrltorrl rl,rrr ll,rr:krrr11 Arrrlrorrl llAll() Agrhk;r.,r lllili I r,r,rl 265
android : layout-beIow:" G id/ f ocation" android : gravity:"center horizontal"
and,roid,: texl-=" G st ring/ spec i fy-Iocat ion-button- android : padding=" 1 0px"
label" /) androId . setVert i ca f ScroI l-BarEnabl-ed: "tr
< /Re 1 atlveLayout> ue")
(TextView android:14:,,@+id/view Iocation
menu input fokasi.xml digunakan sebagai desain
pada file 1abeI"
layout Ul inpu- lokasi untuk masukan user secara manual pada android : textColor:" #0 0 0 0 0 0"
EditText. dengan referensi string name location akan dibaca android : layout_width="wrap_content" android : Iayout_
class Displayilenulnputlokasi. Pada gambar 9'7. tampak
desain layoit U[menu_input_]okasi. xml dari IDE Eclipse. he 1 ght= "wrap_content " android : 1 ayout_marginTop: " 7 lpx"
android : layout_marginLe ft= " L}Px"
Masukkan R*ia atair Dderah android : 1ayout_marginBottom:" 5px"
Format:
- koraldaerah,negara
st.yIe="@style/1abe1" android: text:"G
- latitude,longitude string,/view_location_l-abeI" /)
- ZIF rodt <ImageVier android : i.d=" e+idlcondition
inagle"
android : layout_ridtlt=" I Opx "
an&oid : layout_height=" 8 Opx"
android : J-ayout_toRightOf=" 0 id/wier_
Iocation_label"
android : layout-marginlef t=" 1 5 0px"
android:background=' *ffffff' />
Gambar9.7 Layout XML nenu input-lokas i
<TextView android . 16:,, + id,/view_f ocat i on,,
@

rincian-cuaca. xml: android : textColor:"#000 0 00"


c. Source code layout
android: layout_width:"filf_parent" androj-d: 1ayout._
<?xml version:"1-.Ou encoding:"utf-8"?> lie i ght : " wrap_content "
<ScrollView xmlns : android:"http : //schemas' android' com/ androi-d : 1 ayout_be 1ow:" G idlview_
apk/ res/ android" location_fabeI"
android : layout-width:"fi1 1-parent" android : layout_marginle f t:" l}px"
android : 1ayout-he ight:"wrap-conLent ") .r ndro id : layout_marglnBottom:" 5px"

st.yle:"G style/view _LexL" / )


<Relativelayout xmlns :android:"http: //schemas' <TexLView android. 16:,,@+id,/view date
android . ss11t/ aPk/ res/android" l abe1"
android : Iayout-width:"fi1 l-parent" android : textColor:"#0 000 0 0 "
android : layout-hei- ght:"f11 1-pare n t "

lrlrlrrl Mr,lli11rrrr,rk,rrr 'il)x Atrtlrprrl rl,rtr ll;rt kittli Artrlr6rtl IlAlt() Apltkirst lllili I lrrl 261
266 Pemrograman Srn;rrl
android: layout_width:"{rap_content" android:layout an.tr:oid: layout_marginBottom=,,5px.,
heighL:"Brap_content" style=,,0sry1e/vie!i_rext,' />
android: layou!_be1ow="0 id/view_ <Textview android: _id:,,G+idlview forecast
location" android: layouL_marginleft:" 10px" labeI,,
android: layout_marginBotton:"5px" android: textcoto!="+00o000.
style="0sty1e/Iabel" android: text="G string/view_date ndroid: layout_$idth=.lrrap content,, andxoid:layout
label" /> height=.wrap_content',
<textview and.oid: id="@+idlvie,_date" android: layour_below=.0 id/vier_
android: fayout_width="fifljarent" condit.ion. android: layout_marginleft=,,10px.
android: textcolor="*000 00 0" anctroid: layout_narginBotton=,,5px.
android: layout_height="wrap_content" android:layout_ style=.0style/1abet. androial: text=.0strinq/viee
befow="eid/vies_date_Iabe1" forecast_Iabe1- />
androld: layout_marginLeft=" 10px' <Textview android: id=,, O+id/vier_forecast,.
andloid: layout_margj.nBottora="5Px" aDdroid: textcotor=.+ 00 0O 00.
style="Cstyle,/vier_text- /> android: layout-rridth=.lil]jarent,, androial:tayout
<Texwie$ android: id="G+id/view condition height=,,v.rap_content.
1abe1" android:layout below=,,.aid/view
android: rextcolor="*000000" fbr€cast_label,,
android: Iayout_width="irrap_content" anclroid: layout_ anctr:oid: Iayout marginleft=,,10px,,
height="wrap_content" android: tayout_marqinBottom=.t opx-
android: fayout_belorr="@ id/view_date tyle=,,Osty1e/view_text,, />
android: layout_marginleft="10px" <CheckBox android: id=-G+idlvieti coniigure
android: lavout marginBottom="5px'/ alerts/
style="@style/ labe]" android: Iayout_width=.wrap_content,,
andro d. text=zcstring/wier_ android: layout_height=,,rap_content,
condition_]abe1" /> an.troid: tayout_narqinLeft=410px,
<Textview android: id=-G+id/view_condit ion" android: Iayout_marginBotton=,,15px,,
android: textcolor=" +00 00 0 " 0 styte=,0 style/view_text4
android: layout-width="fil Ua.ent" android:layoul anctroid:layout below=,,Gid/vieu forecasr,, />
height="srap_content"
android: fayout-belor-'8id/wiew- </Relalivelayout>
condition_label" </Scrollview>
android : laYout-narqin,,e f t=" 1 0Px"

268 _ Pemrograman Smart Phone Mr.nplgrtrr,rk,ril lil)K ArIlrorrl rl,rrr ll,rIkrrrg Anrlrorrl llAlJ () Alrltk;r,,r lllili I r,rrrl 269
Layout rincian_cuaca . xml merupakan desain layout U/ yang ctorOnTop--"faIse" /)
akan diimplementasikan class DisplayDataRSS . j ava untuk <TextView android' 16:"@+id/view*saved_locations_
menampilkan reguest data RSS setelah melalui parsing XM[. Pada tag
ImageView digunakan untuk penempatan image yang dipilih dari empty" android : layout_width:"fif 1_parent "
proses class DisplayDataRSS. Pada Cambar 9.8 tampak desain android : layout_height:"fll 1_parent"
layout Ul menu input lokasi. xml- dari IDE Eclipse. style:" style,/ lnLro_b.Iurb"
G

android:text:" " /)
<,/Re l at iveLayout>

Lokasi :
Desain layout ini sebagai display default layout resource yang
akan menampilkan list kosong, diimplementasikan oleh Activity
Tanggal: Di spl ayRS STe r s impan. Selanjutnya saat state onCreate akan
mengeksekusi method loadl,ocations ( ) untuk menampiikan
data dari database RSSDatabases.
Kondisi Cuara:

Sebagai resource terakhir, diperlukan sejumlah gambar berformat


Perkiraan Ctd(a:
PNC yang dapat dikopi dari suplemen buku ini ke direktori /
res/drawabJe, gambar tersebut sebagai image resource project
RSSCuaca sebagai icon aplikasi dan gambar ilustrasi kondisi cuaca.

Untuk memasukkan image Copy dari direktori sumber file gambar


PNC tersebut atau menggunakan shortcut Ctrl +C kemudian paste-
Gambar 9.8 Desain layout Ul r inc i an_cuaca. xnL kan ke direktori /res/drawable meng-klik kanan di direktori
drawable -+ Paste atau menggunakan shortcut Ctrl +V. Setelah
file berhasiIterkopi akan tampak dalam direktori drawable seperti
d. Layout view_tidak_ada_data -xrnl: pada Cambar 9.9.

(?xml version:"! -0' encoding:"uXf-8"?) ,s Elm


<Rel-ativeLayout. F il} &a'rr*h
;$ c*Ur**-lrl.r,E
I

xmlns : android:"hLtp: //schemas . android. comz/apk/


: : i* ryxrton-116'Prtq
res/android"
android : layout_width:"fil l_parenL"
android : 1ayout_height.="fil I_parent"
*xx:*ff
android : gravity:"center_hori zonta1 " . : ,$ rmdtion-rft'nng
$ rmdtion-1?9.prg
android: padding:" 1 Opx")
<ListView android: ld:"Gandroid: id/l-ist"
android : layout_width: "fi1 l_parent "
' ;XffiX:friffi
i* rondtion*200.rru

android : 1 ayout_height:"fil 1_parent " Gambar 9.9 lmage reslurce yang telah dimasukkan ke direktlri resource project
android: layout weight:"1" android : drawSele

ItAlt
() Altltk,r'.t l{1,i, I r'r'rl
270 - Pemrograman Smart Phone Mcnllllttttitk,rrr 1il)K Arrrhurrl rl,rtt ll,rr krrrli Atrrltotrl 271
Setelah file XML sudah dibuat sebagai string resource, styles, dan /ayout.
Selanjutnya membuat 2 package tambahan, yang masing-masing package di rmport com. contoh. rss. cuaca. data. RSSDatabases,.
dalamnya terdapat sejumlah class yang dikelompokkan berdasarkan fungsi, import com. contoh. rss. cuaca.data.WeatherForecast;
berikut adalah diagram package aplikasi RSSCuaca:
import com. contoh. rss. cuaca. data.WeatherRecord,.
1 . Pada package default yang sudah terbuat yaitu com. contoh . rs s . import com. cont.oh. rss . cuaca . data . V{orl-dWeatherFetcher;
cuaca digunakan sebagai Main Activity. Berikut sejumlah source
import com. contoh. rss.cuaca.data.RSSDatabases.
code tiap class yang ada di dalam package com.contoh.rss.
cuaca yang akan dijelaskan secara tepisah. Saved],ocation;
a. Modifikasikan public class Di splayDataRSS menjadi seperti import com. contoh.rss. cuaca. service.
berikut ini: RS SWo r l- dWeatherAle rt ;
package com. contoh. rss. cuaca;
public class DisplayDataRSS extends Activity {
import android. app.Activity;
lmport android. os . Bundle,' private static final String CLASSTAG :
Di-splayDataRSS - class - getsimplelrlame ( ) ;
import android. app. ProgressDial-og; pri-vate static final int MENU VIEW SAVED LOCATIONS
import android. contenL . ContexL,' : Menu. FIRST,'
imporL android. content . Intent,' private static final int MENU_REMOVE_SAVED_LOCATION
import android. Iocation. LocationManager,' : Menu.FfRST + 1;
import android. net . Uri,' private static final_ int MENU SAVE LOCATION : Menu.
import android. os -Handler; FIRST + 2;
import android. os . Messaqe,' private static final_ int MENU SPECIFY LOCATION :
import android.util. Log; Menu.FIRST + 3,.
import androj-d. view - Menu; private static final j_nt MENU_VIEW_CURRENT LOCATION
import android. view. Menultemi = Menu.FIRST + 4,.
import android. widget. CheckBox;
i-mport android. widget. CompoundBut-ton; private TextView location;
import android. widgel-. ImageView; pri-vate TextView date,-
import android. widget. TextView,' prlvate TextVj-ew condition,.
import android. widget . Toast,' private TextView forecast;
j-mport android. widget . CompoundButLon . private ImageView conditionTmage,-
OnChe c kedChan geL i s tene r,' private CheckBox currentCheck,-
import android. location. Location;
import java. lang. String; private ProgressDial_og progressDialoq;

llA[1 () Aphk,r',r l(li'i I r.r.rl


272 -Pemrograman Smart Phonc Mcn1111tttt,tk,rtt iil)K Arrrltrrrrl rl,rrr ll,rr kttrli Atttltoirl 273
private WeatherRecord rePort,' StringBuffer cond = new

private String reportlocaLion; StrlngBuf fer O .'

private String locationName; cond. append (report. getCondition ( ) .


private String latlongGPsString; getDisplayO + "\n");
private String IatlongNetString; cond.append("Suhu: " + report.
getTempO + t' C\n");
private boolean useDevicelocation; cond.append("Tekanan Udara : " +
report.getPressure() + " mil-ibar"+ "\n"+"Debit Hujan:
public int intrval,' " + report.getPrecipation() +"fivn" +"\n");
cond.append("Kelembaban : " + report.
private Savedlocation savedlocatron; getHumi-dityO + "% - Arah Angln : " + report.
privateSavedlocationdeviceAlertEnabledlocatlon; getwindDirecti-onO + "\n"+"Kecepatan: "
+ report. getwi-ndspeed O +
private RSSDatabases dblokasi; "mph"+"\6"1;
cond.append("Waktu Update : " +
private final Handler handler : new Handfer O { report. getTimeUpdate ( ) ) ;
condition. setText (cond. toString ( ));

GOverri-de
public void handleMessage (fina] Message msg) forecst : new
stringBuilder(r rtttttn"uilder
ProgressDialog' dismiss ( )''
if ( (rePorL =: null-) I I (rePort' for (int 1 = 0; (report.getForecast.s o
getCondition O := nu]l) ) {
!= nul-I) && (i < report.getForecasts O .l-ength); i++; {
Toast .makeText (DisplayDataRSS ' this,
WeatherForecast fc = report.
get.Forecasts O Ii] ;
R. string. message-reporL-unavailable' Toast' LENGTH-
forecst.append("Hari ini :\n") ;
SHORT).showO;
forecst. append ( fc. getCondition ( ) .
) else {
!r s +
Log.v(Constant-LOGTAG,
getDisplayO +"\n"+"Suhu \n"* "Tinggi ," +
+* HANDLER report - " + fc.getHighO + " C - Rendah i" I fc.getlowo
DisplayDataRSS-CLASSTAG
+ .. crr);
report) ;
]ocation . setText ( report . if (r := 0) {
forecst. append ( "\n\n" );
getlocation O);
date . setText ( report . getDate ( )); )

lh rl,rtt ll,rr kttt1l Arttlrotrl l3Ali() Aphk,r',r l(iili I rlrl 275


274 Pemrograman smart PhOn0 Mctllilitttl,tk,ttr :il Arrrlror{l
forecast. setText ( forecst . tostring ( )) i / jalankan listener currenrcheck, untuk
/ meng-
String resPath = "com.contoh. enable atau nen-disable alert
rss.cuaca:drarable/" + "condition z + report. this . currenlcheck.
qetcondition ( ) . get Id ( ) ; setoncheckedchanqelistener (new
int resld = getResourceso. oncheckedchangeListener ( ) {
getldentifier (resPath, null, nulf ) ;
conditionlmage. public void oncheckedchanged (rina]
setlmaqeDrawable (getResources O .getDrawable (resId) ) ; ConpoundButton button, final boolean ischecked) {
) (Constant. LocTAG, .. +
Log. w

) Disp]ayDataRss . CLASSTAG + . oncheckedchanged _


J;
.
schecked _ ,,
+ ischecked);
Soverride updateAlertstatus (ischecked);
public void oncreate (final Bundte icicle) { }

super.oncreate (ieicle); ]);


Ioq.v (Constant. LOGTAG,' " + Disp-IayDataRSS.
CIASSTAG + \\ oncreate'/); // instansiasikan location service sebagai
request instance untuk akses
this. setcontentview ( R, layout - rincian-cuaca ) , // ke provider GPS_PROVIDER dan-atau NETWORK
PROVIDER
this-Iocation = (Textvier) findvieeByld(R. IocationManager locationl4anager;
id. vieir_Iocation) , st.ing context = context . IOCATIoN_SERVICE;
this.date = {Textvies) firdvieflById (R. id - viet _ locationManager - (IocationManager)
date) , getsysremservice (context) ;
this. condilion = (Textvies) findviewByld(8.
id.vielr_condition) i Strinq gpsjrovider = locationl4anager. cps
this.forecast = (Textview) findvierByld (R. PROVIDER,
id.view_forecast), l,ocation gps_]oc = IocationManager.
this . conditionlmage = (hagevieir) getlastKnovrnlocation ( gpsjrovider ) ,
findviewByld (R. id. condition_image) ; updatecPsNewlocation (qps 1oc);
this.currentcheck = (CheckBox) findviewByld(R.
id. wieir_conligure_alerts ) , string ntw_provider : LocationManager. NETWORK

276 _Pemrograman Smart Plronc Mr,rrpiglrr,rk,rrr iillK Arrrlrorrl rl,rtr ll,tr ktnli Arrritotrl ItAlt () AgrIk,r,,r lliili I r,r,rl 277
PROV]DER;
Location net_Ioc : locationManager. GOverride
geLLastKnownLocation ( ntw_provider ),' pubJ-ic void onResume O {
updateNewNetLocation ( net_Ioc ); super. onResume O ;
Log. v (Constant . LOGTAG, \\ \\ + DispIayDataRSS .
/ laLankan service - yang akan diaktifkan
/ CLASSTAG + " onResume")i
sesaaL setelah proses Booting )
// meskipun service diaktifkan berulang Lldak
akan berdampak negatif dengan aplikasi GOverride
public void onStart O {
startservice (new InLent (this, super.onStart O ;
RSSWorldWeatherAlert. class) ) ; Log. v (Constant . LOGTAG, r\ \\ + DispIayDataRSS
) CLASSTAG + " onStarL");
this.dblokasi = new RSSDatabases (this) ;
GOverride
protected void onPause() {
this . l_ocat ionName : RSSWorl_dWeatherAlert -
super. onPause O ; deviceLocation;
Log.v(Constant.LOGTAG' $ s + DisplayDataRSS.
CLASSTAG + " onPause");
// defini-sikan nama lokasi dari Url (berupa
this . dblokasi . cleanup ( ) ; nama l-okasi atau koordinat)
t.his. locationName : RSSWorl-dWeatherAlert. if ( (getrntenro .gerDatao !: nuII) &&
deviceLocation; (getfntent O . getOata O . getEncodedeuery O !: null)
if (this.progressDialog. isShowing O ) {
&& (getrntent O .getData O .
this. progressDialog. dismiss ( ) ; getEncodedQueryO.lengthO > 8)) {
)
Log. v (Constant . LOGTAG, \\ \\ +
) DisplayDataRSS.CLASSTAG + .rData intent diperoleh dari
guery/ menjalani proses parsing,,),.
GOverride String queryString : getlntent O .
public voj-d onRestart O t getData O . getencodedeuery O ;
super.onRestart O ; Log. v (Constant . LOGTAG, r\ \\
Log. v (Constant. LOGTAG, $ \\ + DispJ-ayDataRSS
+
.
DisplayDataRSS.CLASSTAG + .r queryString - .. +
CLASSTAG + " onRest.art"); queryString) ,-

)
thls.reportlocation : queryString.

278 Pemrograman Smart ['ltone Mt'ttplgtttt,tk,rtt lil ]h Arrrhotrl rl'rrr ll,rr kttrli Atttitotrl
llAB !l furllk;r,,r llliii lnr'rl 279
substring(5, (getlntent O .getData O .getEncodedQueryO . 1) {

lengtho ) ); this.currentcheck.
this.useDevj-celocation : fatsei setChecked (true) ;
II olca
elau t
I ) else {

Log. v (Constant . LOGTAG/ \\ \\ + this . currentCheck.


DisplayDataRSS.CLASSTAG + "Data lntent tidak tersedia, setChecked(fal-se);
alihkan ke lokasi sebelum"); )

this. reportlocation : this. locationName; )

this.useDevicelocatlon : true; )

)
loadReport ( this . report.Location) ;
)

/ / baca kondisi state yang tersimpan pada


dat-al:ase GOverride
this. savedlocation : this. dblokasi. get (thls. public boolean onCreateOpti-onsMenu (finaf Menu menu)
report],ocation); (

t-his.deviceAlertEnabledlocation : this. super . onCreateOptionsMenu (menu ) ;


dblokasj-. get (RSSDatabases. DEVICE ALERT ENABLED
LOCATIONS); if (this.useDevicelocation) {
menu.add(0, DisplayDataRSS.MENU SpECIFy
if (this.r-iseDeviceLocation) { LOCATION, O,

this . currentCheck. set.Text (R. string - v-iew getResources ( ) . getText (R. string.menu_
checkbox_currenL) ,'
specify_location) ) . setlcon (androi_d.R.drawabl-e. ic menu
if (this.deviceAlertEnabl-ed],ocation i: edit);
nu11) { ) else {

this. currentCheck. setChecked (true) ; menu.add (0, DisplayDataRSS.MENU VIEW


1
j alea
erav !
t
CURRENT_LOCATION, 2,
this. currenr-Check. setChecked (false) ; getResources ( ) . getText (R. string. menu_
)
device_location) ) . setfcon (android.R. drawable. ic menu
rJ alca
eruv r
t
zoom) ;
thi s . currentCheck. seLText ( R. s t ring . r.riew menu.add(0, DisplayDataRSS.MENU SpECIFy
checkbox-speciJic); LocATIoN, 3,
if (this. savedlocation l: nu]]) I SetResources ( ) . getText (R. stiinq. menu_
if (this.sawedlocar i.r.,,l, rl, I rhL.d ".- specify location)).setlcon(android.R.drawable.ic menu

280 - [,ltttrplit,rrrr,rrt lirrr,rrl l'lrorr, l,4,.tr1,1,tttr.rl.,rtr ',1 tl' /'\r,lroril rl.trl I l,rr kttrl' Atrrltrtttl t3Ati 1) Altltk,r',t l(lili I r,r,rl 281
edit);
if (this. savedlocation := nufl) { uri uri : Uri.parse("cuaca://
menu.add{0, Di sp:LayDaraRSS MENU .
com. contoh . rss / loc?addr=" + this . IatlongNetstring) ;
REMOVE_SAVED_LoCATIoN, 4, Intent intent : new lntenl(Intent.
getResources O getText (R. string. ACTIoN-VIEW' uri);
nenu-remove_location ) ) . sell con android. R. dral,able . ic
( startActivitv inte (

menu defete), nt);


) else { }
else if (this. rarLongcpsslring.
,add(0, DisplavDataRss. MENU-SAVE- lenqthO>1) {

LOCATION, 5, getResource s { ) . qetText ( R. string. menu- u'i uri = Uri.parse("cuaca://


save location) ) com' contoh rss/1oc?uaO'=" * this ' latlongcpsstr:ing) ;

.setlcon(android.R.drawable.ic rntent intent = ne'


menu-save) , Intent ( Intent ' ACTION-VIEW, uri) ,
) startAcriviry ( intent );
i
al aa I
t
)

menu.add(0, DisplayDataRSS.MENU VIEW SAVED Uri uri : Uri.parse (..cuaca: //


LOCATIONS, 1, getResources O .getText (R. string.menu com. contoh.rss/1oc?addr:" + this. lrccationName) ;

Eoto*saved) )
Intent intent : new
. setf con (android. R. drawable. ic menu Intent (fntent.ACTION VIEW, uri);
myplaces); startActivity ( intent) ;
)

return true; break;


)
case MENU SPECIFY LOCATION:
startActivity (new
GOverride Intent (DisplayDataRSS. this, DisplayMenulnput.Lokasi.
pubJ-ic bool-ean onMenuf temSelected (fina1 int class) ),'
featureld, final Menuftem item) { break;
case MENU VIEW SAVED LoCAT]oNS:
switch (item.getltemldO) {
Intent ir,t.nt = r.*
I ntent (DlsplayDataRSS. this, DisplayRSSTersimpan.
case MENU V]EW CURRENT LOCATION:
if (tlLis.lailcn4EtstrirSlaull) {
class),.

282 - Pemrograman Smart I'ltorrc Mrtrggtrrr,rk,rtr )li Atrrltotrl,l,rtr ll,rr kttt1l Atttlrotrl
ItAIt() Aphk,r,,r li'i'i I r,r,rl 283
"l
intent.putExtra ("locationName", this
private void updateGPSNewLocation (Locatlon
IocationName) ;
startActlvi-tY ( i-ntent) ; location) {
break,'
case MENU SAVE LOCATION:
if (l-ocation !: null) {
savedl,ocatlon toc : new double lattd : location.getlatltudeO ;
double longtd : location.getlongitudeO ;
Savedlocation O ;
Ioc.alertenabled = 0; latlongcpsString = lattd * "," + longtd;
Ioc. lastal-ert : 0;
l-oc.loc : this. rePortlocation;
I a1ca
vruv I
I t

IatlongGpsString : this. locationName;


loc.city = this.report.getlocaLiono
this . dblokasi. inserL (Ioc) ;
Uri uri : Uri.Parse ("cuaca: / /com' )

contoh. rss/Ioc?addr:" + this.reportlocation) "


)

intent = new Intent (lntent'ACTION- private void updateNewNellocation (Location locaLion)


{
VIEW, uri-);
startActivitY ( lntent ) ; if (location != nuI1) {
break; double lat-td : location.getI,atitude O,'
CASC MENU REMOVE SAVED LOCAT]ON:
double .long1-d : location.getlongitude O;
if (thls.savedlocation !: null) {
latlongNetstrj,ng = Iattd * "," +' longtd,'
this . dblokasi ' delete (this ' ) else {
latlongNetstring : this . focationName;
report],ocation) ;
)
)

uri : Uri.parse ("cuaca z / / com'contoh )

rss,/loc?addr:" + this. reportlocation) ''


i-ntent = new lntent (Intent'ACTTON- private void updateAlertstatus (final- boolean
isChecked) i
VIEW, uri); \\ \\ + DispIayDataRSS.
Log. v (Constant. LOGTAG,
startAct j-vity ( intent ) ;
CLASSTAG + " updateAlertSt.atus - " * isChecked);
break;
/ / Gunakan koordinat geo lokasj- perangkat
l
if (!this.useDevicelocation) {
return super. onMenuf temsefected (featureld'
ir
item) ; ';tT;:":loio .o. ]okasi, buar rokasi
)

tK Atrrlrorrl rl,rrl ll,rt.krrrg Android


llAli(l /yrlrk,r',r l("" Ilr',1 285
284 Pemrograman smart PhonO Monggttrr,rh,rrr lil
baru dan set alertenabled=l Savedlocation currentloc : new
if (th:-s.savedlocation =: nu11) i Savedlocation ( );
SavedlocaLion loc : new currentloc.alertenabled = 1;
Savedlocation O ; currentloc.lastalert : 0;
loc.alertenabled : 1; currentloc.loc : RSSDatabases.
foc-Iastalert : 0; DEVI CE_ALERT_ENABLE D-LOCAT IONS
;
loc. Ioc : this.report],ocatlon; this . dblokasi . insert (currentloc)
loc.city : this.report.
,"

)
getlocation O; ) else {
this - dblokasi - insert (Ioc) ; if (this.deviceAlertEnabledlocation !:
/ / )ika loc target telah nuII) {
tersimpan, update alert menjadi enable this. dbl,okasl . delete (RSSDat.abases .
) else { DEVICE-ALERT_ENABLED LOCATIONS ),.
this. savedlocation. alertenabled = I

this . dblokasi . update (this .

savedlocation) ;
) l
l else {
if (this-savedlocatlon !: nul1) i private void loadReport (fina1 St.ring addr) {
this - savedlocation . alertenabled = I,oE-v(Constant.LOGTAG, $ r\ + DisplayDataRSS.
o, CLASS?AG * " loadReport-),.
this. dblokasi . updaLe (this . Log-v(Constant-LOGTAG, i\ \ + DispIayDataRSS"
savedlocation) ,' CL.A,SSTAG +' addr - .. + addr);
)
) this.progressDia_]og = progressDialog.
) else f shoy(this, getResourc€s ( ) - gettexr (R- string. view
// f'ungsi save atau tidak men-save data ,oiking). getResources o
RSS Cuaca saat user nenggunakan fitur lokasi perangkat . getText (R- string. serwer_actdr
) , true,
// berikan alert pada lokasi spesifik false);
if (ischecked) {
if this . deviceAlertEnabledlocati on ==
( final viorldweatherEetcher lrwh = ne,
nurl) { WorldweatherFetcher {addr) ;

286 , Penrrograman Smarl l'lttrttl Mlttlllltttt,rl ,rrr ',1 tK Attrltrrtrlrl,rtr li,rr krttyi Artrltorrl
287
/ / kirin rePort ke thread terpisah unLuk show () , y.ing tampak pada Cambar 9.i 0.
digunakan Handler ProgressDialog
/ / saaL progres selesai, kirim empty rnessage
ke handler sebagai penanda proses thread selesai
new Thread O {
Goverride
o"o';:,:::":Tjl
sltw"atr,",, ;
Log.v(ConstanL.LOGTAG, \\ \\ +
dWeatherFetcher
DisptayDataRSS-CLASSTAG + *
Gambar 9.10 Progress dialog saat menjalankan thread Worf
report - " + report);
handler. sendEmptyMessage (0) ;
Setelah threadselesai mengunduh data stringdari parserSAX, selanjutnya
)
akan ditampilkan teks hasil keluaran dari layout rincian cuaca
).startO,' menggunakan method setText pada string resource element
l TextView vang ditunjukkan di bagian berikut ini.
I this.location : (TextView) findViewByld(R.
id. view_location) ,-
Class ini sebag,ai MAIN LAUNCHER Activity
this.date : (TextView) findViewByld(R-id.view
DisplayDataRSS, yang pertama kali dieksekusi sistem saat
user membuka aplikasi RSSCuaca. Proses pengambilan data date) ;
XML dari web service dan parsing di.ialankan dalam thread thj-s.condj-tion : (TextView) findViewByld(R.
terpisah, oleh class WorldWeatherFetcher melibatkan
class WorldWeatherHandler yang ditunjukkan di bagian id. view_condition) ;
kode berikut: this.forecast : (TextView) findViewByld(R.
id.view_forecast);
this.progressDialog : ProgressDialog. show (this, this. conditionlmage : (ImageView)
findViewByld (R" id- condition_image) ;
geLResources ( ) . getText (R. string. view_worklng) ,
getResources ()
this.currentCheck : (CheckBox) findViewByld(R.
ld. v j-ew_configure_alerts );
.getText (R.string.server_addr), true,
false) ;
Untuk menampiikan gambar weather dari layout Ul digunakan
final- WorldWeatherFetcher wwh : new
element fmageView di bagian kode di atas mengacu pada resource
WorldlrleatherFetcher ( addr ),' path direktori drawable yang tersimpan dalam package aplikasi
new Thread() (com.contoh.rss.cuaca:drawable/) nama file image yang
tersimpan dalam direktori drawable/ disesuaikan dengan nomor
kode kondisi cuaca, kode-kode tersebut didefinisikan pada class
Saatd ijalankan th read Wo r I dWe a the r Fe t che r akan tam pak WeatherCondition.java (pada package com.contoh.
progress dialog menggunakan method Prc>grt':;r;i)i al oq. rss. (-u.tca. data). Berikut adalah setlmageDrawable untuk

aoo, rjt'rrrril ll l liAIl'r Aplrk,r',r li',', I l,,l 289


/,ot ''{ ll't'ltili';tlll,lll lrtti,tll i'lro,rl [4r'tt1'1'rrrr,rl. r I ir ttr l-'rtrl; Atrrlrotl:
"lrl
implementasi display image pada class DisplayDataRSS.
*r
String resPath : "c@-contoh-rss.cuaca:drawable,/" + Sukd Loka5l Lokag

I
Sry,a

"condition_" + report.getCondition O -getld( ) ; i*

int resld : getResources O -getldentifier (resPath, nu11, t_ m


I re ntukan loka5l Hipu! Lokasl
nu11);
condi t i on lmage . setlnageDrawabLe ( getRe s our ce s ( ) Gambar 9.12 Menu Lokasi Saya pada layoutActivity DispJayDa taRSS
getDrawable (resId) ) ,'

Saat telah diperoleh clata kode weather dari tag {weat-herCode}, b. Selanjutnya, buat class baru dengan nama file
misalnya diperoleh kode WeatherCondit i on bernilai 293 (berupa DisplayMenulnputlokasi.java. Class ini sebagai
huian ringan sedang), kemudiarr akan diset pada layout image dengan Activit.y DisplayMenulnputLokasi untuk menu
gambar icon file "condi-tion 293"pnq" yang tersimpan di input lokasi. Masukkan source code di bawah ini ke class
direktori drawable/seperti yangditunjukkan pada Cambar 9.1 1. Di splayMenu I nputLokas i yang telah terbuat:

package com. contoh- rss. cuaca;


lmport android. app.Actj-vity;
import android. app. AlertDialog;
import android. content . Dialoglnterface,-
import android. content.. lntent;
Gambar 9.11 File condition 293 -png sebagai resource conditionlmage import androld. net -Uri;
import android. os . Bundle,-
import android. text.Editabfe;
Beberapa fungsi menu pada Activity DisplayDataRSS, salah import android. text . TextWatcher,-
satunya pada state onMenultemselected, saat user mengakses j-mport android-uti1- Log;
menu MENU VIEW CiIRRtrNT LOCATION (yaitu menu Lokasi i-mport androi-d. vlew. Menu,.
Saya yang terlihat pada layouioisplayDat-aRSS di Cambar import android. wiew.Menult-em;
9.12). Activity DisplayDataRSS akan membaca nilai string imporl androj-d. vj-ew.View;
latLongNetString sebag,ai koordinat longitude dan latitude import android- view.View. OnCIickLj-stener;
yang diperr:leh dari method updaLeNewNetLocation lmport android. widget. Button,-
memanfaatkan layanan NETWORK PROVIDER atau dari method import android. widget . Edj-tText.;
updateNewGpsLocatlon menggunakan layanan dari GPS import android. widget. Toast;
pnOvf ofn. Nllai string yang telah diperoleh ditambahkan ke input
URI cuaca : / / cam- contoh - rssrr']oc?addr: yang akan public class DispJ-alMenufnputLokasi extends Activity {
mengaktifkan kembali lntent DisplayDataRSS menggunakan
method getlntent () ke state onStart O untuk membaca data private static final- String CLASSTAG :
hasil pengembalian tersebut, DisplayMenufnputl,okasj-. cfass. getsimpJ_eName () ;
private static finaf int MENU GET REPORT : Menu.
trrRST,-
private static final_ int MENU VIEVi SAVED LOCATIONS
-. Menu.FIRST t 1;

290 I',,'tttl'tl11ratt t;ttt Sttt,tt I l'ltr rr IlAlj(l Alrlrh,r.,r I


291
private EditText location; handleloadReport O ,'
private Button button;
));
GOverride )
public voi-d onCreate(finaf Bundle icicle) t
super. onCreate (icicle) ; GOverride
this . seLContentView (R. layout . menu_input_ protected void onResume O {
Iokasj-),' super. onResume O ;
this.location : (EditText) findViewByld (R. Log. v (Constant . LOGTAG, \\ \\ +
id.focation); DisplayMenulnputl,okasi_.CLASSTAG + .. onResume,,) ;
this.button : (Button) findViewByld(R. l
id. speci f y_location_button ) ;
GOverride
thj-s . l-ocation. addTextChangedlistener (new public void onStart O {
TextWatcher ( ) { super.onStart O;
GOverrlde )
public void onTextChanged (finaI
CharSequence s, final int start, final int before, final @Override
int count) { public boolean onCreateOpt.ionsMenu (final Menu menu)
if ( Iocation . getText O . toStrinS O . {
lengthO > 50) { super. onCreateOpti-onsMenu (menu) ;
Toast ( 0, DisplayMenulnputlokasi . MENU_GET*
menu . add
. makeText ( DisplayMenu InputLok REPORT, 0, getResources O .getText (R.string.menu view
asi.thi-s, "Input salah harus lebih darj- t huruf, atau report) ) -
input terl-alu panjang", Toast.LENGTH_SHORT) . setf con (android.R-drawable. ic menu more) ,.

. show O ,' menu.add (0, DisplayMenulnputLokasilUnUU VfnW


locaLion. setText ( l-ocation. SAVED_LOCATTONS. 7,
getText O .toStringO .substring(0, 50) ) ; getResources O -getText (R-string.menu goto
) saved) ) . setlcon ( android. R. drawable . ic_menu_myplaEes ) ; -
) return true;
@Override )
public void afterTextChanged (final Editable
e){ GOverride
)
publi-c boolean onMenuf temSelect.ed (final int
GOverride featureld, final Menultem item) {
public void beforeTextChanged (final switch (item.getItemldO ) t
CharSequence s, final int sLart, final- int count, final case MENU-VIEW-SAVED-LOCATIoNS :
int after) { fntent intent = new
) Intent ( DisplayMenulnputlokasi . thi_s,
)); DispIayRSSTersimpan . cf ass ) ;
startActivity (intent );
this . button. setOnCfickListener (new break,'
OnClick],istener ( ) { case MENU GET REPORT:
GOverride handleloaEneport O ;
public void onClick(View v) { break,'

292 - PentrograntanSirrr;rrl l'lrorrlMtn1l1lurr,rk,ur '.1 tl'Arrrlrlrrlrl,rrr ll.rr krrrliArrrlrorrl liAll(, Atrhk,r',r l{',', I,'r',1 293
)
)
return super. onMenultemselected feat-ureId, ( )).showO,'
item) ,'
vafidationText : null-;
]
]
return valid;
private void handleloadReport O {
IntenL intent : null;
Uri uri : nu1l;
if (validate{}) { Pada class ini, Activity DisplayMenulnputlokasi akan
uri : Uri .parse ("cuaca : / / com- contoh. rss,/ membaca refensi input user yang akan menjalankan Activity
toc?addr:" + thls.location-getText O -t-oStringO ); DisplayDatRSS input lokasi dari user, masukan tidak
intent : new fntent (Inl-eni:'ACTION-VIEW, diperbolehkan bernilai null (kosong) yang ditentukan dari
uri); parameter berikut :
startActivitY ( intent ) ; this ocation. get.Text ( ) :: nulf dan
.f
)
)
th s. location.getText ( ) . toString o
j.
equals ('t").
private boolean valldate O { Activity ini juga menyediakan fungsi menu MENU_
boolean valid : t.rue; VIEW SAVED LOCATIONS untuk akses ke ListActiviti'
Stri-ngBuffer validationText : new Di spTayMenu Inputlokas i.
Stri-ngBuf fer O ,'
if ( (this.location-getTextO :: nul-1) I I Lhis" Selanjutnya, buat public class baru dengan nama file
location.getTextO .toStringO .equals ("") ) { DisplayRSSTersimpan . i ava, class ini merupakan
validationText. append (getResources ( )' Activity ketiga dengan tipe LlstActivity sebagar
getstring (R. st ring.message-no-1ocaL-ion) ) ; penyedia list data yang tersimpan dalam database SQLite,
va1ld : false; berikut ditunjukkan source code lengkap dari class
i else if ( (t,his - location. getText ( ) ' Di splayRSSTers impan:
toStringo.length0 <:2 )) { package com. contoh. rss . cuaca,'
val idationText - append ( getResources o
getst r ing ( R . s tring - message-inva1 id-locat ion ) ),'
valid : false; import android. app. ListActivity;
)
if ( !va1j-d) {
import android. app . ProgressDialog;
new AlertDialog.Builder (this) ' import android. content.Context;
setTitle (getResources O - qetstring (R- string' alert- import android. conl-ent - fntent;
labef ) )' setMess"Yilro".ronrexL.roSrrins location. Location;
o)- imporL android.
setPositiveButton ( "Lanjutkan", import android. location. LocationManager;
new android - content . DiatoglnLerface ' lmport android. net.. Uri;
OnClickListener O {
import android.
os.Bundfe;
@Override import os. Handler;
android.
public void onClick (final i mport andr oi d. os.Message,'
Dialoglnterface dialog, final int argl) {
finlsh ( ) ,' impor1,111r11 oirl.rrl i J .Log,'

Pemrograman srrrarl [,lr0rrr, M0illil:tttr,rk,rrr )lr, A||rltotrl ,l,ttt ll,rr ktttli Attrltottl liAli() Aplrk,r',r li',',1,,,1 295
294 "l
inport android. view. llenu;
import android. view. l{enultemi
import android. viev. Vie$, private final Handlex handler = neir Eand1er0 {
inport android. widget . ArrayAdapler;
import anclroid. ridget .IistAdapter; Sowerride
inport android. widget.Iistview; public void handleMessage (final Message msg) 1

import android. widget. Textview, Log, v (Conslant. LOGTAG, ' " +


Di splayRssTersimpan. CLASSTAG + " pioses thread setup
impor:L con. contoh. rss. cuaca. data. RssDatabases; Iist");
import com. contoh. rss . cuaca. data . RssDatabases . progressDialoq. di smis s ( ) ;
Savedlocatj-on; if ((locations == nult) ll (locations.
sizeO == 0)) {
import java.util.Iist; empty. setText (trData Xosong,,);
) etse {
public cfass DisplayRssTersimpan extends ListActiwity adapter : new ArrayAdapter<sawedLoca
t tion> ( DisplayRssTersimpan. this, R.tayout.list iten
lokasi, Iocations);
private static final Strinq = CLASSTAG setlistAdapter (adapter) ;
DisplayRssTersirnpan. class . getsimpleName O; )
private statlc final int MENU SPECIFY LOCATION :
Menu. FIRST; t-
Ir
privat.e static final int MENU VIEV,7_CURRENT_LOCATION
: Menu.FIRST + 1; GOverride
public void onCreate (final- Bundle icicle) {
private RSSDatabases dblokasi,' super. onCreate (icicle) ,.

private ProgressDialog progressDlalog; this . setContentView (R. Iayout . view_tidak_ada_


prj-vate TextView empty; data); //set default stri-ng saat data kosong
pri-vate List<Savedlocation> locations; getlistview ( ) . setEmptyview (findViewByld (R.
private ListAdapter adapter; id. view_saved_locations_empty) ) ;
thls.empty : (TextView) findViewByld (R. id.view
privat.e String latlongGpsString; saved_locat ions*empty ),-
private Strlng lat.LongNetString; this. dblokasl : new RSSDatabases (this) ;
private String focationName; l o,rrlLocations O ;

296 Pemrograman Stnart l)hrtttc Mltt1111ttrt,tk,rrr ',1 )l', Arrrltotrl rl,ttt ll,tr ktttll Artrltotrl 297
] else {
// instansj-asikan locatlon service sebagai latlongGpsString : thls "

request lnstance untuk akses locationName,-


/ / ke provider GPS PROVIDER dan-atau NETWORK )

PROV]DER
LocatlonManager locatlon-l4anager;
String context : Conte:(t. LoCATIoN SERVICE; private void updateNei.,Netlocation ( Locarion
locationManager = (LocalionManager) location) {
qetsystemserwice ( conlext ) ; if (Iocation 1= null) {
double tattd = tocation.
String gps_provider = LocationManager. GPS_ gettatitudeO;
PROVIDER; Couble longtd : "l.ocal-1orr.
Locatlon gps_loc : locationManager. getl,ongj-tude O ;
getl,astKnownlocation ( gps_provider ); latlongNetString: fattd * "," *
updateGPSNewLocation ( gps_}oc )'' longtd;
) etse {
String nts_provider = LocationManager. NEmORK latLongNetstring = this-
PROVIDEB; focationNane;
Location net_1oc = locationManager. )

getlastxnosnlocation (ntsjrovider) ; )
updateNer.NetLocation (net_1oc) ;
I Gowerride
protected void onpause ( ) i
prlwale woid updatecPsNerrLocation {l,ocation suPer. onResume ( ) ;
location) { this . dblokasi. cleanup O ;
if (location !: nul1) { }

double lattd = location.


getlatitude O; GOve rri de
doubfe longtd : locaLion- protected voicl onResume() {

getlongltude O; super. onResume O ,-

J-atlongGPsStrj-ng : Iattd * "," * )

fongtd;
GOvlr r idc

298 - Pemrograman Sntarl l'lrorrl Mr,lt1l11ttt,rh.rrr ',1 tlr Atlltotrlrlrn ll,rr ktttl,Atttirottl IiAIi') A1rlrl,,r.,r I
299
publ-ic boole;rn orrcreateopl-ionsl"1erru (final Merlu menu) switch (item.getItemIdO ) {

i case MENU_VIEW_CURRENT_LOCATf ON :
sruper " cnCreateOptlc-'nsMenr'r (inenu) ; if (this. laU_crgilbtStrrrql {
=rull)
*on,-r.;',:idiC, i-.-spiairF.S;i'j'r-,ls-mpar'i'liiilNU.-Slllt-ll:',,
Uri uri : Uri . parse (..cuaca : /,/
r-r,-f s.{).?,,.- j.1 li.l:-:.lnq.ir'...;:. com.contoh. rss,/1oc?addr:,, + thls. lat.LongNetstring) ;
_:. :.
:i.a{larly-_icr';:r-:l,ir)).sr-"!lcci!(anC:c;iii"F..i;.-r*-lrb'lt-''j' rt';':l'i; fntent intent: new Intent(Intent.
ed.r- i. ) ; ACTION_VIEW, uri t;
rnenu. add {C, DispiayRSSTersi-mpan. MENU-VIEW- startActivlty ( inte
I,OCAT;ON, 1,
CI-]RRENT nt);
getResources O -getText (R. string.menu- )
dewice_location) ) . setlcon (androici - R - drawable - i.l-menu- else if (this.latT-ongGpsString
mylocaLioni ; length O >r1 1

return true; Uri urj- : Uri . parse (..cuaca: //


com . cont oh . rs s,/ loc ?acidr= " + this. lati.ongGpsStri-ng) ;
,t
Intent intent : new
lntent ( Intent . ACTION Vf EW, uri ) ,.

SOverride stirtActivi ty ( intent- ) ;


protected void onlisLltemClick (final ListView 1, )
else
finaf. View vn final i-nt position, final fonE id) i {
Uri uri : Uri . par:se {,.cuaca: / /
Log-v{Constant.LOGTAG, \r \\ + com. contoh. rss,/1oc?addr:,, + this. f ocationName) ;
DisplayRSSTersimpan.CLASSTAG + " di-pilih list item"); Intent intent : rre-s;
Savedlocation location : this. locati-ons ' lntent (Intent.ACTION VfEW, uri) ;
stirl-Activity ( i-ntent ) ;
get (position) ; )
Uri uri : Uri -parse ("cuaca z / / com' contoh ' rss,/ break,.
loc?addr:" + location.loc) ; case MENU*SPECIFY_LOCATION :

Intent intent : new Intent(Intent.ACTION VIEW, startActivity (new


I ntent (DisplayRSSTersimpan. this,
uri),' I)i splayMenulnputlokasi . cl-ass ) ),.
startAct j-vlty (lntent) ; break,'
l ]
return super. onMenuftemselected (featureld,
il em) ;
@Override )

public boolean onMenultemselected(final int


featureld, final Menultem ltem) { f,ri.va1 r, .,,,r,id foad]-ocat.ions O {
| (,,1.'/ (r',,rr:;l,inl . I OGTAG,

30c Pemrograman Smarl Phonrl Mrttll,:tltt,rk'rtr l'l ll( Artrlr,rrlrl'rrr ll'rr kttlliAtttirottl 301
DispIayRSSTersimpan.CLASSTAG -f " I oaiiI,ocati-ons") ; Iist LlstAct-ivity merupakan host data lokasi-lokasi
this.progressDlalog : ProgressDialog. yang tersimpan dengan tipe data ListView, dengan bentuk
show(this, " Dalam Proses...", " Membuka lokasi tampilan default Ul berupa list data yang ditampilkan dalam
tersimpan", true, false) ; mode layar penuh dan terurut secara vertikal dalam 1 kolom
new Thread0 { yang ditunjukkan pada Cambar 9.13.

@Override
public void run O {
Iocati-ons : dblokasi.getAll- O; tolytkifE Y'i6aitaf'li, lndofl*Jid.

handler. sendEmPtyMessage (0 ); -7_66 l68tl:ItJt33t. I I 0.r685m1 I


)
tl3}lf L.r .7"66 ,rd Loo I 10.37,
pele[$ing eehmba ng tndcsaia,
).startO;
) irtrrlr l.l.rli, Indff sE"
)
,amtrafi t tafi aranf" I.ldonaii.,
lrlrsb&ya grraliy., lod6oe:i.,
Class ini menyediakan fungsi utama untuk display data list
menggunakan ListView dan menyediakan penambahan b.rdorE Beodmg lndm.ria.
dan penghapusan list lokasi yang akan disimpan pada database d€pok lrcnot" Indon.si.,
rsscuaca.db yang prosesnya diawali pada state
SQLite
oncreate untuk pembuatan database RSSDatabases
baru. Gambar 9.13 Layai I i s t_i t em_l o k a s i i s t Ac t i v i t y
menggunakan L

d" Sebagai class terakhir dalam package ini, buatlah public class
Constant. java yang difungsikan untuk pendefinisian nilai
public void onCreate (final Bundle icicle) { String pada output log.
super - onCreate ( icicle),'
this. setContentView (R. layout.view tidak ada
package com. contoh. rss - cuaca;
data) ; / / set string data kosong
getlistvj-ew ( ) . set-Eq)tyvier (findViewByld (R.
public class ConsLant {
id. view_saved_locations_empty ));
this. empty : (TextVj-ew) findViewByld (R. id.vj-ew
:
public static final String LOGTAG "RSSCuaca,,;
saved_I ocat i on s_emPty ),'
public st.atic final Strj-ng PREFS : "RSS pREES,,;
this.dblokasi : new RSSDatabases {ttris) ;
loadtocations O ,'
public sLatic final String CLEARALERT : "com.contoh
)
rss.cuaca.CLR";
Pada proses inputdatadigunakan rnethod loadlocati-ons ()
yang akan menjalankan fungsi getAll O untuk membaca
lokasi yang tersimpan di database sementara dblokasi
)

yang merupakan hasil ekstraksi RSSDatabases. Ul display


Scl.rrr jrrtrry,r lrrr.rl ltackage baru com. contoh. rss . cuaca .

302 Pemrograrnan Snrart Phonc Mr,rr11p1rtt,rk,rtr f il )lr Arrrlrorrl rl,rrr ll,rr krtt1l Attdrottl 303
data. Package ini untuk menyimpan sejumlah class fungsi fetcher
web service, handler, perekaman dan pengambilan data dari database pubJ-i-c cl-ass llorldWeatherHandler extends
SQLite. Berikut adalah rincian class-classnya.
DefaultHandLer {

Untuk membuat package baru dengan cara klik kanan main proiect
RSSCuaca -+ klik New -+ Package -+ masukkan nama package pada private stati-c final String DATA : "data";
kolom isian Name window New lava Package yang ditunjukkan pada private static final_ Strlng REQUEST : "request";
Cambar 9.14.
private static final String TYPE : "IYPE";
private statlc final String QUERY : "query"i
prlvate statj_c final- String CURRENT COND :
lrtfl Fldeq;*
&elx r n'm, .!rrrg**a- " cu rrent_cond i t i on ",.
private static final Strlng TEMP : "temp C";

prlvate static final- String WIND_SPEED :


fiti .lf5Fq:{*;ssaeauc "windspeedMifes ";
l-ls I'a.r,,ru,.m'rr+c:!,lcia private static final String WIND_DIR =
"windd j- r1 6Point " ,-

private statlc final Strj-ng HUMIDTTY =


humidity";
fBIl ,:rryx--l private static final String VISIBILITY:
"visibil-ity";
Gambar 9.14 Wndow New Java Package
private static final Strlng PRESSURE :
"pressure",'
Dari package com. contoh rss . cuaca . data
. yang telah pri_vat e static final String PREC]P]TATION :
terbuat, selanjutnya dalam package tersebut akan dibuat public "precipMM";
c/ass baru dengan nama WorldWeatherHandler- java.
Class ini sebagai Handler parser SAX untuk parsing data XML, private staLlc final String OBSERV_T]ME :
yang fungsinya sama pada ContohParserSAX yang telah "observation_ ti-me",'
dijelaskan sebel umnya" private static fi.na1 String : "weather";
WEATHER
private stati-c final String WEATHER_CODE :

package com. contoh. rss. cuaca. data; "weatherCode";


private stati-c final- String DATE : "date";
import org. xml . sax. Attributes,' private static final String TEMP-MAX :
" tempMaxC";
import org. xml. sax. SAXException;
import org.xml. sax.helpers. DefaultHandfer; private s tatic final String TEMP MIN :

304 Pemro6lraman Sntart l'ltono M0tt,ltltltl,lk,rtr iil )K Artrltorrl rl,rrr ll,rr ktttli Attdrotri llAtt 9 Aphkasr RSS lr,r.rl 305
t'templ,linC",' GOverride
public void endDocument O throws SAXException {

private int weaLherCount : 0,' )

pri-vate WeatherRecord weatherRecord;


GOverride
private boolean innertag-type : fafse'' public void startElement (Strlng namespaceURl,
private boolean innertag-request : false" String local-Name, String qName, Attributes atts)
private boolean i-nnertag-query : false; throws SAXException {
private boolean innertag-observ-time : fal-se; 1f (1ocaf Name. equals (Vr7orldWeatherHandl-er. DATA) )

pri-vate boolean lnnertag-temp : false;


private boolean innertag-weather-code : false; thi-s. in_outertype_data : true;
pri-vate bool-ean innertag-wind-speed : false; )

private boolean innertag-wj-nd-dir : false; else if (l-ocalName.equals (WorldWeatherHandfer.


private boolean innertag-humidity : false'' REQUEST) ) {
private boolean innertag-visibj'lity : false" this.innertag request : true;
private boolean innertag-precipMM : false; )

private boolean innertag*currenL-cond : false; else if (localName. equals (WorldWeatherHandler "

private boolean j-nnertag-weather : fal-se; TYPE) ) {

private boolean innerLag-pressure : false; thls.innertag t-ype : true;


private boolean innert'ag-date : false'' )

private boolean innertag-temp-max : false; el-se if (l-ocaf Name. equals (Wor1dtr{eatherHandler.


private boolean innertag-temp-min = false; QUERY) ) {
private bool-ean in-outertype-data : false; this.innert.ag guerY : t.rue;
private WeatherForecast forecst; )

el-se if (localName.equals (WorldWeatherHandfer.


public ViorldWeatherHandler O { CURRENT COND) ) {

this.weatherRecord = new WeatherRecordO ; r-hls.i.nnertag current cond = true;


) )
else if (localName.equals (WorldWeatherHandler.
@Overri-de r)BSERV_?rME)) {
public void startDocument O throws SAxExceptj-on {
this.innert.ag observ time : true;
) )

el so i f (l ocalName. equals (WorldWeatherHandf er.

306 Pemrograman Smart Plurnr, Mt'ltlilittlr,rk,rrr "l


tl( Attrltotrl rl.lrr ll,tr kttt11 Atlrlrtttrl llAll() Alrltk;r,,r liliii I lrrl 307
TEMP) ) { this . innertag_weather : true,
this. innertag_temp = true; forecst = new lieatherForecasr O;
l
else if (locatNane. equal s (liorldweatherltandler. )
IiEATHER_CODE) ) t etse if ( tocatName . equat s (worldwealherEandler.
i:his. innertag_ireather_code = truei DATE) ) {
) this. innertag-dare = true;
else if ( localName. equals (worldweatherllandler. I
I/IIIND_SPEED) ) { else if (localNane. equats (WorldweatherHandler .
this. innertag_sind_speed = true; TEMP_MAX) ) {
) rhis.innerlaq temp_ma: = tme;
else if ( focalNarne . equals (worldweatherllandler. )
WIND-DIR) ) { else if ( IocalName . equals (Worldwealher:Hand1er.
this. inne!:tag_rrind-dir = true, TEMP_MIN) ) {
) this. innertag_temp-min = tr:ue;
efse if ( IocalName equals
. (wolldlieatherEandler. l
PRECIPITATION) ) ( }
this. innertagjrecipMM = true,
I Goverride
else if ( IocalName. eguals (florldweatherHandler. public void endEtement {srring nanespaceuRl, String
HUMIDITY) ) { localName, Stxing qName ) throws SAxException {
this. innertag_hunidity = true; if ( loca lNane . equals (riorldweatherttancller. DATA) )
)1
else if ( localName - equals (worldweatherHandler. lhi s. in_outertype_dara = fatse;
VISIBIIITY) ) { }
this . innertag_visibil ity = true; else if (localNane. equals (wor]dlieathernandler .
) REouEsr) ) {
else if ( localName. equals (woxfdweatherHandler. this . innertag_reques t = fa.lse;
PRESSURE) ) { }
lhis.lnnertagjressure = true; else if ( tocatName. equals (worldweatherHandter.
) ,YPE) ) {
else if (localName. equal s (WorldweatherHandfer. t-his.innerraq-type = fafse;
WEAT!iER) ) { '

- ()
308 Pemrograman Smart Phonc Mlrrplgttrr,rk,rrr 'il)l( Attrltrrtrl rl.rtt ll,u kttrli Attdrrltd ItAIJ Ap|k,r',r llii'i I r,r,rl 309
else if (localName. equals (worlalweatherHandrer. HUMTDTTY) ) {

QUERY) ) { this ' innertag-humidity = 161".'


this. inner:tag-query = false; ]

l else if ( localName. equa Ls (vlorldweather:Handter .

else if localNane. equats (liorfclweatherllancllet.


{
VTSIBILITY)) {

CURRENT-COND) ) (
thi s' innertag-visibilitv = false'
this.innertag current conal = false; I
) else if ( IocalNane. equals (worldweatherHandler.
else if tocalName. equals (worlalileatherllanaller.
(
PRESSURE) ) {

OBSERV-IIME) ) { thi s' innertagjressure = fafse;


this. innertag-observ-time = fafse; )

I else if (loca1Nane. equals (Worldweathernandler.


else if IocalNane . equals (worfdweatherHandler.
(
WEATHER) ) {

TEMP) ) { this innertag-weather = false;


this. innertag-tenp = faIse, )

I else if (localName. equalslgnor:ecase (worldweathe


else if localNane. equals (worldlleatherHandler.
(
rHandler'DATE) ) {
WEATHER-CODE) ) { this innertag-date = false,
this. inneltag-weather-code = falsei I

l else if (loca1Name. equalslgnorecase (worldweathe


else if localNane. equals (worrdweatherHandrer,
(
rHandler ' TEMP-MAX) ) 1

WrND_SPEED) ) ( this ' innertag-tenp-max : false;


this. innertag_{ind,speecl = false; }

) else if
loca]Nane. equal slgnorecase (Worldweathe
(

else if localName. equals (worldweatherHandler.


(
rHandler'TEMP MIN)) {
WIND*DIR) ) { thi s' innertag-temp-min = false;
this.innertaq $ind dir = falset l

else if ( localName. equal s (WorfdweathelHandlei.


PREcrPrrATroN) ) { oowerride
this . innertagjrecipMttt : false; public void characters (char chtl, int start, int
I lenqth) {
else if ( localName , equals (woxldweatherHandler. jf thi s ' in-outertype-data ) { (

ItAll 9 Aphk,r',r lllili I r.r'rl


310 - Pemrograman Smart l'horre Mottgl.lurr,rk,rtr iil )K Attrltotrl rl,rrt ll,rr krrrli Android 311
if (this - innertaq reguest ) L

if {this.lnner.taq-typei i . getweathercondirion ( code ) ;


] this , weathelRecord.
if (this inne::tag-querY) i setcon'lition (cond);
String localion = new )

string(ch, start, length); if (this.inneltag wind-dir) l


this ' BeaiherRecorC _ thi s' v'eatherRecord '
setrocation Iocation ) ,
( setwlndDirection {new string(ch. start,
) 1e;9th) );

if (this ' innertag-curren!-cond) { if ( this ' innertag-wind-speed)


if ithis ' innerta'J-observ-tine) {

I this. weatherRecord-
String sun = new setwindsPeed Integer (

str.ing (ch, start. length) ;


thi s . wearhe rRecold. .parselnt (new String(ch, start, Iength)));
setrineupdate (sun) i t
I if (rhis. innertas_humidiry) {
if {this ' innertaq-temp) { thi s . weatherRecord.
Integer val = lnteger setHumidity ( Integer. Parselnt {ne!r String(
ch, start,
.parselrit (ner,, strlnq (ch, start, lenqth) ) ; lenqth) ));
- thls 'wealherRecord )

setTenp (va]) ; if (this. innertag-visibility)

if (this ' innertag-neather- this ' v'ieat herRecord '


letvis ib I Ij Ly (r nteqer
Integer code = rnteger '

parselnt (nev string(ch, start, .parselrt(new strinq(ch, start, lenqth)))i


lenqth) ); )
lieathercondition cond - if (this' innertagjressur:e) {

Weathercondirion thi s . weatherRecord -


::, r Pressure (Donbl e

ItAll () Alrlk;rsr l(lili I lr,rl 313


312-Pemrogramanillnatt[)hotlcMr.rllilirtrt'rk'ttr:'ltK/\tttlrrrrrlrlrrrll'rr:ktrrliArttirrtitj
]
.parseDoubte (newstring(ch, start, length))); if {this. innertag-temp_min} I
) 1or:ecst. setl,old ( rnteger.
if (!his. innertagjrecipMM) { parselnt(new str:ing(ch. starr,
thi s l,teatherRecord. .
lenqrh) ) );
setPrecipation (Double )
if (rhis. innertag_dare) {
.parseDouble (nei{ String(ch, start, length))), this . reatherRecord.
] setDate (new String(ch, start, length)),
]
int count = 0, )
lf thi s . innertaq,weather ) {
(
if ( this . weathercounr < 2) {
if (this.innerEag date) { if (thi s . innertag_temp_
String date : nei{ nax) {
String (ch, start, Iength); forecsr_
forecst. setDate ( date ) ; setHigh ( Integer. parselnt (new string(ch, start,
i
if (this. lnnertag_weather.- l"ength) ));
code) { )
Integer code : Integer. if (this. innertag temp
parselnt (new St.ring (ch, start, min) {
length) ) ; forecst.
WeatherCondltlon cond : setlow (Integer.parselnt (new String (ch, sLart,
WeatherCondition
Iength) )) ,.

. getWeatherCondition (code ) ; )
forecst. this . weatherRecord.
setCondition (cond) ,' qetForecastsO Icount] : forecst;
i )
(this. innertag-temP-max) i
if count++,'
forecst . setHigh ( Integer .

parselnt(new String(ch, start,


length) )); )

314 - Pemrograman Snrarl Phorrr: Mcrrggur,rh,rrr i,l)K Atttltorrl rl,ttt ll.rr:krrlli Arrdroirl llAlt() Aplrka,,r lllili I r,r,,l
315
* lihat
G URL http: //worldweatheronflne.com/feed-
public WeatherRecord getWeaLherRecordO {
generater. aspx
return this . weatherRecord;
* Gauthor MochSoft
)

public void setWeatherRecord (Weat.herRecord


weatherRecord) { public class WorldweatherFetcher {

thls.weatherRecord : weatherRecord;
private static final String CLASSTAG :
)

)
WorldWeat.he rFe tcher . cl-as s . get S impleName ( ) ;
privat.e static final- String QUERY_BASE : "http://
b. WorldWeatherFetcher -
Selanjutnya buatlah public class
j ava seperti yang telah dijelaskan pada class f ree worldweatheronline . com,/f eed,/weather. ashx?q:",-
.
Di spIayDataRSS. Class ini sebagai fetcher atau pengambil privat.e static final- Stri-ng QUERY_ID
ciata XML web service yang mengimplementasikan beberapa : " & f ormat:xm1 &num_of_days:1 & key:1q1.69.
package SAX yaitu org. xm1 . sax. Inputsource sebagai
perryedia fungsi input data XML tunggal menggunakan URI 4d009414'1!t.1,'t07" ;
referensi yang diimplernentasikan menggunakan method private String query;
openStream O dan class org. xml . sax. XMLReader private Strj-ng 1oc;
yang berfungsi sebagai interface untuk pembacaan data XML
yang menggunakan method newSAXParser ( ) .

pubJ-ic Worl-dWeatherFetcher (String location,


package com. copackage com. contoh. rss. cuaca.data,'
boolean overrideSevere) {
/ I validasikan lokasi input dari user
import android.utif .Log; if (l-ocation :: nul-1 I I location.length O <2)
import com. contoh. rss. cuaca. Constant; {
i-mport org . xm1 . sax . Inputsource; return;
import org. xmI. sax.XMLReader; ]
i-mport java.net.URL; this.loc : locaLi-on;
import j avax . xml- . parsers . SAXParser; / / ciptakan query baru
import j avax . xml . parsers . SAxParserFactory; this . query : Wor.l-dV{eatherFetcher. eUERy_BASE +
t Iiis.loc + WorldWeatherFet.cher.QUERY f D;
)
* Class ini sebagai penghubung ke API
worl-dweatheronl ine . com public Wor:ldWeatherFetcher (String Ioc) {
* dan hasil parsing dimasukkan ke WeatherRecord-
t-his(1oc, false),.

Apltk,t:,t lilil' I r','rl 31t


316 Pemrograman Smart Phonc Mttttglltttt,rk,rtt 'il )K Arrrltorrl rl,rrr ll.tt;kttlg Attdroitl
]
selanjutnya akan diciptakan handler baru untuk menjalankan
fungsi hand/er WorldWeathe rHandle r.
public WeatherRecorci geLWeather O i
WeatherRecord r - new WeatherRecordO; Kemudian setelah parsing dari handler
Worl-dWeat.herHandler selesai maka data akan
1-rY {
disimpan pada weatherRecord menggunakan method
get.Weat.herRecord O , untuk lebih jelasnya akan
URL ur1 : new URL(this.query); ditunjukkan pada diagram alir Cambar 9.15.
SAXParserEaclory spf : SAXParserFactory.
newlnstance ( ) ;
SAXParser sp '- spf . newSAXParser: O ;
XMLReader xr : sp.getxMlReaderO ;
//,/ jalankan handfer untuk proses parsing
WorldWeatherHandler handler': new
WorldWeatherHandfer ( ) ;
xr. setContentHandler (handler) ;
xr.parse (new InputSource (urI.
openStreamO ) );
// setelah parsing selesai, simpan data
r : handler.getWeatherRecordO ;
r.setOverrideSevere(l-rue) ; // set override Folge URL :
true unLuk deve.loping "http: //frca "norLdrcatleroaline . com,/
fmd/rerthe a. rrhn?q=
) cat.ch (Exception e) { + locetion * APIhey"
Log. e (Constant. LOGTAG, \\ \\ +
WorldWeatherFeLcher. CLASSTAG, e) ;
Sst*lah ralesai rimsin pada
) Sart"harR.ftrd

return
Gambar 9.15 Diagran alir proses query oleh class WorLdWeatherFetcher

c. Tahap selanjutnya, buat public class baru di dalam


Saat user melakukan input lokasi baru atau membuka lokasi package com. contoh. rss. cuaca. data dengan
tersimpan (berupa nama tempat atau koordinat) methorl nama RSSDatabases . j ava. Class ini berfungsi untuk
getWeather O akan melakukan query ke API f ree. menciptakan database SQLite rsscuaca. db, membuat tabel
worldweatheronl- ine . com dari referensi URL QUtrRY rssc_loc, dan membuat sejumlah kolom untuk penyimpanan
BASE yang disertai lokasi thrs.loc dan nomor API kt'y data yang menerapkan class SQliteopenHelper dan
spesifik Wor1dWear*herFclr:hcr .,\t'l KI;lY ()lJ|l1i\', SQLi teDatabase.

3'18 l'rtrr116llrarntrrr lirrr;rrl I'lrorrc Mr,tr;y1;utr,rk.rtr',1)lt At,,ltrrttl rl,rtr ll,rr kltt11 Attrltotrl
llAB 9 Aplikasr tlSS lotrtl 31S
Dalam tabel rssc_loc dibuat sejumlah kolom, yaitu: private static final String CLASSNAME :
. Kolom loc untuk penyimpanan lokasi request RSSDatabases. class. getSimpleName ( ) ,'
. Kolom city untuk penyimpanan lokasi hasil query dari private static final String [ ] COLUMNS : new
web service
. String[] { "_id", "loc", "city", /*"region",*/
Kolom lastalert sebagai penyimpan data waktu
bertipe Long yang diperoleh dari method System. "1asta1ert", "alertenabl-ed" I ;
currentTimeMillis ( )
. Kolom af ertenabled sebagai penyimpan private SQL1teDatabase db,.
boolean enabl-e alert untuk menjalankan service private final DBOpenHelper dbOpenHeJ-per;
RS SWorldWeathe rAIe rt.

/ / 1oner class
package com. contoh. rss . cuaca . data i
public static class Savedlocation t
import android. content . ContentValues,' public long id;
lmport android. content.Context; public long lastalert;
import android. database. Cursori public int alertenabled,-
import android. database . SQLException; publ1c String loc;
import android.database. sqlite. SQLiteDatabase; / / penambahan nama kota atau area l-okasi
import android. database . sqI ite . SQLiteOpenHelper; public String city;
import android.util. Log; / / tamp:-l-kan data string
public Savedlocation O i
i-mport com. contoh. rss. cuaca. Constanti l
/ Lampilkan data string
/
import java. util.Arraylist; public Savedlocation (final long id, final long
import java. uLil.List; Iastalert, final int. alertenabled, final String 1oc,
final String city. final String region) {
public class RSSDatabases { this. id : id;
t.his.l_astalert : lastalert;
public static final String DEVICE ALERT ENABLED this . alert.enabl-ed : alertenabled,.
LOCATIONS : "DAEL99"i t.his .loc : loc,-
public static final String DB_NAME : "rsscuaca.db"; this. citY : citY;
public static final String DB_TABLE : "rssc_loc" i l
public static fi.naI int DB_VERSION = 3; / / qabungkan data kota dan region

320 Pemrograman Smart Phone Menggrtrr,rk,rrt lil)K Arrtlrorrl rl.trt ll;rr:ktttg Attdrot<l tlAB 9 Aplikast RSS lor,rl 321
Goverride public void onopen (iinal Sol,iteDatabase db) {
public string tostiing0 { super ' onopen (db) ;
returnlhis.loc+""+this.city+", )

| //lakukan upqrade jika darabase tefah ada


) Goverride
//saat database belum tersedia dibuat database public void onupqrade (final so]-iteDat,abase db,
baru finat inr oldversion, finat int newversion) {
private static cfass DBopenHelper extends db. execsol ("DRoP TABLE IF EXISTS ' +
SQliteopenHelpe! { RssDatabases ' DB TAB!E);
oncreate (clb) ;
private static finaf String DB-CREATE = 'CRIAIE )

TABLE' l
+ RssDatabases. DB_IABLE // baqlan end dari inner cfass
+ ' (_id INTEGER PRIMARY KEY, 1oc TEXT
UNIOUE NOT NUU, city TEXT, Iastalert INTEGER, pDblic RssDatabases (iinaf context context) {
alertenabled INTEGER);"; this. dbopenHelper = new DBoPenHefper. ( cont.xt );
estabIIshDb1);
pubtic DBopenHelper (finat context context) { l
super (context, RssDatabases.DB NAME, nuII,
RssDatabases - DB_YERSIoN) , ",rrwal'4 voj.r e.rairllsrDh0 I
I 1i ithis -db -= r1rlt) I
chis.dlr : rhls - dbopenHelper.
€Override gerhlriLabieDatabase O ;
public void oncreate (final SoliteDatabase db) { l
try { }

db. execSQL (DBopenHelpe! . DB_CREATE ) ;


) catch (soLExceptsion e) { putrr'j:r I
'or': 'leEnupi)
r=
Log. e (Constant. LOGTAG, RssDatabases. i i i'hi'. db ou..|) i
CLASSNAME, e); lhjs.db.close o;
) this . db : nrlt;
) _t

i
l

GOverride / / f uncts;i. penambairan kolom tabel

322 Pemrograman Smart Phone Menggunak;rrr lil)X Attrltottl rl,rn ll;rr.krrrli Arrrlroirl llA[] 9 Aphk,r',r l(1,1, I r,r,rl 323
-
pubLc woid inser:t i Savedlocation location) 1
{iina Cursor c : nu]];
Conlentvalues values = neB Contentvalue s ( ) ; Savedlocation location : null;
values.put ("foc", iocaLic-n.Ioci; try {
values.pur ("city/', locaEion.city); c : this.db.query(lrue, RssDaiabases.
values.put ("lastale!t", Ioca tion . lastalert) ; DB-TABLE. RssDatabases. COLUMNS, "loc: t'7 + Ioc + \'2,
rralues.put { "alerterlab].ed", location u11, nu1], nutl, nult,
a].eltenalrled); nu11);
this . db. insert (RssDatabases . DB TABLE, null, if (c.getcounLo > 0) {
values); c.moveToEirsto;
] Iocarion : new Sawedlocation ( ) ,
//funqsi update kolom tabel focation.id = c.qet!onq(0);
public vold update (iina1 save.li,ocairon location) i location.toc: c.getstring(1);
Contenivalues walues: neo Contentvalues0; location.city = c.getstrinq(2);
values.put("1oc", iocaiion.loc); location.lastalert = c.Setlong(3);
vatues . put ( "city", localion.city) ; Iocation. aI€lten l].ed = c.getlnt(4);
values. pu! ("lastatert", locat ion . lastalert) ; )
values. pur r\a1e!tenab1ed", lo.ation.
{ } catch (SeLExceprlon e) {
aLertenabled); Log.v(Constant.I,ocTAc, RssDatabases.
ttris. db. update (assDatabages. DB TABI-E, values, cLAssNA E, e),
*_id:" + location.:id, nuil); ) finally I
I if (c I= nuII && tc.isclosedo ) {
//funssi haPus data pada ID dan 1oc tertentu c.close0;
public woid delete(final long id) { }
this.db.delete(RssDataiases'DB-TABlE,'-id:" + 1

id, null); return location;

public void delete tfinal string loc) { public list<sawedlocation> getAll0 t


thi s . db. delete (RssDatabases ' DB TABLE,
\rloc="' Ar:raylist<Savedlocation> ret = new
+ loc + ""', null); Arrayla st<Savedlocation> ( );
) Cursor c = null;
// method penvimpanan data ke tabel trv i
public Savedlocation get (Iinal Strinq loc) { c = thi s . clb . query (RssDatabases . DB Ti\BtE,

pentrogral)il1 Srpalrt l,llrrrc Mr,rr11l1utt,rk,rtt ',1 )X Atrrlrorrl rl,rrr I l,rr kttlli Atttlrrttrj l3Al3() ApIk,r',r lllili I r.r'rl
324 - 32s
RSSDatabaSeS.COLUMNS/ nuii, riul]. 1 :.1u1,,.i-. I.liriiT irLi-i. ) ; Cursor c : null;
lnt numRows : c"getCcr:n!- () '' Arraylist<Savedlocation) ret : new
c.moveToFirst i ; ( Arrayl-ist(Savedlocarion> ( ) ,.

for (int i : 0; 1 ( n''in.iRows; ++-i) i try {

Savecilocation locatlon : new c : this.db.query(RSSDatabases.DB TABLE,


Savedlocation O ; RSSDatabases.COLUMNS, "alertenablecl : 1,,. null, nu.ll,
location-id : c"getlong (0) ; nui-1, nu11) ,'

locat.ion - Ioc : c - qetStr j-ng (1) ; i-nt numRows : c-getCount O;


Iocation.citY : c-getsLriog (2) ; c.moveToFirst O,-
Iocation. ]-astalert : c - getlong (3) ; for (int i : 0,. j- ( numRows; ++i) {
locat-ion. a]-ertenabled : c. get-]nt (4 ) ; Saved],ocati-on locati_on : new
// pengembalian nilar Pada list Savedlocation O;
dengan nifai Iocation.id : c.getlong(0) ;
/ / aLerL enabfed l-ocation.loc : c.getString (1) ;
if ( ! location. loc - equal s (RSSDatabases ' location.city : c. getString(2) ;
DEViCE-ALERT-ENABLED-I,OCATIONS) ) { location. lastal-ert : c. getlong (3) ;
ret . acid ( location) ; location . alertenab"l-ed : c. getlnt (4 ) ;
i / / :ika salah satu data pada mode
c.moveToNext O ; alert enable tetap dlmasukkan pada List
)
if ( ! location. l-oc. equals (RSSDatabases.
) catch (SQLExcePtion e) { DEV]CE ALERT ENABLED LOCATIONS) ) {
Log - w (Constant. LOGTAG, RSSDatabases' ret . add ( location) ,-

CLASSNAME, e) i l
) finally { c.moveToNext O ;
if (c !: null ee !c'isClosedO ) { )

c. cl-ose O ,' ) catch (SelException e) {

i Log.v (Constant. LOGTAG, RSSDatabases -


CLASSNAME, e);
)
return reL; ] finally {
)
if (c !: null ee !c.isClosedO) t
// method menampiJ-kan seluruh data yang dalam c. close O ;
kondisl A1ert Enabled )

publicList<Savedlocation>getAllA]-ertEnabled(){ )

- pemrogramarr Smart Phonc Mrrrrllllrrrr;rk.rrr lil )K Attrltottl rl,rtt ll,rr krrtli Attrlrotrl llAli() Agrhk,r',r lt',', I r,r,rl
326 321
yang didukung diantaranya: CREATtr TABLE, DELETtr TAilLtr,
return ret; INSERT ?ABLE.
) t. Method onOpen ( ) untuk akses :'nembuka database yang secara
default digunakan mode read only sebelum dilakukan proses update
)
dari database.
Untuk akses ke lokasi data spesifik digunakan class Cursor yang merupakan
bagian dari package anciroid.ciatabase berfungsi sebagai penyedia
SQLite interface query ke database. Berikut sejumlah method yang didukung class
pI i ant ACI D (Atom,i city' cons iste
SQLite adalah manai emen database ber-com Cursor:
iune Jia"t"'n untuk sistem entbedded karena hanva
il;;;;ffi;,,au,ioiinvi dan berstar-rdar RDBMS a. Method getCount ( )query untuk memperoleh jumlah baris dari
6"lirp" oril, _'in libraryh:luir", iort*ure srack Android sangat sederhana
(Relationa/ Database i)iiigur"rr Systenr).,librari SQLire suatu tabel.

;;;;;;;;, n".upu lib;; ;il;*ai din database disimpan secara terintegrasi b. Method getColumnlndexOrThrow O untuk memperoleh nama
di dalam direktori ti# ,prlr.iri- sehingga tidak mempengaruhi database indeks dari suatu kolom tabel dari suatu data.
RSSCuaca, tersimpan
aplikasi lainnya. contJhnvu database sqrite aplikasi c. Method qetColumnName ( ) yaitu query untuk memperoleh nama
p!J"-/a"f daLa/ com- contoh ' rsscuaca'/rsscuaca ' db yang indeks dari kolom tabel.
"'/
dapat dilihat menggunlf.i" f,l" Explorer melalui DDMS yang ditunjukkan
i1. Method getstring i ) nrerupakan query yang paling sering
pada Cambar 9.16. cligun.ikan untuk memperoleh peng,embalizrn berup:r isi d.rta string dari
kolom tertentu
lfill.S1-19 17:10 dtw'r'r
r d:!. coifi.(6dtoh.rl5-tscr e. t i nt query untuk memperoleh pengembalian data
2f,11{1.19 17110 dmrs'-t _;er
() nunrerik
, |l drt.b.tll
,j: ,trru.(t.db
5r$ l0fl-01-31 ll5{ -r*-r8---- bertipe data Integer dari suatu kolom
f. geiLong ( )querv untr-rk menrperoieh pengenrbaliarr rlata nutnerik
Long yang diperoleh dari suatu kolom
bertipe data
Gambar 9.16 Database RSSCuaca pada File Explorer
DDMS
g. moveToFirst O untuk query pemindahan cursor ke posisi baris (row)
teratas dari suatu tabel
h. moveToNext O untuk query pemindahan cursor ke posisi baris (row)
Method Akses Database SQLite selanjutnya.
Seiumlahmethoduntukaksesbacatulisdatabaseyangterdapatpadaclass i. moveToPrevious O merupakan query untuk pemindahan cursor ke
R;;;;lJi="t dapat dijelaskan sebagai berikut: baris sebelumnya.
a. Method insert ( ) sebagai penyedia fungsi query untuk penambahan j- moveToPosition O query untuk mengarahkan cursor pada baris
data ke suatu baris (row) dari tabel' tertentu.
b.MethodinsertorThrow()sebagaifungsiqueryuntukpenambahanfungsi throw
k. getPosition O query untuk mengetahui posisi cursor
data ke ,uatu naii it"i aiii tabeT d"ngin diiengkapi Penerapan Cursor dalam class RSSDatabases dapat dilihat pada
memasukkan oala'
exception saat input data kosong atau gagal method giet, getA11, gretAllAf ertEnabled yaitu sebagai berikut:
penghapusan ciata
c. Method delete ( ) merupakan fungsi query untuk
ke suatr't baris (row) da'it'b"l yang
juga dapat meiakukan penghapusan Cursor c : null;
seluruh data Pada tabei. Savedlocation Location : nuff;
( sebagai fungsi query untuk update di suatu
barii;
d. Method update ) trY {
(row) data dari tabel.
c : this-db.query(true, RSSDatabases.DB_
e.MethodexecSQL().Methodmerupakanfungsi-statementperintall
qu.ery ke database)
;;;gg;i un,rl ,dJ ir"et'^g a'tabase (bukan fungsi Beberapa TABLE, RssDatabases. COLUMNS/ "loc : \" + -loc * "'",
perintair
dan tidak *"niulunf multi-statemenr.
"t#tuti
ItAl{rl Aplrk,r'.r ll'," I llrl 329
328 -PemrogramanSntarl[,httttt:Mttntltltttt.lk.tttli|)KAttlIrilrrIrl,rtrll.trkttrllAtttlttltrl
nul1, nuf], nulf, nuIf, Data rsscuaca . db.dari Emulator, dapatdilakukan
nu11); data menggunakan Fire Exprorer din mengkritll". /data/ padadirektori
if (c.getCountO > 0) Perlu diingat,. mengkopi fire database han/a a"p"t irlir,r"itlrnu, s. r al.
{ ,iiit uk;;;;;;;
AVD, s.ed.angkan untuk perangkat Android, secara defaurtriie Emurator
c.moveToFirst ( ); dapat diakses user karena direltori t a"liia"ta
oalauase tiaat
menggun akan permission
]ocation : new Savedlocation O ; root,yang
.h.anya dapat, diatasi dengan cara melakuk;";;;ilg'perangkat
focation.id : c.get.Long (0),' tersebut sehingga saat akses consore"user akan
sebagai root (proses rooting
akan dijelaskan pada bab Hacking nndroid).
location.J.oc : c.getString(1) ;
location.city : c.getString(2) ;
location. J.astalert : c.getLong (3),'
locat-ion. alertenabled : c. getlnt (4 ) ;
)
Pull file Push llle Oolete fie

Dari ketiga method di atas, Arraylist<Savedl,ocation> Gambar 9.18 lcon-icon pada File Explorer
untuk menyimpan data sementara hasil dari query tabel rs sc
foc" Saat boolean alertenabfed suatu lokasi berrrilai true
(kolom afertenabled bernilai 1seperti Cambar 9.18) yang Setelah user berhasil mengkopi file database
ke*omputer host, selanjutnya
tersimpan pada List<Savedl,ocation> akan mengaktifkan alert dapat dibuka aplikasi SQLite Studio pada menu
Databases _, uia Database
RSSWorf dlrlea+-herAlert pada lokasi-lokasi tersebut. (Cambar 9.19).

Modifikasi database SQLite


O.trba*e filc
['ada program tersebut basis data rsscuaca.db akan tercipia otonrati: ft/drrrbrry'wrcdb
oleh sistem Androitl setelah aplikasi dijalankan. Kita dapat merubah isi data,
r-ontohn,va nrenanrbah data atau kolom tabel menggunakan ,\QliteStudlo [rtrbasc rnms
yang dapat diunduh pada http:llsqlitestudio.one.pllindex.rvt?act:downloaci 't Goul(r ruiomdk.lly
(Cambar 9.1 7) atau kita dapat menggunakan aplikasi SQLite manager lainnya. t1t Tylcnmaiafiddtdm

.,f
!trt.t
ir&
'{- studio Ifl Rarrtrrtcr ir grraroatty

!'ll1rryYj':r'ii*d
i:rc1
a et rr,:e'^*.'i,;.1.!rt Gambar 9.19 MenuAdd database pada Selitestudio
Lk e,_# t rl:..!
Jr*-d i.;i, ,H:.,i.,. ;i:::
r84 r"..r*!.-.;. ;.- ; l,'
H t-Y rr:XrmllJnt_LrJ E .c{r6* d i
aar4,t:,r.- ::.'-
s H{,56-q: Pada sQlitestudio akan tampak isi database
a s 6;ret. -':l,<L *r.ruhtffi
dari rsscuaca.db yang
i.r.-.dr..ti
'r,,5lb-&,
lr*-?&ra
t^*
r:.,i r, :-,i:
J:.n- x: terdapat tabel rss roc dengan r";rrrun k"rom
dianiaianyl
-ii
primary key, kolom loc, koi-om city, f,oll* sebagai
Gambar 9.17 Halanan web unduhan SQLite Studio (Sumber : ftp.//sqlitestudio.one.pl) a I ertenabl_ ed (Cambar 9.20).
ru"r.i.'.1;a* kolom

330 ,Pemrograman Smart Phont: Merrllgrrnak,rtt lil)K Atttlttttrl tl'rtr ll,tr.ktttli Attrlrorrl RAB 9 Aplrk,r,,r llii', Ir'r,rt
33't
rr6cua-& {gnt**la
private st.atic cl-ass DBOpenHelper extends SeliteOprnHr l;rr*
_,.:

-n raHer fl {
adr*l_meladda
private static final_ String
' $!
ilil
lndcrer TABLE *
DB_CREATE = "CilJl?I
S t419an + RssDatabases . DB_TABLE
$, vsrrr
J + .. (_id INTEGER PRIMARY KEy/ loc TEXT UNlUr,F
NOf NULL, city TEXI , l-ast.alert f NTEGER, al-ertorralr
le,l
TNTEGER) ,. ";
public DBOpenHelper(fina1 Context context) |
Gambar 9.20 Tabel rss_l-oc pada aplikasi SQlrtefiudio super (context, RSSDatabases.DB NA!!E, rrrrl l,
RSSDatabases. DB_VERSf ON) ,.
)

GOverride
SQLiteOpenHelper
public void onCreate (final SeLit.eDatabase db)
Class SQLiteOpenHelper merupakan bagian dari package class |

android. database . sqlite, menyediakan fungsi akses suatu trv {


database untuk mernbuka, membuat, menghapus atau meng-upgrade suatu db. execsel (DBOpenHelper. DB_CREATE) ;
database. Beberapa method yang dimiliki class SQLiteOpenHelper
diantaranya:
) catch (SelException e) {
Log. e (Constant. LOGTAG, RSSDatabanca
a. Method getReadabl-eDatabase O untuk membuat atau
CLASSNAME, e) ;
membuka database. Jika method ini gagal dieksekusi (misalnya
disebabkan file corrupt) akan memberikan keluaran thow exception )
ke SQliteException. Saat kapasitas disk host otomatis masuk ke )
mode read-only.
GOverride
b. Method getWritableDatabase ( ) untukaksestulis padadatabase.
Jika method ini gagal dieksekusi, misalkan karena kapasitas disk penuh
public void onOpen (final SeLiteDatabase db) {
maka luaran thow exception dikirimkan ke SQLiteException. super. onOpen (db) ;
c. Method onUpgrade ( ) untukakses upgradedatabase. Method iniuntuk )
implementasi fungsi drop (penghapusan), penambahan, atau modifikasi
tabel. Method ini menyediakan beberapa parameter, diantaranya db GOverri_de
sebagai parameter database yang digunakan, oldVersion untuk pub11c voi-d onUpgrade (finaI SeliteDatabase
dlr,
parameter database sebelum modifikasi, dan newVersion sebagai final- int oldVersion, finaf int newVersion)
parameter database baru. {
db.execSQL(.DROp TABLE IE' EXfSTS .. I
Class RSSDatabases memungkinkan aplikasi meng-hand/e pembuatan RSSDatabases.DB TABLE) ;
database baru yang diimplementasikan ke method OnCreate O atau
onUpgrade ( ) dengan meng-override constructor seperti yang ditunjukkan onCreate (db) ,.

di bawah ini: )

l3A[3
() Aphk,r.,r lllil, I r,r'rl
332 Pemrograman Smart Phone Menggtrnakan lil)K Arrrhorrl rl;rrr llar:krng Android 333
public enum WeatherCondition
Dari class RSSDat-abases tampak method onCreate O digunakan {
untuk menciptakan database dengan perintalr execSQL langsung ke
database, sedangkan method onOpen untuk membuka database dan method MRAINT("hujan intensitas menenglah sesaat,, 2qql
onUpgrade untuk upgrade database dengan menghapus tabel r s s c 1 o c LRAfN (..Hujan ringan,,, 296),
(menggunakan perintah DROP TABLE).
PRAfN (..Hujan ringan sebagian,,
Pada buku ini sebagian class aplikasi RSSCuaca yang bagian dari package , 293) ,
com. contoh. rss. cuaca. data yaitu WeatherCondition, HDRf ZZLE (..ger j-mis intensitas
tinggl bersuhu
WeatherForecast, dan WeatherRecord hanya dicantumkan rendah", 284),
sebagian karena ditujukan untuk efisiensi jumlah halaman buku. FDRfZZLE (..Gerimis bersuhu rendah,,
Secara garis besar fungsi public class WeatherConditi-on sebagai
, 2gl) ,
pendefinisi kode tag (weatherCode> (baris ke-'t1 data XML weather
data . xml) menggunakan method switch dengan keluaran strin[ Class Weat.herRecord. j ava menyediakan variabel
-weather, string
Misalnya jika tag (weatherCode> bernilai 299, maka memberikan nilai ::r"n7r:_untuk kategori.data ya"ng diperoleh dari handler
string keluaran "hu j an intensitas menengah sesaat". Berikut worl-dweatherHandler yang tumu;;rn SAX
akan di akses oreh crass
sebagian kode dari class WeaLherCondition: DisplayDataRSS sebagai liori- ui rincian
.
ditunjukkan sebagian dari cuaca. Berikut
soirce riii pio'tirclass weatherRecord:
publj-c static WeatherCondition qetWeatherCondil-ion (int
public class WeaLherRecord {
code) {
private static List<WeatherCondition>
WeatherCondition cond : V,leatherCondition.NOT
severeCondltions,-
AVAILABLE;
private boolean overrideSevere;
switch (code) i
privat.e boolean severe;
case 305:
privat.e String date;
cond : WeatherCondition. HRjAINT;
private int temp;
break;
private String location,.
case 302:
private String windDlrection;
cond : WeatherCondition.MRAIN;
private int windSpeed;
break;
private int humidity;
case 299:
private int visibility;
cond : WeatherConditron.MRAfNT;
prlvate double pressure,.
break;
private double precipitation,-
case 295:
private Strlng observ_time,.
cond : WeatherConditi-on.LRAIN;
private String link,.
break,'
prlvate Weat_herCondit.ion cond,ition;
setiap MACRO di atas didefinisikan menggunakan tipe string Enum yang
privat.e We;rtherForecast [] forecasts,.
ditunjukkan sebagai berikut:

334 Pcntrograman Smart Phonr. Mr.trl,gllrrtrirkirrr ',1)X Arrrhortl rl,rrr ll.u.krrrg Android ?EA
weatherRecord. severeconditions = new public boolean isoverridesevere ( ) {

Arraylist<weathercondition> ( ) , Ieturn thi s . overridesevere;


weatherRecord. severeconditions ' )

ad'I (weathercondition 'BSNow) class weather:Forecast , java ju8a merupakan sebagai interface
weatherRecord. severeconditions
' ' variabel-variabel string yang termas;L dalam'kategori dita forecast
add (weathercondition. IEREEZERAIN) ;
(perkiraan cuaca) dan data tersebut iuga diperoleh dari handle, SAX
. Wor:fdweatherHandler yang akan diakses class DisplayDataRss.
weatherRecord, severeconditions Berikut sebagian sebagai source code class WeatherForecast:
add (w€athercondition . FDRIzzLE) ,
fleatherRecord. sewereconditions . public class lleatholForecaat {

add (vleathercondi Lion . ICEPALIETS)


' privale Str:ing date;
weatheiRecord. sewereconditions '
add (weathercondition. HsNow) ;
' privaEe int hiqh'
iieatherRecord. severeconditions
add(weathercondition.lsHo[ERs);privateintfo'; private Wealhercondition condition;
WeatherRecord. severeconditions -
add (weatherCondition . t
PATCIIYESNoE)
'
weatherRecord ' severeconditions
public Strinq getDateo {

add(neathercondition.l,RAlN-TBuNDER);returnthisdate;
WeatherRecord - severeconditions '
)

add (fleathercondition '


RSNOW-tIIUNDER) ;
severeconditions. pubtic void setDate (strinq date) {
EeatherRecord -
; this_date = date'
add (weathercondition. HBAIN-TIIUNDEB)

public int gerEigh O {


public lieatherRecord (boofean overridesevere) { retu.n this.high;
this ' owerridesewere = overridesevere; )

this. forecasts = nee tleatherEorecast [1];


l [r:i::ffi:1'""1':fl:":3$.,"111i"1h?"-:ElTf::Hii#:,::;,T;;:
yanS berbeda sehingga datadata /orecast dan weather tidak akan tercamprr..
public neatherBecord() {
this (false) ;
)

f]cmroilraman Smart l,hone Menlillurrak;rrr


1il)K Arrrlrorrl rl,rtr ll,tr kttt1l Attrlrortl tlAtl 9 Apilkasi RSS Itterl 337
336
Service dan BroadcastReceiver RSSCuaca lrnport com. contoh. rss . cuaca. data . RSSDat.abases .

'1. Sebagai package terakhir yang akan dibuat dalam project RSSCuaca SavedLocat ion,.
yaitu com. contoh. rss . cuaca . service, digunakan sebagai
fungsi Se rv j- ce dan Broadc a s tRe ce ive r. Berikut ditunj ukkan import j ava . j-o. IOException,-
sejumlah class yang harus dibuat dalam package ini:
java, lmport java.util.List;
a. Public class RSSWorIdWeatherAlert. class ini
lmport java.util_. Timer;
berfungsi sebagai service a/ert seperti yang telah dijelaskan pada
sub-bab Komponen Aplikasi-Service. Berikut adalah source code i-mport j ava. util " Tj-merTask;
class tersebut:

public class RSSWorldWeatherA1ert extends Service {


package com. contoh. rss . cuaca . service,'
private static final String CLASSTAG :
import android. app. Notificatlon; RSSWorl-dWeatherAlert. class. getsimpleName ( ) ;
import android. app. NotificatlonManager; private static final String LOC : ..LOC,,;
import android. app . Pendinglntent; private static final Strinq Zlp : ,,ZIp,,;
import android. app. Service; private staLlc final long ALERT eUIET pERIOD :
import android. content.Context; 10000;
import androi-d. content. Intent; private static final J-ong ALERT POLL INTERVAL :
import android. location . Address; 60000;
import andro j-d. location. Geocoder,' / / beberapa class Activity berjalan dal_am proses
import android. location. Locationl,istener,' yang sama untuk kemudahan perolehan posisi lokasi
import android. location. LocatlonManager,' perangkat, tanpa mengaktifkan ulang secara fokal
import android.net.Uri; LocationManager dan provider
import android. os . Bundl-e;
import android. os. Handler; public static String devicelocation : ..jakarta,,;
import android. os. IBinder;
import android. os.Message; private Tj_mer timer;
import andro j-d. util . Log; private RSSDatabases dblokasi;
private NotificationManager nm;
i-mport com. contoh. rss. cuaca.Constant;
import com. contoh. rss. cuaca.R;
import com. contoh. rss. cuaca. data. RSSDatabases ; private TimerTask task : new TimerTask O {
import com. ccntoh . rss . cuaca . data . WeatherRecord;
import com. contoh. rss. cuaca " data "WorldWeat-herFetcher; GOverride

338 -Pemrograman Smart Phone Mottlilittrt,tk.rtr lil )K Arrrlrotrl rl,rrr ll,rr ktttli Attrlrorrl ltAlt() Alrllkl,,r lllili I r,r.rl 339
pubfic void run ( ) { Lastalert : System.. currentTimeM,i. ll is i ) ;
/ / baca lokasi spesifl.k perangkat lbinkac i .
List<Savedlocation> locaLions : dblokasi. upciate ( cievi ceAlertEr-rabledloc ) ;
get-AllAlertEnabIed ( ) ; sendNol, rfica ti on ( RSSWorldWea t-hr:
for (Savedlocation loc : locat.ions) { rA1ert ",.ievr.ceLocation, ;:ecord) ;
WeatherRecord record : l-oadRecord(l-oc. l
loc);
if (record. isSevere O )
1

{
j-f ( (Ioc. lastalert + ]
j
RSSWorl-dWeatherAlert.ALERT_QUIET_PERIOD) < System.
currentTimeMil-1is O ) {
Ioc.lastalert : System. privat-e Ilandier hanciler : new ttandler O {

currentTimeMillis O; G Ove:: r: icie


dblokasi. update (loc) ; public void hancrleMessage (Message msg) {
sendNotification ( l-oc . 1oc, notifvFromHandler ( (String) msg.get.Data O .
record) get (RSSWorfdWeatherAiert. LOC) , (Strj-ng) msg. getData ( ) .
;
get (
RSSWorfdWeatherAlert. ZIp) ) ;
]
i
t.

// kumpulkan data lokasi perangkat / nilai default update lokasi minTime setiap
I 15
Savedlocation deviceAlertEnabledloc : menlt dan mlnDistance seti-ap 500 meter.
dblokasi. get (RSSDaLabases. DEVICE ALERT ENABLED / / variabel update yang terlal-u rendah akan
LOCATIONS); membutuhkan resource besar
if (deviceAlertEnabledloc l: nu]I) {
/ / LihaL dokumentasi pada JavaDoc LocationManager
Weat.herRecord record : GOverride
loadRecord ( RSSWorldWeatherA.l-ert . deviceLocat 1on ) ; public void onCreate O i
if (record. isSevere O ) { this.db],okasi : new RSSDatabases (thj-s),.
if
(deviceAlertEnabl-ed],oc.
( this. timer : new Timer O ;
lastalert + RssWorldWeatherAlert.ALERT QUIET PERIOD) this . timer. schedule (this . task, 5000,
RS SWo r l- dWe a t.he rAl e rt . ALERT_POLL_ I NTERVAL
Sys Lem );
.currentTimeMiltisO ) {
thls.nm : (NotificationManager)
deviceAlertEnabledLoc . getSystemService (Context. NOTIFICATION SERVICE),-

Pemrograman Smart Phone Mcnggutt,th,rtt lil)K Arrrlrorrl rl,rrr ll;rr:ktttt,Atrrlroid


l3Alt 9 Alrltk,r',r l(i,1, I r,r.rl
u'l
340
) + RSSworldWearherAf ert . CLASSTAG
parsj-ng address +"
GOverride for geocode ZIP - country.,, + a.getCountryCodeO + r.
public void onStart(Intent intent, int startld) {
locality: "
super. onstart (intent, startld) ;
+ a. getlocality O + ..

postalCodei" + a.getpostalCode O ) ;
Log.v(Constant.LOGTAG. \\ \ +
* if (a.getpostalCodeO !:
RSSWorldWeatherAlert.CLASSTAG + onStarL"); nu11) i
RS SWorl dWeatherAl-ert .
LocationManager locMgr = (LocationManager) devicelocation : addresses.get (0) .getpostafCode O,"
getSystemse rvice ( Context . LOCATION-SERVI CE ),'
' v (constant ' LoGTAG'
fi"na1 Geocoder geocoder : new Geocoder(this); \\ \\ + RSSWorldrrreatherAf ert. cLASs;og
+ .. updating
Locationlistener loc],istener : new
devicelocatlonZlp to .. + RSSWorl- dWeathe rAlert .
LocationT-istener O { devi-cel,ocation);
break;
public void onlocationChanged (android'
)
locat j-on. Location loc) {
)
Log rr \1 +
Log. v (Constant . LOGTAG,
. v (Constant . LOGTAG, " 't t RS SWorl-dWeatherAle rt. . CLAS STAG
RSSWorldWeatherAIert . CLASSTAG + .. after parslng all
locationProvider geocode addresses devicelocationZfp : .'
LOCATION CHANGED 1atltong - " + loc.getlatitudeo
+ RssworldWeatherAIert.
devicel,ocation) ;
+ l-oc. getlongitude O ) ,'
) eJ-se {
double lati : loc.getlatiLudeO ; Log. v (Constant . LOGTAG, \\ \\ +
double longi : loc.getlongitudeO; RSSWorIdWeatherAIert . CLASSTAG
try { + .. NOT updating
List<Address> addresses : devicelocationzlP/ geocode addresses NULL,,),.
geocoder.getFroml,ocaLion (1ati, longi, 5) ;
)
if (addresses !: nu11) { ) catch (IOExceptlon e) {
for (Address a : addresses) { Log. e (Constant. LOGTAG, \\ \\
Log. w (ConsLant - LOGTAG,
\\ \\ +
RSSWorl-dWeatherAlert . CLASSTAG, e ) ;

342 Pemrograman smart Phone Merrggun;rk,rrr lil)K Arrrlro|(l tl,rrr ll;rr:krn11 Anrlroitl BA[] 9 Aphk;r,r ltliii I r,r,rl
343
RSSWcrldWeal-herAIert.CLASSTAG+" IocationProvider -
" + locProvider);
]
if (locProvider !: nufl) {
locMgr . requestLocationUpdates ( locProvider,
public void onProviderDisabl-ed(String s) {

\\ \\ + 15000, 500, Ioclistener)


Log. r' (Constant ' LOGTAG'
,'

locationProvider ) else
RSSWorldWeatherAlert'CLASSTAG + "
{
Log. e (Constant . LOGTAG, T
DISABLED _.. + S);
RSSWorl-dWeatherAfert.CLASSTAG + " NO LOCATION
)

public void onProvj-derEnabled(String s) t PROVIDER AVAILABLE,, ) ;


1\ \\ I
)
Log . v (Constant. LOGTAG,
RSSWorldWeatherAl-ert'CLASSTAG + "
locationProvider )

ENABLED -.. N U),'


GOverrlde
)
s, int public void onDestroy O {
Public vcid onstatuschanged(String super. onDestroy O ,'
i, Bundle b) {
this. dblokasi. cleanup ( ) ;
Log
. v (const ant - l,oGTAG, )

RSSWorl-dWeat-herAIert'CLASSTAG
+" l-ocationProvider
.. GOverrlde
STATUS CHANGE -
+ s); public lBinder onBind(Intent intent) {

return nuII;
)
];
privat.e WeatherRecord loadRecord(String
/ nilai default update fokasi minTime setiap
1oc)
/
final WorldWeatherFetcher wwh : new
15 rnenit dan minDisLance setiap 500 meter ' WorldWeatherFetcher (loc, true),'
/ / vartabel update yang terlalu
rendah akan
return wwh.getWeather O ;
membutuhkan resource besar
)
/ / l1hat dokumentasi pada JavaDoc
LocationManager private void sendNotification (String loc,
String locProvj-der : focMgr ' WeatherRecord record) {
TERIA'
getBe stProvide r ( Provide rHe lper' PROVI
DER-CRI
Message message = Message. obtain ( ) ;
true); rr 1\ Bundle bundle : new Bundle ( ) ;
Log . v (Constant ' LOGTAG'
*

llAlJ 9 Altltk;r',r l{1,1, I lr,rl 345


344 PcntrogranranStttarlPttrrttrlMt'tt1111ttrr.th,rrt.il}Kn||(||(,|(|rl.rrrll.rt,krngAlldrotrl
bundle . putStr rng (RSSWor ldWeatherAlert . Z f P,
loc); val : 0;
]
bundle . putString (RS SWorIdWeathe rAIert . LOC,
efse 1f (Lext. equals (*1.) ) {
record.getlocationO /"+ ", " * record.getRegionO*,/);
message. setData (bundle)
val : 1;
,.
)
this . handler. sendMes sage (mes sagre ) ;
else rf (text.eqr:a1s ("1,,)) {
]
vai : i;
l
I
private void notifyFromHandler (String locatlon,
eise if (text.eqr-:a_Is (.2-) ) {
String.Ioc) {
vdl :
Urr uri : Ur-r.parse("cuaca : / /com.contoh.rss/ -,.
]
loc?acidr:" + Loc) ;
eise if (text.. equals (.3.)
Intent intent : new Intent (Intent.ACTION V]EW, ) {

uri ) ,' val : 3;


)
Pendinglntent pendinglntent = Pendingfntent.
e-lse if (r:ext.equals(*4.)
getActivity(this, Intent"FLAG ACTIVITY NEW TASK/ ) {
val : 4;
intenc,
I
Pendinglntent . FLAG_ONE_SHOT ) ;
e.ise if (text.equals (*5.)
finaL Notificat-lon n : new Notlfication (R. ) {
.;ai : 5;
Crawabf e. icon._alert, "A1ert RSS Cuaca", System
]
. currentTlmeMil-1is O ) ;
e,Ise if (text. equals (.6-) ) i
n.setlatestEventlnfo (this, "Alert RSS Cuaca",
va] : 6;
l-ocation, pendinglntent) ;
)

e.lse if (text-.eguals (^-t,) ) {


this. nm. notify (convertToNum (1oc) , n) ; / vdl_ = l;
)
l
eise if ( LexL. equals (,,8-) ) i
private int convertToNum(final- String s) {
va1 = B;
String text : null; I
Integer vai = nulL,'
else if (text.equals (*9-) ) i
if (s. lenqth ( ) >5) i
va1 : 9,.
lext = s.substrlng(5,6) ;
I
if (text.equafs ('0") ) i else if {text. eguaIsf ..:noreCase (,.a,,) )

346 ['t'tttrolir;tttt;ttt Sittt,rtl l'ltotrl Mlttlilitttr,rk,rtr ,lrlt Atllt,,r,i,l,rrr ll.rr krrrll Arrrirorri
aAl
va1 - l.B,'

vat : 10; i
else if (text. equalslgnoreCase (*j ") )
)

else if (text.equal-slgnoreCase ('b") )

val = 19;
val : 11; )

else if (text. equalslgnorecase (*k") )


]
else if (Lext.equatslgnorecase ("c") )
vai : 2A;
vaL : 12; ]
e-ise rf (text.equal-slgnoreCase (*1") )
)
else if (text.equalslgnoreCase (*d") )
:
va]- 2L;
val : 13; i
else if (text.equalslgnorecase ("m") )
)
else if (text-equalslgnorecase ("e") )

val = 22;
va1 : 14; l
else if (text. equalslEnoreCase ("n") )
]
else if (text-equalslgnorecase(*f") )

va)- : 23;
val : 15; ]
.l else if (text.equal-slgnorecase ("o") )

else if (text.equalslgnoreCase ("g") ) {

vai : 24;
val : 16; )

,l €lse if (text. equalsfgnoreCase ("p") )

else if (Lext-equalslgnoreCase (*h-) ) {

vaL : 25;
var- : \7; )

else if (text " equaislgnoreCase ("q") )


)
else if (text-equalslgnoreCase (*i") )
.,taI : 26;

r|,rrr 1l,tl krrrl,Atrrhrltrl 349


348 Pernro,lr;tttt;ttt littl.ltl l,lrrrttr'Mt,tr1111tttt,th'rtt.,lrlr l\ttlltrrtrl
i
else if (text. equal-sf gnoreCase (,,2,,) )

else if (text.equalslgnoreCase ("r")


va} : 35;
_-^f _ a1
L t ,- )
vd-r -
)
else if (text.equalslgnoreCase ("s") )
return va1,.
-,^f
vdL ao.
Lo,
-

)
else if (text.equalslgnorecase('L") )
Class RSSWorl-dWeatherAl_ert merupakan alert service
yang berjalan secara standalone (mandiri) dan akan selalu aktif
val- : 29; setiap user menghidupkan perangkat Android. lntent Service
dapat pula di-shutdown secara -manual seperti yang telah
] dijelaskan pada bab 6, sub-bab Service.
else 1f (text.equalslgnoreCase ("u") )
Service dijalankan method scheduf e O setiap alert yang
dengan nilai alertenabled true tiap periode 5 detik'dai
val : 30; menjalankan method requestLocat.ionUpdateso
untuk meng-.update nama atau koordinat lokasi perangkat yang
) kkan ke L i s t <Addre s s ) dan d itam pi kan padl f ogCai.
d i masu I

else j-f (text-.equalslgnoreCase ("v") ) Setelah user membuka notify alert yang, diirnplementalikan
menggunakan method notifyFromHandf er, melalui URI
_ )1
akan menjalankan intent Activity DisplayDar-aRSS
--^r
vda - J1, .
pada loka-.i loc yang tersimpan dilarn database
RS S Databa s e s (d iiI ustrasikan pada Gamba r 9.21).
)
efse if (text. equalslgnoreCase ("w") )

I&* r,rs pn

aa AclivW Dl *F1.yS. t.RSS


VdL - JZ, -

)
dl Al€4 kSS fuica
else if (text.equalslgnoreCase ("x") ) !6 r :t &H:ta I 'l i:a 4 -:: loc?E#F' + "-?. ?'l,r,1U -39,'

4 tlart RSS (ur("a


(Xal& !nlr4
irl*B- L!{!r:rJ.i r j: :ai*I;:
--^r
Vdf )).
JJ,
-
dF Al€ft BS5 Cu.(t
i ftr8*ad!,lrr4.{rd { !I nd. l: a *4 rilr i:!:|
ttu.ra*r jS!{r1*!

else j-f (text. equalslgnorecase ("y") ) &r.ro-- i.-t.A'rr,f r, *


iiFr a:l

va1 : 34; Gambar 9.21 Alert Seruice RSSWorl dweatherAf ert yang mengaktifkan intent
Di spialtDataRSS
)

Pemrograman Srrrirrl [rlrorrr,Mr,rr1l11ilrr,rk,trrlil )h Ailrltorrlrl,rrr ll,rr krrrl:A[tlroirl 351


350
b. !r'l,trr.lirtrlva i.ruat {-;;155 baiu 'lcilgan ;'r'rr.tlii
Penerapan Event Listener pada Service
,:i:-:,,r'.,ei:tlle r:rzj Ceil.r,.CCt-',,e:. I":vr,.. '.-iass ini i,r:rl u|.g:'t
:e[;agai Broar.fc.:s.t- Recej-ver ]'ang :kan rneiih;lt saai suatu service dapat diterapkanrntent dengan melibatkan fungsi broadcast
til1-eni-ACTIoNROOTCoMPLiiTtrDleiahrliteriila sebagai receiver dari suatu event, contoh penerapan di aplikasi ini untuk
(pada .state c,njr3ca'rvli yang akan rneng;rktifkan Serr"ir:e deteksi event Intent ACTION BOOT COMPLETED (dari broadcast
iiSSWor:ldWeatherAler:t dan tnemtler.ikan keluaran sistem). Pada tabel 9.1 ditunjukkan beberapa standar Action lntent yang
pada iogCai, herikut aclalah source ccor: ierigkap unfuk r'ia:s didukung Android.
F:SSA iertSe rv r:eFleceiver:
Tabel 9.1 Br)adcast Action lntent pada Android

;:;lckage com. coni-oh. rss " c:uaca " service,- time tick sistem
,rirrpcrt- ancjr::-Lo . conr-ent . tsroadcasLReceiver; Adanya perubahan waktu sistem
r nipori ;,rnoroicl . content - Cont-ext; ACTION TIMEZONE CIIAI{GED Perubahan time zone sistem
import androici. content - Intenti roN-eoot_coMFr,ursn Saat sistem selesai boot
irnport android. util . Log; ION PACKAGE ADDED sudah terinstalasi aplikasi
irnport com. contoh . rss . cuaca - Consiant-;
Setelah aplikasi terhapus

ptibl ic class RSSAlertServiceReceiver ext-ends CTION BATTER] CHANGED Adanya perubahan level baterai

tsroadcastReceiver {
Saat charger terhubung
perangkat
private static final String CLASSTAG
Saat sistem melakukan shutdown
llsSAiertserviceReceiver. cf ass . qetsimplelrlame O ;
Penerapan event listenin gdari Broadcast tidak selalu memerlukan permission,
tetapi implementasi Action lntentACTION BOOT COMPLETEDdiperlukan
SOverride permission android. permission. R.gCrtVn eOOf COMPLETED
public void onReceive(Context Context, Int-ent intent) didefinisikan pada Manifest RSSCuaca yang telah ditunjukkan sebelumnya.
{
(intent -getAction
if O -equals (fntent'ACTION- c. Sebagai class terakhir, kita akan membuat public c/ass
BOOT_COMPLEfED) ) { ProviderHelper. java untuk fungsi pemilih provider
Log.v (Constant. LOGTAG, \\
\\ + navigasi (dapat berupa Gps_pRovrDER atau wTRELESS
pRovrDER melalui operator CSM atau hotspot Wi-fi) yang
RSSAlertServi- ceRece ive r . CLASSTAG Criteria.
didefinisikan oleh Berikut adalah source code class
+ " diterj-ma intent via BOOT, mul-ai LocationHelper:
menjalankan service ") ;
context - startservice ( new Intent ( context ' package com. contoh. rss. cuaca. service;
RSSWorldlleatherAlert . class )); import android. l-ocat j-on . Criteria;
)

) public class ProviderHelper {


I publ ic static finaf Criteria pROVIDER CRITERfA,.

'\', \ tlf,),rl,lJlr,,r IlAll () Agrhk,r',r lii,l, I r,r,rl 353


static {
PROVIDER_CRITERIA : new CriteriaO,'
ProviderHelper . PROVIDER_CRITERIA.
setAccuracy ( Criteria . NO_REQUIREMENT ),'
rry FAl* rtflubdr, b{ffi.r,

ProviderHe lper . PROVI DER_CRITERIA. E :'qr/t'


B"!.os,il.,ar*!&r
7l{,rF
qrl! uttll}lltIIs
-tE.rrl
u itt.tJ.
) tn

I Juk!MIark&r€ ht{Bl
lrdqrgE{lbd0.loffiflgl,
setAltitudeRequired ( false) ; lrlrq Llt'nt. Irdffiqt
ProviderHe lper . PROVI DER_CRITERIA . $h!r!?srt4! hilarsd
setBearingRequired ( false ) ; fi: ! I 8.. *.
rrs irlirEr,r.;' '--
er.-,&.
t*
!r i,
r{rtrr}r lrraltr }{'.tr(i*,
.-k*! r.\. rn.y{! 6
ProviderHe lper . PROVf DER_CRITERIA. erdera trDr4f lldqiu
dip4lkts 1 }li,r6;r
setCostAllowed ( false ) ;
ProviderHelper . PROVIDER_CRITERIA.
{,
AEa}rty A4$rry rlatvhy
se tPowerRequirement ( C r 1 t e r i a . NO_REQU I REMENT )
ar.pl.,Stlffi
firtrjLAuEEER'
Dr.pi,!tun!'!{"&rur ot rplryqlF lrlttrr
Provi-de rHe 1pe r . PROVf DER_CRI TERIA .
setSpeedRequired (f af se ) ,'
ry
] -ar F{itflPvHS
ll$l,*r ,*jis
l o.u.r ru

llerikut rJituniukkan diagram hubungan interaksi antara Activitv


rry { !:*
D ispl:lyDataRSil,
rr i
DispiayRSSTe::simpan, dan
.!.

D: splayMenulnputLokersi iuga interaksi service ,!,qltriliiFFfiImillrit


P.SSWor -l dWeat-herAlert pada Cambar 9.22 $ Atm tls C{er
q t.&f(elxtr. rj!ry
+ Al|.r 133 t'I.
laru **&
A IL.t lit (ui
'
I ltfr #Eeilrenfqlifri#
Gambar 9.22 Diagram interaksi antarActivity
dan seruice pada aptikasi RSSCuaca

Aplikasi RSS Feed USGS dan Apt Google


Maps
Project yang akan dibuat iarah aprikasi yang
mengimprementasi RSS Feed
dari web service dengan penambahan' iuhgsi
menggunakan class MapVi'ew), API
irt 'co,o,jiu'-Maps lyang
terseLut merupakan versi sederhana
aplikasi coogle rvaps. apt rr'rupvi",
Map di suatu aplikaii yang dibuat tunp,
,"J.p"rrraah imprementasi tool
."r"rrukan int"nicoogre Maps,
seperti pada pro ject Cek Lokas i. puneri pan pi
pengembang menambahkan anotasi
R lr'. pu i . -' r"";"r'=n gr. i, r.u n
oiiiiu,v a^n ko,iit' ,iiiJ"i'iug" p"ru
seperti zoom i n g, tagg,i ng,
.atau k ustom tuy"i i mrge yung Jirntrrrni, burupu
taver citra satetir. raver jlrur jaran raya .i", rrv"iL;;;?"";rl;';#erti
aplikasi Coogle Maps. pada

354 Ponrrollr;rrrt;rrr Sttt;rrl l'ltorrr,Mcttlillrttt,tk,trt'il)K Arultotrl rl,rtr ll,tr kttrli Atrrlrrttrl []Al] () A1rhk,r,,r l(',', I r,r,rl
355
f+plikasi RSS-USGS
Ilala RS:i irer,rrl ,lntuk apiik.lsi RSS-USCS ber:i.rnrb,:r'dari rveir s,:r',ic,- Li'i(,1,
rlari lrnk IJRL nt,tp : i / eari.lnqt-i.rke " r1"!qs . r.rr)..r,/c,altrrr:tuai<es,'
cataiogs/ (Gambar 9.241 berupa data kegenrpaan reairi,'ne berforntat
KMI (diakses menggunakan Coogle Earthi rlan X&{i 1.arrg akan cligunaxan
apiikasi RSS-USCS ini. Proses parsing data XML berbt-.da rJengan apiikasi I- i{frqcg fivt 0ebrr.tq t0 sbrtr tD faddi
R.SSCuaca (parser SAX) meiainkan akan diteraokan oleh Darsei' L)CM var:g
implementasinya lebih daripada dari SAX menggunakan pustaka parser dari
package j avax . xml- . parsers dan package orq. w3c . dom.

Lalest Earthquakes. Feeds & Data USGS m2.5+ Errthq{akeg


Flit:.(!r:"Ji1:.:14dB8&:1jllllr9tlu$l;sE6rda!rtiera.rdtrtr!rir]:3r,n:et*a *v{ti*..$dJar:lit!
&6f iir., el lJd Ce rnr-liqurt t **,'!r tt tr lss llrr
lJnrrr$! d:r$: i tr i-xi.d r.:. r q{d raE d cdp* i*J* *. i'!,J:nX 3i lc,titlGj$glq
Elr I.,*A."* j,2'!.r?.1 ,15n r&44ds.b,Ctirredr rt$tti6Y.s1,;'ksii!/J,:'4e" i!trnfAll':6

Ihur&Iry ]$!trr i1. lt:l :trt6jf,! iltt:


ecagb E*d! Xt L l*o rnd Fl i Frdr id:t, Enery t{ trlt ilr}6.& &{ r Flrantni
Fl:t"dIie.rctll*!tncsttrbgrgi4ilsQeCi fd*is:,:*ffi6.:rrt 5:rt* q.i.d. #d.d-t oqrdr, 11.4, hI[i7.7r a1'
f,*Iiiroqtrlsrwg<nl.l I:tadil.*I,+{let {tffi dre{€trt:lri&Jiidatill*3*iiiriiS lllet
.rn r;*r ialn.:src hva i6l} ,l*l5n (M n n {id,tle ,tuEta '
tlrn LfllBrvri dci&!rr iffiar thcl*
E .nskrq-ae . tl 2 5* mrijqmir: !€51 da! g
i,sltai Fn_s?l 67 II1llr;als.tEr
El u-l lr,qtBEr5.rss.LsuElEsF- g.pqpspJ
Uflirrd Fi Jr 11 t, -.'" :5,Jr. il'{ f8l H 25+ oa'lhqJale6 p6{ 7 (krr ifit t(I.L f tr rlLkhtrdr, lirc Crcdurir
ll lrw, ilrl l-?
t815.d al J0 ?t ti rl ?'! ar; r J]? k-il
E! rit.l*nksks paql 7 dar trffi br dEtni rtruadr ,.1Jrrr :1, 201: lr.5;!! .,If
l t, :7 ie afc {Uler
LIB:ttd, Fr .lF , U 5+ e.rtElrak€s, pas 7 daF M tuoay,.ln*t tt. 20Jl o];St,ltr 41. t: eq{{it.r
M.*{ '{ Ja, :l (I.11 {{ Ulc !2q rEr OGpl* tn.r, t n ti.o5 E:
clYf{lt Eartho.ratB SlbRlr.repslm
**' h *''{ rr ft lr''r r'i
:i;}:rx:'ff *H-#i[T1iff]" "

Gambar 9.24 Data kegempaan dari neb service ISGS


Gambar 9.23 Website USGS nenyediakan berbagaitipe data kegempaan (Sumber: http:// (http //ea nhq ua ke. usgs. gou/earthq u a kes/cata lag s/t (tray M2. S.
xm g
earthquake.usgs.gov)

Aplikasi RSS-USCS ini merupakan hasil modifikasi dari source code buku Untuk dapat membaca data XML gunakan browser Firefox
"Professional Android Application Development, 2nd Edition" ditulis -+Page Source. Berikut adalah sebagian isi
buka Menu \,,ie't,
oleh Meier R, di mana data kegempaan berformat XML diperoleh dari data dari file iJa;-ni . 5 . xml:
hasil me-reguest pada URL: htt-p : / / earLhquake . usqs . qav / <entry>
earthquakes/cataloqs/1day-M2 .5. xml (Cambar 9.24) yang <j-d)ur:n: earthquake-usgs_gov:
menampilkan halaman web informasi gempa di seluruh dunia yang teriadi us : c00012gf </ ad>
dalam satu hari dengan magnitudo terrendalr sebesar 2,5. <title>M 5.3, Loyalty fsl_ands, New Caledonia</
titl-e>
<updated>2 011 - 01 - 1 3T1 7 : 2 6 : O 62< / upd.ated>
<1ink re_I:,,alternate,, type:,,text/html-
href:"http : / / earthguake. usgs . gov /
earthquakes/recenteqsww,/euakes/usc00 Ol2gf .php,,
/>
<summary type:,,html,,)

356 )r.1111111,1
1111,1tt'irtt,trl I'ltottl lVlt'tt1'1itttt,rl,,ttt ,\rrrltrrtrl,l 1;1 ll,sr l,;q11'/\r1,l1,rtrl IlAll (t Atrlrk,r,,r li',', I r.r.rt
"ltfr 357
<I ICDA'IA [<img s ::c:"htt_p : / i' eal:t-nquake . Lr..t.r s {l'rri d.il; xM[- iersebut akan cliekstraksi sebagian crata srrirrli rrr rr.rl,,,rr r,,
j i l.:) {r,pdat_e,l), ( ij.nk>, dan (qec:ss:
gov/im.rgesu/globes,/*20 170 . )pg" .^1-
poirrl ) y.rrrli ilr,r ir,,
,1,1.'i1,?.-iip lor<as,i Bempa <Ji daiam tag <eltry>. Saat aplik.rl,r
I oB.4 3ot # 116; E" ali qn:"1eiL" hspace:"?O" ,'I (i-'-'f hu I :-;irn). ,,u.,,,,,,,, ,

'lata X'vlL dari web service u.s.gs . grov tidak difieriukan A,rrr k.y r.rrr.rr.r , r.rr
January 13, 2017 7'/:26:,06 U'IC<br>Friclay, january !4,
r
.:{,r/L atau KML dapat diperoleh graiis tanpa melalui proses
2077 O4 25;06 AM at epicenter<,/p><p><strong>Depth</ ^.g,rt,.,.,
Seperti proiect-project. sebelumnya, berikut akan ditamprrk.ur l.urpr,rrr
strong> : 72 - 40 km (7 .17 mi) </P>l I > pembuatan oroject apl ikasi RSS-USbS:
( / summary) 1. Buat project baru Android dengan nama RSIUSCS dr..prr,,r i.,r
<georss :point>-20 - 61 26 168 " 4351</ georss :Point> sebagai berikut:
. Nama project : RSS-USCS
<georss : elev)-12 400</ qeorss : elev>
. Application Name : RSS-USGS
<category labe1:"Age" term:"Past day" /> . Package name : com.contoh.rssusgs
</entrY> . Create Activity : RSSUSCS
<entry> . SDK :3
(id)urn: earthquake-usgs-gov: us : c00012 f4</ id> .
Build Target AVD : Minimal Coogle Apt t.f,
<title>M 5.2, Loyalty Islands, New Caledonia<,/ Pada aplikasi ini hanya digunakan AVD Android disebabk.rrr
rrrr.r!
title> mengimplementasikan
.Apr coogre Maps (berupa tamlrir.rrr pr.r.r)
Meskipun demikian, akan digunakan Broadcast It:t.r,rv,.r
<updated>2011-01-13T1 6 : 51 ; 292< /updated>
sebagai penerima broadcasi lokasi user menggunak.rrr r
<link re1:"alLernate" type:"text/ht-m1" LocationManager dan diterapkannya providE NI.:,t,w()l(K
1.r.,.,

href :-htLp: / /ear t.hquake.usgs.qov/ PROVIDER untuk memperoleh koordinat lokaii user.
earthquakes/recenteqsww,/Quakes/usc00 072f4 .php" / > 2. selanjutnya, modifikasikan file manifest Androidlvlani f <.r;r
. xrrr r

aplikasi RSS-USCS menjadi sepertidi bawah ini:


<summary tYPe:"ht-ml">
<! [CDATA[<img src:"http :/ / earLhquake. usgs . 01 <?xmf version:,,7 -0,, encoding:,,ut-f _8,,?>
govl images / globes / - 20 _11
)pg" aIL:"20.4'74&#176;S
O . 02 <manlfest xmlns:android:,,htl-p:,/,/schemas-an<jroi<1.
168. 484 a#L't 6;E" a11gn:"7efL" hspace:"20" /><p>Thursday, com / apk / re s /andro id,,
January 13, 20Il L6:51229 UTC<br>Frlday, January 74, 03 package:"com. contoh . rssusgs,,
2O7l O3:5'7:29 AM at epicenter</p><p><strong>Depth<,/ 04 androi d : vers ionC ode:', 1,,
strong>: 10.70 km (6-65 mi)</P>l l> 05 android: versionName:,,1 - 0,,>
</summarY> 06 <app1i-cati-on android:icon:,,@drawable/
<georss :point>-2 0 . 47 43 168 . 4841</georss :point> icon" andro id : theme:,, Gandroid : style/Theme -
<georss : efev>-107O0</ geor ss : elev) Light" android : labef :,,@ string/app name,,
<category label:"Age" term:"Past day" /) android : debuggabf e:,,true,, )
</entrY> 01 <activity android: name:,, . RSSUSGS-
08 android : labe1:,,G string,/app name,,>
09 <intent-fil- ter>

()
358 Pemrograman smart Phonr_'Mgnggurr;rk,rrr lil)K Ar1fulrrl rl,rrr ll,rlkrrrliArrtlr6irl 8Al3 Aphh,r,,r l{1,1, I r,r,rl
359
10 <action android:name:"android.intent' "\jrri.,lrr,,_,:trilr air){"irr iil l-?-l ,ir, L*l iJ
action.MAIN" /> ;A,
- : _:.-._,,":. --:
11 <category android:name:"android' ,. .

- r' i i :. 1*'rr: Fr''ia:


intent. categorY. LAUNCHER" ,/> ,,}1.i
lc r:'rer i.s. i,*r. l.lii:l,t a{atron]
i:1if ^

t2 intent-filter>
</
" "-4" : C''':t-t.:a:f;"'!.:::f iC-ER
13 </activitY> B .fte&ens i3,ctr*iyi
1_4 <activi-ty android: label:"Preferensi RSS USGS" LE .og'nce*E}a (Acfvrry;
15 androi-d: name:" . Preferensi" / > ffi , rra*lUe.Curgo (,orovder)
I €:mm"go*,*'r*s**fiaps (ttesthr.ry)
16 <acLivity android:fabel:"Peta Gempa - USGS"
android: name:" . PetaGemPa" / ) Gambar 9.25 ManifestAplikasi RSS-USGS pada menu disptayApplicalim

t1 (provider android: name:" . ProviderGempa"


andro-id: auttroritles:"com. contoh. rssuslls . provider" /) 3. setelah kita memodifikasi file Manifest selanjutnya ubah fire rayour
main . xml sebagai Ul untuk Main Launcher aplikasi RSIUSGS dan
1B <uses-library android:name:"com.googIe. penambahan ListView earthquakeListView, menjadi seperti
android.maps" /) ini:
L9 </application>
20 <uses-permission android:name:"android-permission' 01 <?xml version:"1 . 0" encoding:,,rr11-8,,?>
INTERNET" /> 02 <Llnearlayout xmlns : android:,,http : ,//schemas - android-
21 < /manifest> com/ apk/ res/android"
Baris ke-7 hingga ke-.16, dar"i file Manifest tampak RSS-USCS 03 android:layout_width:-fil_l_parent,,
menggunakan sejumiah Activity yang memiliki fungsi berbeda-beda, 04 androj-d:layout height:,,fi11 parent,,
rJiantaranya Activity RSSUSGS sebagai Activity MAIN LAUNCHER,
Activity Preferensi sebagai Activity PreferenceActivity
untuk tampilan rnenu preferensi aplikasi dan Activity PetaGempa 06 <ListView
sebagai llapActivity untuk display tile image peta yang 01 android: 1d:" G +id/listViewDataGempa,,
mengimplementasikan API MaP.
0B android:layout_width:"fill_parent,,
09 ;,Lndroid: lavout height:,,wrap content,,
Di baris ke-17 terlihat diterapkannya provider ProviderGempa
sebagai Cont-entProvider yang menyediakan fungsi database 10 />
aplikasi berbasis SQLite dan menyediakan update database melalui -l 1 ., i'L;-nearLayout>'
Unt. Sedangkan pada baris ke-18 ditunjukkan dideklarasikan pustaka
Google Maps untuk memenuhi syarat agar dapat diimplementasikan
fungii Ret Map sepefti contoh CariLokasi. Permission yang ditun.lukkan 1i stViE-.w pada layout main . xml dengan string resource
pada baris ke-20 menunjukkan aplikasi ini hanya. membutuhkan iistViev,rDataGenpa menggunakan sumber data dari arrav
koneksi internet untuk akses ke web service USGS dan API Coogle ArrayAdapter Calam database DataGempa, dir.naksudkan agar
Maps. Pada Gambar 9.25 ditunjukkan konfigurasi manifest untuk ditarnpilkan data gernpa seteiah user mernbuka aplikasi Rss-uses
model display application. yang ilitampilkan dalam bentuk drop down spinner L-is-:1/re..ri.

PcmrOIir;rrr;rrr !irrrlrl l'lto1o Mot.tyiyltttt,rk,rtt',1)K Atrrltnrrl rl,rll ll,rlkrrlli Attrirtrrrl liAll'l Agrhh,r'.r li',', L,.il ]61
360
t_ring>
Selanjutnya modifikasikan file string resource strings..xml
yang <./ s
4.
i["n diimplementasikan pada Ul aplikasi diantaran.ya, title aplikasi, <strlng name:"menu Peta gemPa")
titte menr, title Map view, uRL feed, berikut ditunjukkan source code Peta Gempa
file strings. xml:
< / string>
<?xml- version="1. 0" encoding:",L5-8"?> </resources>
<resources>
<string name:"app-n36e")RSS-USGS</ string> 5. Tahap berikutnya akan dibuat file XML baru sebagai resource preferensi
<string name:"quake-f eed") UI, untuk membuat file XML tersebut buka menu New Android XML
/ File dan klik button Preference (Cambar 9.26) menggunakan nama
ht.tp : / / earthquake ' usgs'gov'/eqcenter file menupreferensi.xml yang secara otomatis file tersebut
catalogs/ ldaY-M2 . 5 . xm] tersimpan di direktori / res / xm:-.
</string>
NwAtrdroad )CaL Flle & "
<string name:/'quake-host") iureamaadrcid*rlrrrc. *TTil-
U5U5
'fif
tr ing>
<,/ s Pro*rt l!9-USC1

Fri*
<string name:" sou r ce" > runuprcistnlr,rml

*rlrt rrpr o, rqo!.(e rculd yw hkc 10 s€1.;


Sumber
lr_i g{n v*us Msu
</string> t grrfcrcnca 5.ir.h.blt Animrtico

<string name:"menu-uPdate") ',iil3i : .p E rt rarc!ra1 166fr9ur*lao !@1, )e l lel :',;"11,+.


-ry
Refresh Data ' ..,lrL'a iu.i'tr.4 Chc:rn iu3lrr.!5

#licrrtrr L-cct
</string> EfJ iiet.cr{ Cr,{t

<string name:"diaIog-title"> I;klcr


:i t r.'ir

rar $..1
)1;

Waktu Kejadian
3rir{l lhr rmt dtmsi tcr l}!t Xhlt fik;
</ string> Prdqsr:Scm
<string name:"auto-update-prompt">
Otomatis UPdate?
</ string>
<string name:"update-f req-prompt ")
$ i-ilrc.]
Gambar 9.26 Pembuatan layoul preference pada menu NewAndroid XMI I th'
Periode Update
</ string> Berikut adalah kode lengkap dari layout menupref cr('rr:; i ' xtrt I

<s t ring name:"mi-n-quake-mag-prompt " ) <?xml version:"1. 0" encodlng:"stf-8"?>


DisPlaY Magnitudo Terendah (PreferenceScreen
< string>
/ .xmlns :android:"http: //schemas. andro i rl. r'trn/'tl'l /
<string name:"menu-Pre f erences ") res,/andro id">
Preferen s i

Pemroflrarnan strrarl Plt0rr0 M|rrl]lirrrr,rk,ttt iil )l( AlIlr,,rrlrl,rttIl,tr


l,rr ]/\tttlttttri l'lAllt) Aplk,r',r ll'," I t'r'rl :llr I
362
<CheckBoxPreference
fi.iri rjc:..tin i;r'rr,rt tr,:rsr.Lrirt lantl;,ir.:r-j unti"ri: ttenLt ilcm terlcl.rl
android : keY: " PP"t-AUTo-UPDATE " iji rl.iiam iag Pr:e:erenceScr,-t=t_r. dan nrenu chcck-box y,rn11
android : title:"Otomatis Ref resh" Ljirjefinis.ikan iaian: tag Cneciilio:,:F,: i._-:er-ence juga .nenu spirrrr,.r
androi-d : textColor:" #0000 0 0 " ler(la{lat cicl,.rtinisikan p.:da tag i._....:ip::eieiEi.ce_ h4enu spirutr,r
iersehrtt ,ikar',r ieriihai 5aat user tren{appi,lg menu L i s | ?:e f e re rr r .,
androi-d: suffiIlldty:'/Beri-kan centang untuk .

i,'erbentuk dialog, irox yarng nilai spinnern'a diciefinisii<an pada file arr.ry
update oLomatis" ':irinll .r.t:'.ii/s,- -:iml (akan dijelaskan pada rahap seianiutnya). lr.rrl.r
android : de f aultValue:"true " i.ianlbar !i.27 ciitr;njukkan rnenu preferensi aprrkasi RS5-USCS y.r.1i
herjalan pad:r AVD.
/>
<ListPreference
android: key: "PREF UPDATE FREQ,,
android : title:" Periode Autorefresh" Cl-nmatis Re{re,sh
android : textColor:"# 0 0 0 00 0 "
android:summary:"NiIai besaran waktu untuk Periode Autorefresh
aulorefresh data RSS" ,S&.

an dro i d : entries: " G a r ra y / update-freq-


options" Magrlitud* Minrmal
,&,
android : entryValues:" array,/update-frea G

values"
android : dialogTitle:"Periode Ref resh"
androi-d: def aultValue:" 60"
l>
<ListPreference
Gambar 9.27 Menu Prefereni aplikas RSS-USGS
android : keY:" PPgF-MIN-MAG"
android: title:"Magni-tudo Minimal"
android: textColor:"#000000" 6. Tahap selanjutnya akan dibuat file string resource array dengan cara
memilih menu radio button Values pada window New Andiid XML
androld:suftftdry://Nilai magnitudo terendah File dengan nama file arrays - xm] secara otomatis fire tersenbut
yang akan dit.ampi-1kan pada dlsplay" akan tersimpan di direktori / res /walues (Cambar 9.2g).
a n d r o i d : en tr i e s :,, a r r a y / rtagni tude_op ti on s "
@

android : entryValues:" array/magnitude" G

android : dialogTit Ie="Magnitudo"


android : def aultValue:" 3 "
/>
< / Pre ferenceScreen>

I l,\l ,\trlrl, r. l,'


364 Pemrograman Sntarl Plrrtrtr,Mr,rr;ilirrrr,rk,rrr Ll )h Arrrlrrrrrlrl,rrrll,rr krrr1l Atttlrlttl
llar Ar*oid )Olt File & <item>5</ it.em>
LrirG r ruArd'edlrtl,'t IIT.$
T? <item>6</1tem>
FBtm sl UtCt
<item>7</i-tem>
Um.rl <item>8<,/ item>
ia.
Tr|rli F dffi ! wH lP 6tfr' Po tt! </stri ng-array>
{rlrycd V*E ::::ita
l'1 Prdstr! a 566.Ur
C
I Arlr'tioo
(l--string untuk menu spinner di UI-->
"r

tft't tt slw1 -"69IA::1ld{" ll*! <string-array name:"maginitude opt j-ons ">


, &rdrbtr**fm ict*qr.*- <item>3<,/item>
,i:
rEContrr(clt li
I

Elxa*o* cpar il <1tem>5<,/item>


$trngugc
dtcEir
r"- i
<i- tem> 6<,/ item>
::'.:-'
'_- t-
:Pi-::.
Ertis ,clrrlue
:,.-.-: :: <it.em>7</ item>
**:::*""f4th.r$nruc <i tem>8</item>
<,/ s tring-
array>
<string-array name:"update_f reg_values ">
<i-tem> 1<,/ item>
'.i..,
o
-'irs--J: Lx*
<item>5<,/ item>
I

<item> 10<,/ item>


Gambarg'2SPembuatanfileresourcearraypadamenuNeWAndroidXMLFile
<1tem>15<,/ item>
<item>60<,/item>
Fiie arrays . xml trerfungsi sefiagai array strin8.. reso,urce yang </strlng-array>
dig;";[; rntrt Iiyout prererenCeScreen. Berikut ditunjukkan
file arrays ' xm-l:
isi string resource (/resources)
<?xml version-"1 . 0" encoding="t.r11-8"?>
Dari file ar.rays " xml- tampak dua array string yang akan digunakan
.<resou i:ces> untuk satu menu spinner Periode Refresh, yaitu array update
<l--string unLuk menu spinner di UI--> freg options sebagai nilai entries yang akan terlihat pada
<string-array name:"update-f req-options " > spinner Periode Refresh dalam layout menupreferensi (Cambar
9.30a) dan array update_freq_vaLues sebagai value dari tiap
<item>SetiaP Menit</ item> menu spinner tersebut (ditentukan pada tag entryValues, file
<item>5 Menit</item> menupre f e ren s i . xml). Pemisahan tersebut tidak hanya ditujukan
agar nilai yang tampak di menu spinner lebih mudah dipahami user,
<i-tem>1 0 Menit<,/ item>
tetapi karena satu array string resource hanya dapat dilakukan untuk
<item>15 Menit</item> sekali inrplementasi, baik pada kode aplikasi atau pada layout (seperti
<iLem>TlaP Jam<,/item> pada string array magnitude dan magnitude_options).
</ s tring-arraY> Sebagai ilustrasi fungsi file arrays . xml- dalam layout preferensi
<str ing-arraY name:"63gqilgde: "> menupreferensi.xml pada Cambar 9.29 ditunjukkan menu
spinner dari aplikasi RSS-USCS yang berjalan pada perangkat Android
< item>3<,/ item.> at.trr ImLrlator AVD.

366 Pernrollrailtan Siltarl I)lt0rt0 Mr,rrli;1iltt,tk,rlr Atrrltrrtrl rl,rll I l,l{ klllll /\rl(lrol(l liA[] () Aphk,r',t lili', I lrrl .Jb/
"l)K
11 and::oid:clickable:"Lrue"
72 android:api-Key:"0mlMpt8b4uHprcHlHlfQR2CB7ARHn9N9
GPk%Uw" />
i{ 3 &
5 f+!en 'i.'i.,'r'
13 <,/Linearlayout>
10 l,tertit i..j., : {-.rr
B. Sebagai layout XML yang terakhir dibuat, buatlah file layout XML
baru yang disimpan pada direktori /res/Layout dengan nama
6 file rincian _gempa. xml. File ini berfungsi sebagai resource
Ul untuk dispTay dengan tipe Layout Layoutlnfliter yang
't diimplementasikan pada host class RSSUSGS . j ava, berikut adalah
iiep larrr iS,,'
source code file layout rincian gempa:
1 **.'
L-_--*--" *,J I
<?xml version:"1. 0" encodi_ng:",r11-8"?>
(a) (b) <LinearLayout
xmlns : android:"http : / / schemas . android . com/ apk/ res /
Gambar 9.29 Menu Spinner (a) Periode Refresh (b) Magnttudo
android"
android : layout_width:"fi1 1_parent "
7. Tahap selanjutnya membuat layout XML dengan nama file peta- android : layout_height:"fil l_parent "
gempa . xm1 disimpan di direktori / res / layout untuk
difungsikan sebagai desain layout Ul MapView berupa tiie image android, : padding:" 1 0dp")
peta Google Maps. Seperti yang telah ditunjukkan contoh aplikasi <TextView
CekLokasi, dalam layout ini juga harus didefinisikan class ltlapView a n dr o i d . i d: " G + i d,/ qu a ke De t a.i l_ s T.'e x tVi ew,,
yang ditunjukkan dalam tag baris ke-6 disertai nornor API key (baris
ke-l2) yang diperoleh dari registrasi MD5 fingerprint pada sub-bab android : J-ayout_width:"fil l-_parent "
Registrasl API Map. android : 1ayout_height:"fi1 I_parent "
androld : textSi ze:" L 4 sp"
C1 <?xml version:"7.0u encoding:"ut-f-8"?> android : color:"#FFFFFF"
C2 <Linearlayout androi-d: autol,i.nk: " aII" / >
03 xmins : android:''Iittp: /,/schemas - android . coml apk/ <,/LinearLayout.>
res,/ androi-d"
04 android:layout_width:"wrap-content" Pada Gambar 9.30 ditunjukkan layout bertipe L, ryout
Inflater pada Ul aplikasi RSS-USCS. Nilai string r(,source
05 android:layout_height:"wr:ap-content."> quakeDetail-sTextView akan diperoleh dari c/;rss host
05 <com. google. android.maps .MapView RSSUSGS. j ava.
0"1 androj-d.16:,,@+id7,map_view,,
CB android:layout_wj-dth:"fil-l_parent"
09 android:layout_hej-ght:"fil1-parent"
10 android:enab]ed:"Lrue"

()
368 Ppntr6llratitittt Sttt,ttl l'ltotto Mt,tttilltttt.rh,rtr',1)h Artrltlt'l rl,,tt ll,rr kttrll Atrtltoltl llA13 Agrhk,r',r l{1", I r,r,rl 369
import javax. xml. parsers. DocumentBuilder;
import javax. xml.parsers. DocumentBuilderFactory;
imporr lavax.xml.parsers. ParserConfigurationException;

import org. w3c . dom. Document,'


import org.w3c. dom. Elementi
import org. w3c . dom. NodeList,'
import org. xm}. sax. SAxException;

import com. contoh . rs susgs . R,'

Gambar 93A Tampilan Ul layout rincian-gempa ' xmL


import android. app. Activlty;
9. Setelah modifikasi file Manifest atau membuat file Layout XML selesai"
j rmporr. andrcid . app .AIer tDia ) og,'
Tahap selanjutnya dengan mengubah public c/ass RSSUSGS . ava
aitam pact<ige com. Contoh. rssusgs untuk.digu.nakan sebagai i mpo rt android.app. Dialog;
Activity Marrc LAUNCHER RSSUSGS, pada class ini juga secara lmport android. content . ContentResoiver,"
langsung tlimplenrentasikan fungsi parsing data menggunakan parser
lmport andro id. conr,ent . Contentvalues,'
DOM menggunakan package jivax.xml'pars.ers d.an package
org.w3cllom. seielah irta
diperoleh, akan ditampilkan dalam -impo r t android. content . Context;
(tanggal,
heniuk l-istView dan informasi detail gempadi tiap daerah irnport android. content . Intent ;
iokasi, magnitudo, dan link) menggunakan Layoutlnflater'
Berikut adalah source code lengkap untuk class RSSUSGS:
lmport android. content. SharedPreferences ;
lniport android. database . Cursor i
i nipor t android. f ocation . T'ocation,'
package com. contoh. rssusgs;
i.mpor:t android.os.Bundle;
: rnport android . preference . PrefererrceManagier i
i.nrport java " io. lOExcePtj.on;
import android. view. Layoutlnflater;
impor:t- iava. io. InPutStream;
lmport- android. vievr . Menu;
import j ava. net . HttpuRlConnection; :-mpo-rt. androiC. view . Menultem;
irnport j ava. net.MalformedURlException;
import android. view. View;
import java.net.URL; import android . widget . AdapterVi ew;
j-mport. java. net. URLConnection,'
import android . widget . ArrayAdapt er;
import java. text . SimpleDateFormar- ; ,r r.iport- and::cici. widget . ListView;
importr lava.util.ArraYlist;
i rnport anciro ld . w:-dget . TextView;
lmport java " util - Dat.e; lllp,() I t ,'r n<irold. widget . Adapt.erVj-ew . On I terr'll r r;ki,i s Lener
L ;
import ;ava. util' GregorianCalendar;

\11
Penrrogranran Sntart Phort0 Mcn111,irrtr,tk;rrr lll)K Arrrjrorti tl,rtt Il,tr krttli
Atrrltilttl
370
public void onltemclick(Adapterview<?>
public class RSSUSGS extends Activity i _av, view _w. int _index, tong arg3) {
selectedeuake = earrhquakes.
listvie, ear:thquakeListv.ieu; get (-index) ;
ArrayAdapter<Datacenpa> aa; showDiatog (qUAKE DIALOG),
)
A :ayLisL<Datacempa> earthqnakes = new ));
Arraylist<Datacenpa> O;
int layoutID = andxoid.R.tayout.sinple tist
sLaLic finaf piiwate ini oUA(E DIALOG = 1; iten,1;
Datacenpa selectedouake, aa = new ArrayAdapter<Datacenpa> (rhis,
layoutfD, earthquakes) ;
static final private int lilENU UPDATE = Menu. earthquakelistview. selAdapter ( aa ) ; ,

static Jinal private int MENU PREFERENCES = loadDatacempaDari provider ( ) ;


Menu. FIRST+1;
static final priwate int MENU EARTHQUAKE UAP = updateDar:ipreferensi O;
Menu. FIRST+2, refreshDatacempa O ;
p.ivate static final lnt SHOW PREEERENCES = 1; )

@overlide priwate void refreshDatacempa ( ) {


public woid oncreate (Bundle icicle) { ,// anbil data xML dari $eb sexwice
super. oncreate ( icicle) , URL ur.I,
setcontentvie, (R. tayouL. main ) ; try {
String quakeEeed = getstring (R. string.
eartshquakeListviev, = (Iistvies) this. quake feed),
findviewByld (R. ld. IistvierrDatacempa ) , urt = new UR! (quakeEeed) ;

// proses listening request rincian data gempa URLConnection connection;


earthquakeListView. setOnItemCl ickListener (new connection : url.openconnectionO ;
OnItemCIj-ckListenerO {

HttpURLConnection httpConnection :
GOverride ( HttpURLConnection
) connectlon,-

372 _ Pemrogramarr Srrrarl l'lrono Mcrrllliurtakan SI)K Andrord dirn ll,rr:krrrli Arrrlrorrl BAt] 9 Atrlrk,r',r l(lii' I r.r'rl 373
inr responsecode = httPconnection. = {Efenent ) entry. getElementsByTagNane ('tit1e ").
gerResponsecode {), itsem(o) t
Elenent g =
if (responsecode == HttpuRlconnection. {Elenrent) entry. getElementsByTagName ( "qeorss: point." ) .

HTTP_oK) { item(o);
Inputstrean in = Element x,hen
httpconnecrion . getlnputstream ( ) ; = (Element)entry.getElemenlsByTagName('updated").
it€El(0);
DocumentBuilderFactory dbf - Element link =

DocumentBuilderFactory, newl nstance ( ) , (Elements ) entry. getEfementsByTagName ('Iink" ) . item ( 0 ) t


DocumentBuildet db = dbf'
newDocumentBuilder O; Stling detaits
= ti11e. getFirsrchird o .getNodevalue o ,
// Parsing data feed dari USGS Strinq
Docunent dom: db.parse(in), hostname = getstring (R. string. quake_host) ,
Element docEle = don. string souice
qelDocunentElement O ; = getstring (R_ string ' source) ;
String
// Hapus data genpa sebelunnva llnkstring = link. qetAttribute ($href", + \\n'+ source
earthquakes . clear ( ) , +'7:\+hostname;
loadDatacemPaDariProvider ( ) ;
String Point =
// Masukkan data pada list q. getEirstschlld ( ) -getNodevalue (),
Nodel,ist alari setiap entsry informasi ' gempa string dt =
Noder,ist nl : docEle. whea. getEirstchild ( ) .getNodevalue o i
getElenentsBYTagName ("entrY" ) ;
if (nl != nuII && SinpleDateEomat sdf = new SimpleDateEormat ('yyyy-ltrM-
nl. qetLenqth ( ) >0) { dd'T'hh:ftrn:ss'z'")'
for(inti=0;i< Date qdate =
nl.getlengthori++){ne'Gregoriancalendar(o,0,0)'qelTimeot
Element entry try {
qdate
= (Element) nI. iten(i),
Elenent title = sdf.parse (dt),

- pemrogranran Srrriul Plurrre Mcrrlillrrrrak;rn Sl)K Anrlrrrid rlan ll;rckrrrl: Arrrlrrtirl BAB 9 Aplikast RSS lnrul 375
374
) catch tambahDatacempa (data) ;
(Exception e) i
)

)
e.printstackTrace O;
]
catch (MaIformeciuRlException e) {
print.StackTrace ( ) ;
e.
String [] catch (IoException e) {
e.print.StackTrace ( ) ;
Iocation = point. split (" ") ;
Location I : catch (ParserConfigurationException e) {
e-printStackTrace O ,'
new Location ("dummYGPS") ;
catch {SAXException e) i
e. printStackTrace O ;
I - setlat j-tude ( Double - parseDouble (locatlon t 0I ) ) ;
finally
I . setlongitude ( Double - parseDouble ( location [1 ])); {

Str j-ng )

magnitudestring : details'split(" ") i1l;


private void
int end = tambahDataGempa (DataGempa _quake) {

ConLenlResolver = getContentResolver O;
rnagnitudeString. length ( ) -1 ; "a
double
String w : ProviderGempa.KEY DATE + r\ : $ +
magnitude : Doub1e -parseDouble (magnitudeString'
); _quake. getDate O . getTime O ;
substring(0, end)
/ I saat data gempa kosong masukkan data baru
details - ke provi-der.
if (cr.query(ProviderGempa.CONTENT_URI, nu1l,
details. sPlit- (", ") [1]'trim O;
w, nul1, null).getCountO==0) {
DataGemPa ContentValues values - nehr
Contentvalues {);
dala : new DataGempa(qdate, details, 1, magnitude'
linkString) ; values.put (ProviderGempa. KEY DATE,
// lakukan quake. getDate O . getTime O ) ;
values.put (ProviderGempa.KEY LOCATION
penambahan Pada list data gemPa
NAME, _quake.getDetaj-ls O ) ;

BAB 9 Apltkasi RSS lootl 377


pemrograman Smart Phone Mcnggrttutk;ltt lil)K Arrrhorrl rl,ttl llix.krttg Arrdrotd
376
if (c.noveToEirst O)
double Iat = _quake. getlocation O ' {
getlatitudeo; do {
double Ing = _quak€ , getlocation ( ) . // berikan rincian infornasi
getlongitude O ; genPa
values . put (ProvidercemPa. KEY,LoqATIoN- tong datems =
LAT, lat); c. getLong ( Providercenpa . DATE-COI'UIIIN) ,
values. put ( ProvidelcemPa - KEY-LOCAIION- String details =
LNG, 1ng)r c' getstring ( Providercempa ' DEIAIIS-COU'MN) ,
values . put (ProviderGe4a. KEY-LINK. Eloat lat -
-
quake.getl,ink());c.getPloat(ProvidercejPa.,AuIuDE-coLuuN)i
values. put (Providercempa -KEY- Float lng -
MAGNITUDE, _quake. getMaqrnitude o ); c - q€tFfoat (Ploviderce pa.rr GITI DE-CO!I,IO{) t
Double mag =
cr - insert (providercenpa. goNIENT_URI , c. getDouble (Providerceq)a.uAGNIaUDE_CO,,{,I(N) ,
values), string link =
earthquakes. add ( quake); c. getstring (Providercenpa.lllK-coiuH )t

addQuakeToAnray ( quake); r,ocation location = neY


) r,coation (idnny-),
l location. settongitude (1ng),
location. setlatituate (J.at) ,
privale void loadDatacenPaDariProvidtr O {

// Bersihkan data array genpa Date date - neU Date (datems) t


earlhquakes. clear O ;
q = ne$ DatacemPa
cr: getcontentResotver (, i DatacemPa {date' details, Iocation, nag, link),
contentResolver
addouakeToArray (q) i
// ken ralikan data yang tersimpan dari ) while (c. ooveToNext O ),
database-gempa l
cursor c= cr. query (Provi''Iercempa 'CONTENT-URI' )

nuIl, nul1, nuIl, nulI) i plivate void addouakeToArray ( Datacempa _quake) {

- Hacking Android BAB 9 Aplikasi RSS t ootl 370


378 Pemrograman Smart Phone Menggunakan SDK Android dan
if (_quake. getltagnitude O > ninimurn}lagnitude) item) {
{ super - onoptions rremselecred ( item) ,
// tambahkan data gempa baru Pada list
dafarn database_genpa. swj.tch i item- getltemld ( ) ) {
earthquakes . add (_quake ) ; case (MENU_UPDATE) : {
// notifikasikan Perubahan dari array reireshDatacempa O;
adapter return true;
aa. notifyDataseLchanged ( ) , l
) case (MENU_PREEERENCES): {
I rntent i = neu Intent(this,
Prefeiensi - c.lass ) ;
// Buat ltenu Optiotl startActivityEorResult ( i, SHOW
Qoverride PREFERENCES);
Public boolean oncreateoptionsMenu (Uenu menu! t return truet
super. oncreateoptionsMenu {tllenu} t }
)
meru.add(o, UENU_OPDATE, Menu-liollE, R.stEiEg- returo false;
nenu_update ) - setlcon (android - R - drawabLe - ic_menu_ )
rotate) ,
meru.add{o, UENU*PBEFEF.ENCES, lteau.NONE, // Buat dialog baru untuk rhenanpilkan infornasi
R - string. menujreferences ) . setlcon (android. R. drarrabl incian gempa
ic_nenujreferences) r @overrlde
Intent staltuap : ner Intent(this, PetaGsIE. pub.lic Dialog oncreateDialog (int id) {
class), sritch(id) {
nenu.add{o, }!ENIr-EIARTHQU!\EE-I'IAP, [enu. case (0UAKE_DIAtOG) :
l{oNE, R- strirg.nenujeta_gemPa) . sethtent (startllap} - IJayoutlnllater li = Iayouthflater.
setrcon (android. R. drawable - ic_menu_napmode ) t fron(this) ;
return true, View qlrakeDetailsview = 1i.inflate(R.
) tayout - rincian_genpa, null),

// Handle item menu AlertDiatog. Builde. quakeDialog = nei!,


€Override AlertDiatoq-Buitder (this) ,
public boolean onoptionslternsefected (MenuItem quakeDialog. setTitle (..R. string. dialog_

3S0 - Pemrograman Smart Phone Menggunakan SDK Android dan Hacking Android BAB 9 Atrhkarr llliS l lnrl 381
title")'
ouakeDiaLog. seLView (quakeDetailsVlew) ; int minimumMagnitude : 0,.
return quakeDialog.create O; bool-ean autoUpdate : fafse;
) int updat.eFreq : 0;
return null;
) private void updateDaripreferensi O {
Context context :
// Handle data yang di display pada QUAKE_DIALOG getApplicationContext ( );
GOverride SharedPreferences prefs :
public void onPrepareDialog(int id, Dialog diatroE) PreferenceManager . getDefaultsharedpreferences ( conte
{ xt);
switch (id) {
case (OUAKE DIALOG) :
minimumMagnitude : Integer.
I / svat format tanggal parselnt (prefs. getString (Preferensi_. pREF MIN MAG,
..0r,)
$ impreDar""o.*..i i::)ffi;;;TH:: "1, l** );
updateEreq : Integer.parselnt (prefs.
String dateString : sdf. getString (Preferensl. PREF_UPDATE_FREe, ..0,,) ) ;
format (selectedouake.getDate () ) ; autoUpdats : prefs. getBoolean (preferensi.
/ I Gabunqkan informasi gernPa PREF_AUTO_UPDATE, false) ;
String quake'fext : "Magnitudo Gempa " )
+ selectedQuake-getMagnitudeO + "\no + selectedQuake'
getDetailsO + "\n" + selectedQuake-getlink(); GOverride
public void onActivj_tyResu1t (int requestCod.e,
AlertDialoE guakeDialog : int resul-tCode, Intent data) {
(AlertDiaJ-og) dialog; super . onActivi tyResult ( requestCode,
quakeDialog. setTitle (dateString) ; resultCode, data);
TextView tv = (TextViewlquakeDialog.
findViewByld j-f (reguestCode :: SHOW_PREFERENCES)
(R. id. quakeDetailsTextView) ;
if (resultCode :: Activity.
tv. selText (quakeText) ;
RESULT-OK) {
break;
updateDariPreferensi ( );
refreshDataGempa O;

382 Pemrograman Smart Phone Menggunakan SDK Android dan Hackrng Androtd
IIA[]() ApIk;r,,r lii,li I r,r,rl 383
htLpConnection . getlnputStream ( ) ;
DocumentBuilderFactory dbf :
)
DocumentBui tderFactory. newf nstance (
),.
DocumentBullder db : dbf
Dari source code class RSSUSGS tampak dalam state onCreate ( ) newDocumentBuiLder ( );
akan mengeksekusi method l-oadDataGempaDariProvidero
untuk membaca data dari basis data database_qempa. db dan proses
selanjutnya dilakukan pada request dari web service diawali method urf .
/ / Parsing data feed dari Uli(ill
openConnection O dan parsing data yang diimplementasikan class
org.w3c.dom.Document, or9.w3c.dom.El-ement, dan org. Document. dom : db.parse(in);
w3c.dom.Nodelist sebagai parser DOM (Document Obiect Model), Element docEl_e = dom.
sebagai bagian dari method ref reshDataGempa O . getDocumentElenent ( );
Seperti yang telah dijelaskan dari contoh-contoh sebelumnya, parser SAX
merupakan berbasis event, sedangkan pada parser DOM digunakan Iist
Nodelrst dengan menerapkan method getDocumentElement o / / aapus data gempa sebelumnya
berfungsi agar dapat mengakses ke chi/d node dari suatu e/ement pada earthquakes.clear () ;
dokumen XML. l-oadDataGempaDariprovider ( ) ,.

private void refreshDataGempa O {


// ambr1 data XML dari web service // Masukkan data pad.a lj-st Nodel,lst dari
URL ur]; setiap entry informasi gempa.
tty { NodeList n]. = docEle.
String quakeFeed = getString(R.string getElenentsByTagName (..entry,, ) ;
quake_feed) ; if (nf !: null &a
ur1 : new URL (quakeFeed) ;
n]. getlenSth O >0) {

for(inti:0;i<
URlConnection connection,' nl.getLengthO; i++) {
connection : url.openConnection ( ),. EJ-enent entry
: (E1.peDt) nl.iteu{i),.
HttpURlConnection httpConnect ion : Element title
( IlttpURLConnection ) connection ;
(Element) entry. getElementsBflagName (..title,, ) .

int responseCode = httpConnection. item(0);


getResponseCode ( ) ,' Element g =
(Element ) entry . getElearentsByTagName (..georss
: point,, ) .
if (responseCode :: HttpllRLConnecti.on item(0);
HTTP OK) i E_Iement when
lnputStream in : = (Element) entry. getElementsByTagName (..updated,,)
.

IlAll () Aplrk,r,,r li:;:, I ll,l


384 Pt-.mrograman Sntart Phonr.Mcnlilirrrr;rk,rrr S[)K Arrrlroid rlarr l'lar:kirrli Artrlroirl 385
rtem(0),' Proses parser DOM diawali penerapan method
Element }ink : qetElementsByTagName (.'entry,,) untuk pengumpulan seluruh
(ElemenL ) en Lry - getElaentsB$tagNane ( "1ink" ) - item (0 ) ; data yang ada rli dalam tag (entryi dan dimasukka"n ke Nodelist
ent ry. selanjutnya dari NodeL i s t ent ry d ipisahkan lagi menggunakan
method getEiementsByTagName untuk membaca dita yarig ada di
Suatu list NocleLi st memiliki tipe data yang identik dengan ArrayList. suatu tag. Contohnya di dalam tag dengan value title akan diperJeh nilai
Data hasil clari parser tersebut secara otomatis akan dikelompokkan dalarn string lokasi gempa.
satu kateg,ori Nodelist seiiap diperoleh data yang tersimpan dalam satu
tag yan8 sarna.
Parser DoM <entry> terakhir menggunakan
selesai saat mencapai tag
method n1. memperoleh Nodel,ist "tertinggi
getlength o untuk
Contoh r)ros€rs parsing par.ia {ile lday-M2.5 "xm.l ya;tu tiap data it,ka:'i dengan penerapan loop-statement for. Dari Gambar 9.3r ditunjukli"n
gemp;l rrr.rsing-masing dipisaiikan tag <entrv>. Yang cii rlaiarrinya diag_ram alir sebagian proses parser DoM yang ada di dalam method
terdap,rl tag, <1--i.Lie> Lrerisikan data string iokas! gempa, tag <linl"-\' refreshDataGempa ( ) .
mengrnlr)rrlasikan !ink UF;.r- untuk- ir^rfor:masi iebih detail tentang gempa
di lok.r,r tersebut, tag {geo:ss:poini} berisikan data koordinat gempa StarC
(longitrrcie dan latitude bersatuan deraiat), dan tag (updated> berisikan data 16frsrhD.t.6anpa o
waktu terjadinya gempa"

<entry> openconneceion (,
URL i http ; //earthqurke. u!g6. goy
<id>urn : earthquake-usgs-gov: us : c00 0 12gf</ id> /eqcenter./cataloga/1dey-!.t2 . 5 . xmL

<title>M 5.3, Loyalty Is1ands, New Caledonia</ ga tEleltlen


tsBylagNane
("g€orsB: pqi nL" )
title>
<updated>201 1 -01-1 3T1? : 26:062< /updated> 96 t El€rnen tsByra gNane
<Iink rel:"a1ternate" type:"text/html" ( "rPdated" l
hre f :"http : / / earthquake - usgs . gov / ear thquake s /
ge tE1 etnentBByTagt{ahe
recenteqsww,/Quakes/usc00012qf .pbrp" / > ( "link" )
<summary tlpe:"html">
<l ICDATA[<img src:"http : / / earLhquake. usgs . getEl€D€nta [.",b.hJG
Byt.gNa.ne("entry")
gov,/images/globes/-20_770 -)pE" alt-:"20.673d#116; 3
168 - 436&#11 6 ; E" align:"Ieft" hspace:"20" /><p>Thursday, For
January 13, ZAt Ll:262O6 UTC<br>Friday, January 14, Nod.I.ist <
. getlength ( ).
2011 04:.26:O6 AM at epicenter</p><p><strong>Depth</
strong>: L2.40 km l7 .'11 rni) </p>l I >
</summary>
<georss :point>-2A . 6726 168. 4357<,/georss :point>
<georss : elev>-124 00<,/georss : elev)
<caLegory label:"Agte" term="Past day" /> re f re shDa taGempa ( )
Gambar 9.31 Diagram Arir sebagian nethod dari

</entry> Data string yang telah diperoleh dari proses di atas dimasukkan ke

386 ['orlrollraman Sttt,t:l l'lrrittl Mt'1t1';'1111,11"111',ltl' /,rL,ltrrrrl,l il r I tr1


[]AB 9 Atrlrk,r,,r l{iili I rr,rl 387
Arraylist <DataGempa> untuk dikirim ke database database
gempa. db tambahDataGempa (data)
menggunakan method
Saat user mengakses kembali aplikasi RSS Cuaca, saat data database-
gempa . db telah ada dari query sebelumnya (isi data tabel tabe.J--gemp.a
iiiunlukt an pada Cambar S.3j) maka Aciivity RSSUSGS terleb,ih dahulu
me-reload database tersebut, agar user dapat melihat data yang telah masuk
Jrii ,"qr"rt sebelumnya meski[un perangkat tidak terkoneksi internet. Kolom
.gempa
dalam tabel tabef diantaranya ialah tokasi, tanggal,
latitude , Iongitude, magnitudo, dan link'
Jika user men-tap menu Refresh Data
(cambar 9.32) maka akan me-re/oad
Jit, *"nggunakan method ref reshDataGempa O untu.k mengupdatedi
database batabase-qenpa " db dan selaniutnya ditampilkan
Li stView menggunakair Activity RS SUSGS.
Saat user men-tap menu Preferensi akan mengaktifkan Tnt-ent
Pref erenceActivity menggunakan layout Ul / res /xml /
menupreferensi.rr.i. Sedangkan pada menu Peta Cempa akan
mengaktifkan Intent dari MapActivity PetaGempa yang
mengimplementasikan API MaP.
Gambar 9.33 Tabel tabef getnpa pada aplikasi SQLiteStudio

00.56: 5.5 Banda Sea 10. Proses selanjutnya buatlah public c/ass ProvlderGempa. ; ava
di dalam package com. contoh. rssusgs bertipe class Content
09.02:3.'l Daminican RePublic Provider untuk difungsikan sebagai interfice. Clais ini digunakan
r€gion agar dapat mem-publish data dengan model pengalamatan UF.i
dengan schema content : / /, seperli yang telah jelaskan pada
project RSSCuaca sebelumnya. Class ProviderGempa suatu juga
09.35:3"4 Fox Islands sebagai penyedia fungsi pembuatan, update, dan upgrade tabel yang
tersimpan dalam database database gempa . db. Di bawah ini
adalah saurce code iengkap untuk class ProviclerGempa tersebut:
10.51:3.4 Oklahoma

I t-?3: 5.6 Simeulue package com. contoh. rssusgs;

import android. content . ContentProvider ;


import android. content . Cont.entUris,.
import android. content . Contentvalues;
Gambar 9.32 Tarnpitan layout ListView dan menu pada Activitv RSSUSGS
import androi-d. content. . Context.,'
import android. content . UriMatcher;
import anclroid. database . Cursor ;

Atrtlrrtttl
llA[3 9 Apltk,r,,t l{:,1' I r,r',1 3U9
388 Pemrograman smart Phort0 Mcrrlllirrt[tk;rrt l]l)K Arrrlrord rl;ln llitr:kttl11
inport android. database. SQlException i "la!itude";
import android. database. sqlile. SoLiteDatabase; public slatic final String KEY I,OCATTON LNG =
import android. database . sqlite . SQliteopenHelper; "longitude",
import android. database . sql ite . SoliteoueryBuilde4 public static final String KEy MAGNTTuDE =
imporl android. database . sql ile . SoliteDatabase . "magnitudo";
CursorEactoryi Public static Jina-I Stling KEY IINK = "]ink",
import android. net. Uri;
inport android. text . Textutil s; // rndeks kolom
inport android. util .1,o9, public stalic final int DATE_CoLUMN : 1,
public static final int DETATLS_COLUI,IN = 2;
public sratic Jina1 int LONGITUDE-COIUMN = 3;
public class PfovideEc€e{ra e:tends contentProviale! { public static final int IATITUDE_CoIUMN 4, :
public static final int MAGNITUDE_CoIUMN = 5;
public static final Uri CONTENT_URI = Uri. public static final int LINK_CoLUMN = 6,
parse ( "conteat: //com. coatoh. !ssutg3. PlovideE/detabase-
g€qraz); // class helper untuk fungsi perLbuaran. buka, dan
Penqaturan wersi database
// clefinisi Database private static class earthquakeDatrbaseltetpe!
privaLe sQliteDatabase DBgenpai extends sQlit€oPerBelPe! {
Private static finar string DAT]\BASE CREATE
private static {inar strinq TAG = 'providelcq)a"; _
private static finaf string DATABASE_NA.I4E create tabfe n + EARTHQUA(E TABLE +

private slatic final int DATABASE-VERSIoN = 1t + KEY-ID + " integer primaly key
private static 1inal String EARTHQUAKE-?ABLE utoincrenent, "
"tab61_g.rq)e"; + KEY-DATE + " INTEGER, '
+ i<EY LOCATION NAME + ' TEXT, '
// Nana kolom + KEY_IOCATION_IAT + " I'LOAT, '
public static final string KEY_ID = "_id"; + KEY_LOCATIoN_1,NG + " FLoAT, ..

public static Jinat String KEY_DATE : "tangga1"; + KEY_MAGNITUDE + " ELoAT, "
public static Jinal String KEY_IoCATION_NAME = + KEY_IINI( + " TExT)i";
"lokas i",
public static finaf String (EY_LOCATION LAT : Public earthquakeDatabaseHelper {Cont e

390 _ Pemrograman Smart Phone Menggunakan SDK Android rlan llackrng Anrlrotrl lJAtt 9 Altltk,t,;t l(liii I rr.rl 391
xt context, String name, CursorFactory factory, int
version) { prlvate st.atic flnal rnt eUAKES : T.
private static final int eUAKE ID
super ( cont-ext, name, factory, -
f .

version) ;
prlvate sLatic final UriMatcher urj_Matcher;
)

/ / buat database baru / / A1okaslkan oblect UriMatcher, saat reguest


terakhi r daLabase_grempa
GOverride
public void onCreate(SeliteDatabase db) / I sebagai korespondensi untuk proses request
{ a-,1,,-,,L
urr udLd Kegempaan yang ada dalam
i^,-,
db . execSQL ( DATABASE CREATE ) ,.
ciatabase_gempa
/ / dan menarik kolom ..eUAKE_ID,,
) menjad:L satu kol-om
static {

/ saat dalam proses upgrade suatu database,


/
uriMatcher = nerr UriMatcher (UriMatcher.IJO
I'/ATCH) ; -
akan ditampilkan pesan 1og
u r i l,ja t c h e r . a ddUR f ( .. c om
/ luntuk men-drop tabel, selan j utnya provicler.RSSUSGS., ..database_qempa,,,
. c o n l- o h . r s s u s s s .
dinisiasikan method onCreate eUAKES),.
/ /unLuk mem-buat database uriMatcher. addURI (..com. conLoh. rssusqs
.
prov-ider. RSSUSGS-, ..database_gempa/#,,.
eUAKE Iil) ;
j
GOverride
public void onUpgrade (SeLiteDat.abase Cb,
int oldVersion, int newVersion) { GOverride
public bool_ean onCreate O
Log.w(TAG, "Data sebelumnya dihapus, {

dan dal-am proses upgrade database dari versi.. Context context. : getContext O
+ ,.

oldVersion + \\ ke versi " f newVersion);


earthquakeDatabaseHelper dbHelper :
new ea
rthquakeDatabaseHelper(context,
db.execSQL(*DROP TABLE fF EXfSTS .. +
DATAtsASE-VERS ]ON ) ;
DATABASE_NAME, nu11,
EARTHQUAKE TABLE);
onCreate (db) ;
DBgempa: dbHelper. gretWritabLeDatabase
O ,.
return (DBgempa := nuff ) ? fa.lse : true,.
)
)

GOverride
/ / konstanta digunakan untuk membedakan dari
request UB.I yang berbeda public String getType (Uri url)
i
sw_i tch (uriMatcher.march (uri) ; {

392 Pemrograman Smart Phonr: Mcnllllrrnakan SDK Androitl rlan llar:kirrli Arrrlror<l NI
IJAII() Arrhk,r,,r ltli'i I rlrl t ar" 393
dsn lJc i-1"1,,-I
,, r,rOnr
Pr,....
String orderBY;
CASE QUAKES: return "vnd. android' if (TextUtiIs. isEmPty (sort) ) i
cursor . dir/vnd. contoh ' rssusgs" ; orderBy = KEY_DATE;
CASC QUAKE-ID: return "vnd ' androi:d ' ) else {
cursor. dirlvnd- contoh ' rssusgs"; orcterBy = sort;
throw new
clef ault: )
(*URI tidak dldukung : " * uri);
Il}egalAr:gumentException
/ i aPY'LY query ke da1-abase tsb
l l so:: c = eb " quer y ( DBgempa, pr:o-1 ect ion, sei
Cu

ection, se1ec1-ionArgs, nu11-, nu11, orde:rF:r') ;


GOverride
uri'
Public Cursor query(Uri string
/ / R.egisLer contexts darl Cont-entResolver'
agar dapat drrrctifikasikan
proj ection, / / saat hasil dari cursor berubah
String selection, c. setNotj-ficationUri (getContext ( ) - getContentResolver ( ),
qrringtl
uri);
selectionArgs,
String sort) {
// kemUatikan hasil cursor ke resulL query
new
SQLiteQue rYBui lde r qb
return c;
SOLiteQuerYBui lder ( ); ]

qb . setTables (EARTHQUAKE-TABLE) ; Goverride


j'
public Uri insert (Uri _uri, ContentVaLues
// SaaL qlrerY I kolom' batas initialvalues) {
/,/ Iuaran agar kolom mencukuPi // tambahkan kol-om baru dengan hasil
swiLch (uriMatcher'maLch (uri) ) i + t':" pengembalian berupa nilai jumlah kolom yang ada
case QUAKE-ID: qb'appendWhere(KEY-ID
(1) ) ; long rowID j-nsert
+ uri.getPathSegments O 'get DBgempa- (EARTHQUAKE-
break; TABLE,'tdata_gempa", ;
break; -initialValues)
default
i ,// Kembalikan perolehan URI ke data masukan
baru jika berhasil
/ / saaL tidak berurutan' urutkan berdasarkan if(rowID>0)i
urutan tanggal/waktu'
BA{1() AIlk.r''r lil'1, I lr"l 395
Ilackrrrll Atrrlrrttd
Pemrograman Sntarl Pttotlt'
Mr'tllilltttlakan SDK Anrirorr! darl
394
Uri ur1 - ContentUris.
w j-thAppendedld (CONTENT_URI, rowlD);
default: throw new
II legalArgumentException ( ..URI
t.idak didukung:
getcontext ( ) . getContentResoiver ( )
i uri),'
)
notifyChange (uri-, nufl) ;
return uri;
getContext O . getContentResof ver (
) )
not j- fyChange (uri, null )
throw new SQLExcept.ion ("gaqal- memasukkan ke ,.

return count;
baris: " + _uri);
)
)
/ / unLuk fungsi updat.e database
GOverride
@Override
public i,nt update(Uri uri, ContentVaiues
public int deJ-ete(Uri uri, String where. String[] String where, String[] whereA::gs)
vaiues,
whereArgs) { {
1nt count;
int count;
switch (uriMatcher.match(uri) ) {
switch (uriMatcher.match (uri1 ; {

case
case OUAKES: count : DBgrempa.
QUAKES:
update (EARTHQUAKE_TABLE, values, where,
count DBgempa whereArgs) ;
delete (EARTHQUAKE TABLE, where, whereArgs); break;
case QUAKE_ID: String segment = uri.
break; getPat_hSegments O .Set (1),.

case count Bgemp;r


QUAKE_ID:
update (EARTHQUAKT.._TABtrE, values, KEy_ TN
String segment uri
getPathSegments ( ) -get (1) ; + \\_,, + Segment
count DBgempa + (!TextUtitr:
isEmpty(where) ? * AND (*
de]-ete (EARTHQUAKE TABIE, KEY ID + \\:,,
..,,)
+ where * .), :
, whereArgs) ;
* segment
break;
+ ( !Text.Utils. isEmpty (where) ? " AND ("
defau.l-t: throw new
f llegalArgumentException (..input URI tidak
+ where + ')' : ""), whereArgs); di_ketahui,, +
uri),-
break;

396 l'crrrrollranurrr lirrr,rrl l'lrorrt ltilcttllllurr,rk,rrt lil)K Arrrlrorrl tl,ut ll;tr:knli Attrlrortl
ItAIJ() ApLk,r',r lliili I llrl
19/
getContext ( ) . getContentResolver ( ) dan link URL) untuk digunakan Main Acrivity
RSSUSGS berupa
notifyChange (uri, nul1) ; ke Arraylist <oat"acemf.r'y"1s
i s t.vi ew dengan cara men!-or"riiJ"" r*in-"a"ait"rfJt"n
af.ai.., paaa
L
return count; i i g, .
Berikut ditunjukkan sourcecode "d"t. "
) tengkap dari class DataGempa:
)
package com. contoh. rssusgrs;

Pada P rovi de rGempa tersebut, tampak d i implementasikan o leh sej um lah


class untuk akses ke database diantaranya class SQLiteDatabase,
import java. uti1. Date;
SQLiteOpenHelper, SQLiteQueryBuilder, dan import j ava . text . SimpleDateEormat,.
CursorFactory. Pada saat state OnCreate, ProvJ-derGempa import android. l_ocation . Location,-
akan dilakukan overide untuk menjalankan fungsi pembuatan database
database_gempa . db menggunakan method:
public class DataGeqra {
private Date tanggal;
execSQl.("createtable * +EARTHQUAKE_TABLE + * (' pri.vate String details,.
+ KEY ID + " integer primary key p::iva.te Location location,.
autoincrement, \\ priv,ate double magnitudo;
+ KEY_DATE + " INTEGER, \\ private. String l-ink,.
+ KEY_LOCATION-NAI\4E + " TEXT. \\
+ KEY_LOCATION_LAT + " FLOAT, " public Date getDateO { return tangga};
}
+ KEY_LOCATTON_LNG + " FLOAT, " public string getDetairs o { return
details; }
+ KEY_MAGNITUDE + " FLOAT, " public Locat.ion gettocation o
t return ]-ocation;
+KEY_LINK+'TEXT);";)
public double getlrtagmitudeO return
{ magnitudo,-
Pada class ini digunakan format data URI: content : / / com. contoh.
rssusgs.provider/ database_gempa agar Content Provider pub,Iic String getLink$ { return link;
ProviderGempa dapat diakses oleh Main Activity RSSUSGS, i
MapActivity PetaGempa yang berfungsi sebagai Activity API Map,
dan Overlay OverlayGempa untuk fungsi draw teks di tiap lokasi. public DataGeq>a(Date
_d, StrinE _det, Location
Pada class tersebut tampak pengimplementasian URI diantaranya saat proses _J-oc, double _&d9, String _Iink) {
pengalokasian ke object UriMatcher, dalam method Cursor untuk tanggal : _d;
fungsi query ke suatu data, fungsi penambahan data baru menggunakan
method Uri insert, method update sebagai update data ke database, details : _det;
dan method delete untuk penghapusan data. Iocat.ion = _loci
magnitudo : _magi
11 . Selanjutnya, buatlah p ublic class baru dengan nama file DataGempa .
java di dalam package com. contoh. rssusgs. Class ini Link : _link;
beffungsi sebagai string interface database DataGempa yang akan )
menyimpan data dari tiap titik gempa (waktu, lokasi, magnitudo,

Pentrograman Srrurrl l)lrorrl Mcrrlilirrrr;rk,ur Sl)K Arrrlroirl rl;rrr


8AB 9 Aplikasr ltsli lrxrrl
398 ll;1r;krn11 Anrlrorrl 399
super. onCreate (savedfnstanceState)
;
GOverride setContentView (R. layout . peta_gempa)
public String tostrinEO ;
{

SimpleDat-eFormat ^jf, = new Uri rssusgrsuRl = providerGempa. CONTENT_URI,.


SimpleDat.eFormat ( "HH. mm" ) ; earthquakeCursor getContentResolver .
S1-ring dateStrj-ng : sdf .format (tanggal),- query(rssusgsURI, nu]1, nu11, nul1, O
null_);
return dateString + ": " + magnitudo + \\ \
+ details; MapView earthquakellap (MapView)
) findViewByld (R. id.map_view) ;
) OverlayGempa eo = new
12. Kemudian, buatlah kembali public c/ass baru dengan nama file overlalGeq>a ( earthqua keCursor
);
PetaGempa. j ava yangtersimpan dalam package com. contoh. earthquakeMap. getOverlays ( ) . add (eo)
rssusgs, class ini merupakan tipe class MapActivity sebagai ;
base c/ass dalam penerapan API Map. class MapActivity dapat I
pula meng-handle sejumlah siklus (life cycles) dan service untuk
menyediakan image peta menggunakan class MapView. Berikut
@Oserride
adalah source code lengkap dari PetaGempa:
p:rotected boolean isRouteDiqll.ayed{}
{
return false;
package com. contoh. rssusgs; t
t

import android - database - Cursor; @Orrerride


import android- net.Uri; public void onResure O {
i-mport android- os -Bundle; earthquakeCursor. requery ( ),.
super.onResume ();
import com. contoh. rssusgs.R; I
import com. google . android - maps . MapActivity;
imporL com. google - android. maps . MapView,' GOverride
public void onpause() {
public class PetaGeq>a extends uapActiwityi earthquakeCursor. deact.ivate ( ) ;
super. onpause O ;
Cursor earthquakeCursor; )

@Overrlde @Override
public void onCreate (Bundle savedlnstanceState) { public void onDestroyO {

400 Pemrograman Smart Phone Mengliunakan SDK Android dan Hackrng Android tlAB 9 Aplkasr RSS I oort
401
super ( ) ,'
earthquakecursor . close ( );
database_gempa : clltrsor,'
super. onDestroY ( ) ;

koordinatGempa :
new Arrayl,ist<GeoPoint> O,.
detailGempa : new Arrayli"sL<String> O ;
)

13. Tahap selaniutnya, buat - class baru dengan nama c.ontoh


file
OverlayGempa'. j ava di datam package com' ' refreshQuakelocations ( ) ;
rssusgs untrk difrngtikan sebagai overlay penampil tile image
dat aba s e_gempa . re gi s te rDat aSetob s erve r ( new
pJi *""ggrn"[in nit"f"r"p dan fonambahan layer untuk display
titikkoordinatdanteksdarimasing<nasingkoordinattersebut
DataSetObserver O {

menggunakan method canvas . drairText. Berikut


dituniukkan GOverride
source code lengkaP OverIaYGemPa: public void onChanged() t
package com. contoh- rssusqls; refreshQuakelocations ( );
)

import java - util -ArraYlist; ));


import android- database' Cursor; )

import android - database ' DataSetObserver ''


import androj-d - graphics ' Canvas ; privaLe void refreshQuakeLocations O t
import android- graPhics' Paint; if (database gempa.moveToFirst () )
import android- graPhics' Point; do{
import android- graPhics' RectF; / / konversikan nilai derajat ke mikro-
derajat, info, detail- baca
import com- google. android'maps' GeoPoint; / / l|nat java-doc method GeoPoint
import com - google - android ' maps ' MapView; Double 1at :
import com. google - android ' maps ' Overlay; database_gempa.
import com. google - android ' maPs ' Projectlon; getFloat(Providercempa.LATITUDE COLUMN) * 1E,6;
Doubl-e i.n :
public class OnerlalGeqra extends ()retlay { database_gempa.
getFloat(Providercempa.LONGITUDE COLUMNI * 1E6;
Cursor database-geqra ;
Arraylist<@oPoint> koordinatcemPa ; GeoPoint geoPoi-nt new
Arraylist<String> detai IGemPa ; GeoPoint (1n9. intval-ue O , Iat. intValue O ) ;
int rad = 5; / / nr1aL radius draw titik gempa

koordinatGenpa. add ( geoPoi-nt ),.


public overlayGempa (Cursor cursor) {

UAR9 Aphkast lllili Iurrl 403


Android dan Hackin[ Android
402 Pemrograman Smart Phone Menggunakan SDK
I
I

canvas pada titik tsb


St.ring location daLabase- Rectf oval : new RectF (myPoint. x-
rad, myPoint.y-rad, myPoint.x*radr myPoint.y+rad) ;
gempa. getstring (Provid'erGempa' DETAILS-COLUMN) ;
detailGemPa' add ( Iocat'ion ) ;
canvas.drawOval (ova1, paint) ;
I while (database-gempa'moveToNext O); / /dxaw Teks lokasi gempa
disebelah titik tsb menggunakan canvas
)
Strj-ng .l-ocationname
detailGempa-get (n) ;
@Override
maPView, canvas . drawText ( locati-onname,
pubti-c void draw(Canvas canvas, MaPVier*
myPoint.x + 2 * rad, myPoint.y,
boolean shadow) t paint),'
Projection projection mapVi-ew.
n**;
getProjection O ;

/ / BuaL dan konfigurasikan fungsi paint


l
brush
Paint Paiot : new Paintfl;
paint.setARGB (255, 50, 20, 255); Pada class tersebut Overlay OverlayGempa akan membaca tiap
paint. setAntijAlias {true) ; koordinat lokasi yang telah tersimpan dalam database database
paint - setFakeBoldText (true) ; gempa.db untuk dimasukkan pada Arraylist<GeoPointl
sebagai referensi posisi koordinat tiap titik, yang akan didraw dari
menggunakan method canvas. Sedangkan data yang dimasukkan
if (shadow :: false) { ke Arraylist<St-ring>d merupakan nama detail dari tiap titik
lokasi gempa tersebut yang juga akan difungsikan dalam drawText, agar
intn:0; tampak pada layout peta tersebut.
//)aLankan loop statement untuk tiap Seperti yang telah dijelaskan pada project Ceklokasi pada bab B,
titik gempa diperlukan pula fungsi pengali koordinat latitiude dan logitude untuk
for (GeoPoint point : koordinatG'eq>a) dijadikan dalam satuan mikroderajat sebagai nilai referensi MapView
yaitu dengan nilai pengali /xI06-
{
Point mYPoint : new Point O ; 14. Sebagai class terakhir, buatlah public c/ass baru dengan nama
/ / baca nilai koordinat longitude dan Pref erensi . j ava yang tersimpan pada package com.
contoh. rssusgs, class ini merupakan Activity tipe
latitude dari tiaP titik gemPa PreferenceActivit.y untuk sebagai penyedia fungsi host dari
Pro j ection' toPixels
(PoinL'
layout preferensi menupreferensi.xml. Pada layout tersebut
myPoint) ; ditampilkan menu konfigurasi tampilan dari sejumlah data gempa
dan fungsi auto-update yang dalam bentuk ListView. Di bawah ini
/ /buaL lingkaran menggunakan

Android dan Hacking Android llAB 9 Aplfi,r.r l{iili Iilr'rl 405


404 Pemrograman Smart Phone Menggunakan SDK
bentuk f istview). pada cambar 9.34 ditunjukkan pura diagram
ditunjukkan source code lengkap dari class Preferensi tersebut: proses interaksi antar-Activity yang berjalan dalam apiikasi
sequence
t"ri"nrt.
package com. contoh. rssusgs;

import com. contoh. rssusgs. R; Requ€d dela


hflt&dqlbj
le parser
0

lmport android. content. SharedPreferences; com.


EI content: //
contoh. r.susgs.provider/

import android. os.Bundle; Layout


Rincian_g@p!

i-mport android. preference. PreferenceActivity; 00.56: 5.5 Eanda sea

09.02: 3.1 Dominican Republic

public class Preferensi extends PreferenceActivity{ reSron

09.35:3.4 Fox lstands


public static final String PREF-AUTO-UPDATE
'10.51:
*PREF_AUTO_UPDATE,,; 3.4 Oklahoma

public static fina] String PREF MIN MAG : 'PREF 11.23: 5.6 Simeutue
(Saal user meogklik
link U R L)
MIN_MAG,,;
publi-c static final String PREF-UPDATE-FREQ
*PREF-UPDATE_FREQ,,;

SharedPreferences Prefs ;

GOverride
public void onCreate (Bundle savedlnstanceState) {

suPer. onCreate (savedlnsLanceState) ;


addPref erencesfromResource (R' xml'
menupreferensi) ;
Ov.day &6rtatGq)!
i
)
iada class pre f e re n s i di atas ditunj ukkan saat Pre f e re nceAct ivi t y
dalam state onCreate akan ditampilkan layout preferensi dengan
]-n"n"r"ptun method addPre f e rence s FromRe s ource mengacu. pada
,"rour." lD file layout XML menuprefelensi . xml yang diperoleh dari Gambar 9.34 Diagram sequence interaksi Main Activity RSSUSGS,
auto-generate index c/ass R. j ava. Mapview dan contenr
Provider
Jika seluruh class-class di atas telah selesai dibuat
maka kita dapat melakukan
oror", kompilasi yang selanjutnya aplikasi Rss-USCS tersebut dapat -oo0oo-
iii"finf.rn pada Emula{or AVD'atau pera,ngkat Android. Aplikasi ini berjalan
diawali oleh Activity RSSUSGS (menggunakan layout main-xml dalam

RAB 9 Aphk,r',r lii,', I r.r,rl


406 Pemrograman Smart Phone Menggunaknrr lil)x Ailrhorrl rl;xr llacking Android 407
Aplikasi Berbasis Sensor
Android

Project terakhir ini akan mengimplementasikan sensor-sensor pada


perangkat Android agar kita bisa membuat aplikasi interaktif seperti game
atau simulator. Sensor-sensor Android merupakan bersifat native sehingga
tergantung dari ketersediaan chip sensor yang tertanam di dalam perangkat
yaitu: Accelerometer, Compass, C-Sensor, Magnetometer, Cyroscope, dan
NFC.

Tipe Sensor pada Android


Perangkat keras sensor yang tertanam pada smartphone atau Tablet Android
dapat diakses oleh aplikasi dengan menerapkan package android.
hardware dan class sensor,masing-masing sensor diakses dengan cara
yang berbeda seperti yangditunjukkan padaTabel 10.1.
Jenis Sensor Komposisi Value Sensor Definisi
Tabel 10.1 Jenis Sensor dan Komposisinya
TYPE PRESSURE
val-ue[0] : pressure Akses ke sensor tekanan, dengan
Komposisi Value Sensor Definisi nilai satuan KPa (kilo Pascal)
lenis Sensor
valuest0l:-Gx (sb x) Pengukuran besar PercePatan value[0] : distance Akses sensor proximity untuk
untuk bidang X, Y, dan mendeteksi .jarak antara
TYPE_ vafuestll=-GY (sb Y) Z menggunakan sensor perangkat dengan telinga user
TYPE PROX]MITY
ACCELEROMETER
values t2):-Gz (sb z) Accelerometer, dengan satuan saat akses telepon. Beberapa
Sl (m/s':) menggunakan satuan Sl cm atau
valuest0l:-Gx (sb x) Pengukuran besar PercePatan dalam raw biner
gravitasi pada bidang X, Y, dan Z vafues t0l: X. Sin (0,/2) Pengukuran orientasi vektor,
TYPE.GRAVITY valuestll:-GY (sb Y) menggunakan sensor gravilasi, TYPE*ROTATION_ berupa kombinasi antara besar
valuestll: Y.Sin(0/2)
val-ues l2):-Gz (sb z ) denean nilai satuan Sl (m/s2) VECTOR sudut dan titik sumbu

vafue[0]:tl, Pengukuran kecePatan sudut vafues l2l: Z. Sin (0/2 )


(angular) dari bidang sumbu X, value[0]:Temperatur Akses ke sensor suhu,
TYPE*GYROSCOPE value [ 1]: r,r Y, dan Z menggunakan sensor TY PE_TEMPERATURE menggunakan satuan oC (deraiat
gyroscope, bersatuan rad/s celcius)
vafue 12): a
value [0] : illumination Pengukuran intensitas cahaYa
menggunakan sensor cahaYa, Nilai raw dari sensor yang ada dapat diketahui melalui aplikasi infoTab yang
TYPE LIGHT dapat diunduh melalui Market. Pada topik ini penulis hanya akan membahai
dalam satuan Lux
sensor Accelerometer (Gambar 10.1a) meskipun pada perangkat tersebut
value[0]:Lateral Pengukuran menggunakan
terdapat pula sensor Magnetometer (Cambar .l0.1b).
sensor Magnetometer Pada
TYPE_MAGNETIC- value [ 1 ] : Longitudlnal bidang lateral (searah sumbu Dari rabel 10.1 terlihat tiap sensor memiliki fungsi berbeda yang sebagiannya
EIEI,D value [2] :Vertj-ka1 x), longitudinal (sumbu Y), dan adalah sensor virtual merupakan kombinasi dari beberapa sensor. Coniohnya,
vertikal (sumbu z) bersatuan PT -sensor orientasi pada Android Samsung i5503, merupakan kombinasi
(micro-Tesla) sensor Accelerometerdengan sensor medan magnet (Cambar t0.jc). Ljntuk
Pengukuran ortentasl mengakses sensor orientasi lebih mudah karena hanya diperlukan satu Apl
putaran bersatuan derajat Sensor.TYPE ORTENTATToN berlaku untuk sensor orientasi dari
dengan mengimPlementasi perangkat lainnya, tergantung dari spesifikasi masing-masing perangkat
sensor Accelerometer dan tersebut.
Magnetometer.

TYPE_ORIENTAT ION
va.Iue[0]: Azimuth
value[1]: Pitch
Azimuth adalah sudut horizontal
searah medan magnet kutub
utara (Utara: 0, Timur: 90,
Selatan : 1 80, Barat-270).
ffimw#ffirusffi f t*,t B!|!€ 1fS{iUtr!
Sudut Pitch, dengan bidang Putat
value [2] : Ro11 sumbu X (Perangkat Pada Posisi ratfar{,$artt 6.N;:Ss. I
|j'-a,(
Lodlll&r.Lrt
| I
utf l^((
uiMlrr
._-ft.,;,4.a*'i

display diatas : 0" r*! ., ,:4 nr


&ri!-q
i i
ll
,1#r tll i .r4
krry
VrrjE i {l))
, tegak - 90" , disPlaY di bawah l:f !.rJ}'i'1*
Lr: !u.J
| k'Ar l;.llr.i_.'

- -180.). s; t rr:'il,t d3qdra I


&=. 4i1-4{
,....-*..__*.,-*".. r,"11.:::j:,,1_
.r'.rri,. !J! i
-___,* I:ntl{i , - !
lln-'.}1r4:-, ,... ....-.,,,
I Srdut toll, menggunakan sumbu
lrotasi Y (lihat Cambar 10.1) (a) (b) (c)
Gambar 10.1 Sensor-sensor di Samsung i5503 dilihat pada lnfoTab

l,lll\ Atrrltrrtrl rt.ltt ll,rr ktttli Attrlrottl


llAtl l0 Apltk,t',t lit,tt',ot Arrrlrorrl 411
410 Penrrogranr:ttr srrrirrl l,lrorrt'Mt,ttl:l:tttt,rk,ltr
yang tergabung dalam Open!rttents yaitu project interface SensorEmulator
setiap perangkat Android menggunakan.seri chip dengan spesifikasi sensor
,"nn' fjerned"a saat kita membuat aplikasi memanfaatkan sensor jarang yang dapat mengemulasikan sejumlah sensor pada Emulator AVD,
Aplikasi tersebut diantaranya Accelerometer, medan magnet, suhu, dan sensor gaya gravitasi
i;;d;-t$ peringtat Android (miialnya, Cyroscope).
pada perangkat mobile yang yang dijelaskan pada sub-bab foo/ SensorEmulator untuk AVD.
J"pii .""ngrlami peimasalahan kompatibilitas
tidak memiliki sensor tersebut. Dari rabel 10.1 tampak terlihat dari sensor Accelerometer memberikan nilai
iimpi, semua seri perangkat mobile Android dari produsen ternama keluaran percepatan untuk 3 bidang, yaitu:
dan lainnya)
iS",,,iung, LG, Asus, Motor6la, HTC, Sony Ericsson, Huawei,
Jir"rt"i i"nroi Magnetometer'sebagai fungsi kompas dan sensor.orientasi 1. Percepatan lateral yaitu perpindahan posisi ke kiri atau ke kanan
(sumbu X),
,ntut iungri deteks] portrait landscipe memanfaatkan sensor Accelerometer
atau C-Se-nsor. Karena itu, penulis iarankan kita sebaiknya mengutamakan 2. Percepatan longitudinal, berupa perpindahan posisi maju atau mundur
memanfaatkan sensor tersebut dalam membuat project aplikasi' (sumbu Y),
3. Percepatan vertikalsearah dengan sumbu Z.Padasumbu inidigunakan
referensi percepatan gravitasi bumi yang bernilai 9,Bl m/s2 sebagai
Project AccelerometerDemo acuan keadaan rehat (nilai values t2I :0)"
Agar lebih mudah memahami implementasi sensor Accelerometer di mana
fu"ngsiJungsi
- sensor telah dijelaskan di atas, akan dipaparkan pembuatan
prd; A,irel"roreterDemo - Project i n i. adalah sample proigct dari website Agar suatu aplikasi dapat melakukan request update dari perubahan
iesmi developer Android (Sumber: http:lldevelope.r.android..comlguidel posisi, diperlukan Event Listener Sensor dan mengimplementasikan
samplesl). Yang merupakan aplikasi simulasi gerak b.ebas sei.u.mlah
bola SensorEventListener dan Sensor Manager menggunakan tipe Cbject
puirt aung"n irah pergerakan tergantung pada .sudut kemirin,gan alau Sensor Sensor. TYPE ACCELEROMETER dari sensor Accelerometer
Tiltiiriti iiung data, dIn merupakin modifikasi dari source code aplikasi tersebut.
Ail"i"i"rl"t"rFluy dari websiie Developer Android (http:/ldeveloper-
android.comlresourceslsampleslAccelerometerPlaylindex.html). Agar Sumbu Z
iirufuii menjadi realistis pada tiap simulasi pergerakan .bend3 tersebut akan q
Jin"iit un koefisien gesek secara berbeda. Untuk pendeteksian perubahan \
$udul Azimuth
sudut inklinasi menggunakan acuan dari sensor Accelerometer, berikut /\
tahapan pembuatan ProjectnYa:
suuutn*l
l.BuatprojectbaruAndroiddenganrinciansebagaiberikut: +t Sumbu Y
. Nama project : AccelerometerDemo
. Application Name : AccDemo (
Sudut Fiteh
. Package name : com.contoh.demo.accelerometer
. Create Activity AccelerometerDemoActivitY
, minimum SDK 4 Sumbu X fl,y
Build Target Android 1.6 (non-emulator)
Fitur minimal sensor Accelerometer atau G-Sensor Gambar 10.2 Pemetaan 3 dinensi dari sensor Accelerometer dan sumbu orienhsi

Karena dalam project ini memanfaatkan sensor Accelerometer maka cukup Nilai percepatan yang diperoleh dari sensor Accelerometer tersebut
rriii iiL" Jit"rapkin pada Emulator AVD, disebabkan hingga kini Emulator merupakan dampak dari adanya resultan gaya yang dipengaruhi (lr)
iib' Ai;r^ *"ny"diuk^n emulasi native sensor-sensor tersebut.
ini dapat
Sehingga
berjalan
dari massa benda, yangdidefinisikan dari Hukum Newton-tt(persimaan
tetap diperlukan perangkat Android fisik.agar.aplikasi 1 0.1).

;;ilri.'Meskipun dem'.ikian, kini telah dikembangkan project third-party

Perlrutirantal Sntirrl l'lrolr,Mr,lrlilittrt,tk,ttt',1)K Arrrltotrl rlatt ll,tt:kttlli Atlrlr6ttl


liAl't I0 Attltk,t,,t iilr,.rt Arrrlrorl 413
412
NoTitleBar. Eulf screen untuk mengaktifkan mode full screen
pada display (menutup titie bar Android).
memodifikasi file
4. Tahap selanjutnya yaitu. . proiect
Manifest
men.iadi
AndroidMuniJJ"t. xml dari AcceleratorDemo
Meskipun aplikasi ini membaca sensor Acceleratormeter, sistem
sePerti berikut: Android tetap mengijinkan aplikasi mengakses sensor-sensor yang
(manifest xmlns: android:"http: //schemas ' androi-d 'com/ tertanam di dalam perangkat tanpa memerlukan permission pada
Manifest.
apk/ res/android"
andro i d : ve r s i onCo de=" L"
android:versionName:"1' O" package:"com'
contoh' 5. Selanjutnya memodifikasi layout main . file
dengan xml
menghilangkan bagian tag TextView dari project AcceleratorDemo
demo. acceferometer"> menjadi seperti berikut ini:
<application arrdroid:icon:'Gdrawable/icon"
android : label=" G string/aPP-name"
)
< act ivl ty andro i d : name: "'
AccelerometerDemoActivity" <Linearlayour xmlns : andro id: "http : ,/,/ s chemas . androici .

androi,l : Iabef :" G string/app-name" com/ apk/ res/android"


and ro id : screenOrientation:"Portr android : o rientat ion:"vert. i ca I "
NoTitLeBar ' android : layouL_width: "fil l-parent "
aLL" android : theme=" G android: style /Theme '
android : layout he ighrt:"filI-parent,"
FuLlscreen''>
<intent-'filter>
<action androicl: name:"android' intent' </LinearLayout)
acticn.MAIN" /> Penghapusan tag TextView disebabkan pada project ini tidak
<category android: name="android ' intent '
diperlukan fungsi input teks atau display teks output. Dan alasait
categorY.LAUNCHER" /> lainnya karena diimplementasikan juga fungsi drawing image bola
intent-filter>
</ pejal dan bitmap background pada mode full-screen menggunal';an
class Canvas.
</activitY>
</aPPlicat j-on> 6. Tahap terakhir yaitu dengan memasukkan source code ke file public
<,-r se s - sdk android : minSclkVers
iorr=" 4" ></u se s - sdk> c/ass Acce I e rome te rDemoAct ivi t- y:
<uses-permi ssion android: name="android ' permission '
WAKE-LOCK" >< / u s e s -Pe rmi ss i on> package com. contoh . demo . acceleromeLer;
</mani fest>
lmport com. conLoh . demo . acce.IeromeLer . R;
LOCK untuk akses perubahan
Dari manifest terlihat permissonWAxE import androj-d. app.ActivitY;
state PowerM;;;;;; i"'oau wakeilocks menghindari prosessor
dan fungsi auto-/ock' import androj-d. content. Context,'
masuk ke mode sleep, dimmer padiJisplay,
Dalam t"s android: screl1-olientation import android . graphics . Bitmap,'
u
""[i;iiv
ntuk men gu i'"iy1pijm i den gan mensu ci' pada
;'.i;*;i"ti'atue mode
pos si
n
Theme
i

inrport- Anrlr. r rl.,l t,rJrlti cs.BitmapFactory;


theme pada '
statis portr;i;' ilg' Jiaetinisittan

t,,'11',111
llAll l0 Atrlrk,r',, fil1rlt,rrrl 415
4l4PemrogramanSmartPhotteMettlll'itttt.tk.lttlil)KArrrlrrrrrlrl.lrrll.rr:kttlHAndrotd
getSystemSei:vice (SENSOP. SERVICE) ;
import android. graPhics. Canvas;
import android. graphics . BitmapFactory ' Options;
/ / Jalankan instance PowerManager (utk
irnport android. hardware . Sensor;
pengaturan WakeLock)
import android. hardware. SensorEvent,'
mPowerManager = (PowerManager)
lmport android.hardware. SensorEventLisi:ener;
getsystemService (POWER SERVICE) ;
import android. hardware . SensorManager i
import android. os.Bundfe;
/ / Jalaokan j-nstance WindowManager
import android. os . PowerManager;
mWindowManager : (WindowManager)
import android. os . PowerManager'Wakelock;
getSystemService (WINDOW_SERVICE ) :
import androlcl . util . Disp-l-ayMetrlcs;
mDisplay : mWindowManager. getDef aultDj-splay () ,'
rr,pcr:t android - view - DrsPraY;
impor:t- androi-d. view - Su rf ace,'
/ / set layar display ke mode lock brigtrtness
i.mport an,:lroid. view.View;
ful-1
inpcrL andro.id. view. WlndowManager;
mWakelock : mPowerManager.
newWakelock (PowerManager. SCREEN BRIGHT WAKE LOCK,
public class Accei.erometerDemoAct'ivity extends
getClass ( )
ActivitY {
.getNarneO);
private SimulationView msimulationView''
private SensorManager mSensorManager; / insLantiate display simulasi dan set
/
sebagai content activity
private PowerManager mPowerManager;
mSimul-atlonView : new SimulaticnView(this) ;
prj-vate WindowManager mWindowManager;
setContentVi ew (mSimuf ationView ),'
private Display mDisplay; //defini-sikan display
]
C.efauIt Perangkat
private Wakelock mWakelock;
GOverride
protected voi-d onResume O {
super. onResume O ;
GOverride
mWakelock. acquire ( ),'
public voi-d onCreate (Bundfe savedlnstancestate)
supe r . onCreate ( savedl ns tanceState ); // lalankan simufasi
mSimufationView. startSimulation ( ),'

// Jalankari instance dari SensorManager )

msensorManager : (SensorManager)

- ',1 )K Attrltotrl rl'ttt I l,rr ktrrli Arrtitotrl


ItAll l0 Apltk,r',1 :,r'n',or nr,h,,rl 417
416 Pentrogranturr Srrurrl l'ltottr. Mtttlilittrl,tk,rlr
private float pusat SbY,'
GOverride private float mSensorX;
protected voj-d onPauseO {
private f).oat mSensorY;
super. onPause O ; private J-ong sen rNanoTime Stamp;
so
/ / StoP simul-asi- lonq private cpuNanoTirne Stamp;
msimutationView - stopSimulation ( ) ; private
float pj gBatasHori zont al ;
/ / non aktifkan fungsi wake-Iock private
fioat p j gBatasVerticai,'
mWakelock. release O ; private
flnal SistemPartikel mParticleSystem
) new SistemPartikef O;

cfass Si-muIat-ionView extends View imPlements ciass Particle {


SensorEventI,lstener { private float posX2;
,/ / diameter bola Pe al, dengan
j satuan meter
private float posY2;
Pri-vate static final float diameterBol-a = private float mAccelX;
0^004f; //d:4cm pri-vate float mAccefY;
pri-vate static final float diameterBolaKuadrat private fioat- posXl;
diameterBola * diameterBola,' / /L6cm private float posYl;
prlvate float satuminusGayaGesek; / /n* (.I-f)
// koefisien gesek dari meja virtual table -> m diabalkan , lihat persamaan 10.3
dengan bola Pejal
private static final float koefGesek : 0 ' 3f ; Particle ( ) {
final float nllaiacak : ( (float) Math.
Private Sensor mAccelerometer; randomO - 0.5f) * 0.6f; /1G0.1 < n < 0.1)
satuminusGayaGesek = 1.0f - koefGesek
Prj-vate long t.--awal; + nilaiacak; // 1,.0< n < 0.1
Private float dTawal-; )

private float mXDPi; public void komputasiVerlet (float sx, fioat


private float mYDPi; sy, float dT, fioat dTC) {
pri-vate float ml,lete rsToPixel sX ;
final float m = 1000.0f ;
private float mMetersToPixel sY ;
final float fx : -sx * m;
private BitmaP mBitmaP; finaf float fY : -sY * m;
private BitmaP mWood; final float invm = 7.0f / m;
prirrate float PusatSbX;

llAl't l0 Attltk,t',1 ',r'll'.rr nr,, h ,rrl 419


Iil )K Attrltrrrtl tl;trt llackttttl Anrlrrltrl
418 Pemrograman Smarl Plttlttr,Mt'tlHtltttr.rk.rrr
final float ax : fx )

final float aY : fY invm; if (y > ymax) {


= ymax,'
posY2
final float dTkuadrat :dT*dT; ) else if (y < -ymax) {

posY2 : -ymax;
final-floatl:PosX2 +
satumlnusGayaGesek * dTC
* 1posX2 - posxl) + mAccelx
dTkuadrat,'
)
finalfloatY:PosY2 +
*
satuminusGayaGesek
* d'TC * (posY2 - posYl) + mAccelY
cfass SistemPart.ikel- {
dTkuadrat;
posXl : PosX2; static final int JML_BOLA : 10;
posYl : PosY2; private Particle partikelN[] = new

posX2 : x; Particle [.TML BOLA] ;


posY2 : Y;
mAcceIX = axi SistemPartikel O {

mAccelY = aY; for (int i : 0; i < part.ikelN.length;


i++) {
)
PartikelNIi] : new ParticleO;
publj-c vold kalkulasj-TumbukanBataseidang o )

final float xmax : pjgBatasHorizontal;


integrator Verlet digunakan untuk
i /baLas bidang horj-zontal
final fioat ymax : PlgBatasVerL:-cal.; / / mengupdate
* posisi tiap partlkel pada sistem
batas bidang vertikaf */
final float 1 : posX2; //Poslsi x
private void updatePosisi (float sx, float
partikeJ- n
final float Y = posY2;//Post'si Y sy, J-ong tj-mestamp_now) {

final long t = tj-mestamp_now; //set


partikel n
if 1x > xmax) { time st-amp cpu dan sensor time stamp
PosX2 : xmax;
if (t_awal !: 0) {
fl.nal fioat dTakhir : (float) (t -
) else j-f (x < -xmax) {

PosX2 : -xrndxi
awal) * (1.0f / 1000000000 .0t) ;

IIAB j0 Aphk,r'.t l,r,tr',ot Anrhorrl 421


420 PemrogramanSmartPhonrlMtrttlllitttr.rk.rttlil)KAtrrltrrrrlrl.rrrll.rrkrrl,lArr<jrtlid
if (dTawal 1: 0) { boolean nlore : true;
/ / Perbandingan t' awal-
fj.nal int count : part.ikelN.length; //
simulasi s,/d waktu t :
jml bola
/ /<detLa>Tc = deltaT-akhir/ for (int k : 0; k < NUM MAX ITERATIONI;
dTawaf && more,'k++) i
flnal float' dTc : dTakhir / more : fal-se;
d'I'awar,' for (int i : 0; i < count; j-++) (

final int counL = PartikelN' Particle bolaN : partikelNlil;


length; for (inL j : i + 1; i < count;
for(inti:O;i<count; j++) i
i++1 { Parti-cIe bola :
Partlcle bola : partikelN Ij ];
partikelN [1] ; float dx : bola.posX2 -
/ / hiLung Posisi Partikel bolaN. posX2,'
menggunakan Persamaan Verlet float dy = bola. posY2 -
bola . komPutasiVerlet ( sx, bol-aN. posY2,'
s),, dTakhir, dTc) ;
/ / larak antara 2 bola
)
float cid : dx * dx + dy *
l dy;
dTawal- : dTakhir;
// saaL terjadi tumbukan
) partikeJ.
t_awal = L; //seL waktu awal dari time if (dd <:
stamp di amet.e rBoI aKuadrat ) {

) dx +: ( (float) Math.
random ( ) - 0.5f) * 0.0001f; / /dx:dx+translasi
Iong
Public vold uPdate (float SX, float sY, dy +: ( (float) Math
timestamP-now) { random () - 0'5f) * 0.0001f;
/ / takukan uPdate di- tiap Posisi-
dd:dx*dx*dy*
partikel 4.. -
uYr
updatePosisi(sx, sY, timestamp*now) ;
/ / t-enLukan koordinat
/ / maks iterasi komputasi tumbukarr trans las i
partikel finaf floatd: (float)
fiNAl iNt NUM-MAX-]TERATTONS
: IO;

I.lA[] I0 Alrltk.r'.t Arrrlroiri 423


"r'rr',or
422 PemrograrnanSmartlrtronr.Mr.trlilittlr.lk.rtr.,l)KArrlhrltrlll.rrrll.rr.krtltlAtrdroiti
SENSOR-DELAY-U] )
Mat.h. sqrt (dd) ; * penggunaan rate rendah bermanfaat
final float c : (0.5f *
mengurangi resource CPU dan
(diameterBola - d)) / d; * konsumsi baterai *
bolaN.Posxz -: dx
bol-aN. PosY2 -= dy
*/
bofa.PosX2 +: dx mSensorManager . regi sterLi stener ( this,
bofa.PosY2 +: dy mAccel-erometer, SensorManager. SENSOR DELAY UI),.
more = true; )

pub11c void stopSimulation O {


)
mSensorManager. unregisterListener (thj.s )

)
bolaN -

kaIkul-as iTurnbukanBatasBidang ( ) "


public SlmulationView(Context corrtext) {
)
super (context) ;
)
mAccelerometer = mSensorManager.
)
getDefaultsensor (Sensor. TYPE ACCELEROMETER) ;
publ ic lnt getPartlcleCount o
return PartikelN. tength; DisplayMetrics metrics : new
DisplayMetrics ( ) ;
)
getWindowManager ( ) . getDefaultDj-sp1ay ( )

getMetrics (metrics);
publi-c float getPosX(int i) {
mXDpi : metrics.xdpi,.
return PartikelN I j-]'PosX2;
rnYDpi : metrics.ydpi;
i
mMetersToPixelsX = mXDpi / 0.0254f; //
publi-c float getPosY (int i) {
konversi satuan dpi ke meter
return PartikelN Ii] 'PosY2; mMetersToPlxe]sY = mYDpi / 0.0254f.;
)
// instansiasikan image bol-a dan
)
background

public void startsimulati'on o{ CM


/ /ubah skal-a agar berdiameter sekitar 0.5

* gunakan rate rendah (didefinisikan sbg Bj-tmap ball- : BitmapFactory.

BAB l0 Apltk,t',t I't.rr'.or Arrrirord 425


424 PemrogramanSmartPhoneMcngi4tln;rk.rrrli|)KArrtlrrrrrlrl,rrrll.rr.krrrllAtrrjrtlid
decodeResource (getResources , R. drawable . ball) ;
( )
final int dstwldth = (int) (diameterBola *
GOverride
mMetersToPixeIsX + 0.5f) ;
public voj-d onSensorChanged(SensorEvent event)
final i-nt dstHeight : (intl (diameterBola *
mMetersToPixelsY + 0.5f) ;
if (event . sensor. getType ( l: Sensor.TypE_
/ /ubah bitmap bola dengan skala sama )
ACCELEROMETER)
dengan ukuran bitmap display
ratl1rn.
mBitmap : Bitmap' createScaledBitmap (ba'1,
dstWidth, dstHeight, true),'
switch (mDisplay.getOrientationO ) {
/ / saat perangkat dal-am state rotasi
Options opts : new Options O; derajat (searah kutub utara)
0

opts-inDither = true,'
case Surface. ROTATION_0 :
opts. inPreferredConfig : BitmaP.Configr.
msensorx : event.values[0]; //
RGB-5 65;
baca nilai percepatan bidang sumbu X
: BitmapFactory.
mWood
mSensory : event.values[1] ; / /
decodeResource(getResources O, R.drawable.wood, opts) ;
baca nilai- percepatan bidang sumbu y
i
break;
/ / saat- perangkat dal_am state posisi ke
GOverride arah timur
prot.ected void onSizeChanged(int w, int h, int
case Surface. ROTATfON_90 :
oldw, int oldh) {
msensorx : -event.vafues[1]; / /
/ / LriLung panjang dan lebar dari layar
baca nl1ai percepatan bidang sumbu X
display utk menentukan pusat
mSensory : event.values lOl ; / / baca
// sb X dan Y nilai percepatan bidang sumbu y
pusatSbX : (w - mBitmap.getWidthO) *
break,.
0.5f ;
pusatSbY: (h - mBj-tmap.getHeightO) * / / saaL perangkat da1am state posisi ke
n trr-
arah se]atan
case Surface. ROTATION_1g0
plgBatasHorizontal- : ((w :
mSensorX : -event . values [0 ]
mMetersToPi-xelsX - diameterBola) *0 .sf),' ,.

mSensory : -event.values [1] ;


pjgBatasVert-lcal : (( h/ mMetersToPixef sY
break;
- diameterBola) * 0.5f);
/ / saaL perangkat dalam state posisi ke
]

426 Pemrograman Sn rut t Plrrrttr' Mlttl ilitttr, tk, rr il)h Arrrlrrrrri rl,rrr I r1'Atrrltrrrd
l0
r I

BAti Alrhk,r.,r',r,rr,,rrr Arrrlrorrl


427
final float Ys : mMet.ersToPixeIsY;
arah barat final BitmaP bitmaP : mBitmap;
surface'RorATroN-270:
"use final int count : partj-cleSystem.
msensorX : event'vatues [1] ;
getParticf eCount O
msensorY : -event'values [0];
,'

for (int i : 0; i- ( count; i++) i


break; final float x : xc + particlesystem'
) *
getPosX(i) xs;
/ / seL timestamp event sensor dan CPU finaf fioat y : yc - ParticleSYstem-
setiaP Perubahan orj-entasi getPosY(i) * y";
sensorNanoTimeStamp : event'timestamp; .-.tus . drawBitmap (bitmap, x, Y, nul-l- ) ;
cpuNanoTimestamp : System'nanoTime O ;
,
) / / lakukan drawi-ng ulang
invalldate O;
/ fuogst drawi-ng image bola dan bidang
daLar
/ )
@Override GOverride
protected void onDraw(Canvas canvas) { public vold onAccuracyChanged(Sensor sensor,
/ / draw menggunakan canvas
image bidang
int accuracy) {
datar
canvas-drawBitmap(mWood' 0' 0' null)
)
;
)

: )
final SlstemPartikel particleSystem
mParticIeSYStem; Dari class AccelerometerDemoActivity tersebut terlihat
final tong t-imestamP-now : menerapkan sejumlah persamaan fisika diantaranya hukum NeMon,
fungsi lntegrasi Verlet dengan modifikasi fungsi waktu, dan penerapan
sensorNanoTimeStamp + (System'nanoTime
o generator nilai random sebagai nilai faktor koefisien gesek dari tiap
bola pejaltersebut.
cpuNanoTimeStamP) ;
finaf float sx : msensorXi Bagi pembaca yang belum memahami hukum-hukum fisika dapat
membaca referensi buku-buku Fisika di dalam bab Mekanika Klasik.
final float sY : mSensorY;
Disebabkan aplikasi ini mensimulasikan pergerakan suatu benda bola
pe.ial akibat dari gaya luar, yaitu perubahan sudut inklinasi dari bidang
particJ.eSystem.update (sx, sY' timestamp- datar virtual. Caya tersebut didefinisikan dari Hukum ll Newton, yaitu
now) ,' iika lumlah gaya yang bekeria pada suatu benda tidak sama dengan
nol maka iumlah gaya tersebut akan sebanding dengan percepatan
yang dialami benda. Konstanta pembanding antara iumlah gayl lan
final floaL xc : Pusatsbx; periepatan adalah massa benda tersebut. Yang didefinisikan dalam
finaf floaL Yc : PusatSbY; persamaan 10.1 .
final float xs : mMetersToPixelsX;

ttAt) l0 Althk,r',t lit'tl'.ot Attrltortl 429


ljl)K Arrrlrorrl rl'rrr I l'rr krttli Attrlrottl
428 I'crnro[]rattl:ttt Sttl;ttl l'ltotl0 M0ttlllltttt;tk;rtl
Tr' (10.1)
\f
am =m.a atau o=L:- c. Saat perangkat pada arah ke selatan (nilai pengembalian state rotasi
sebesar 180 derajat), sensor Accelerometer memberikan keluaran
penggunaan tipe sensor values IO ] untuk sumbu X dan values [1] untuk sumbu Y
Dengan nilai percepatan a diperoleh.dari yang keduanya bernilai negatif.
ini tanpa
TypE ACCf LSnOi"tEf ER yang pada implernentasi.aplikasi
pada bagian d. Saat perangkat diposisikan ke barat (pengembalian stale rotasi sebesar
*"Lf.rf.", pror"r-kJibrasi' Selperti yang ditunjukkan
270 derajat), sensor Accelerometer akan memberikan keluaran
kode berikut:
sumbu X values [0] bernilaipositif, dan sumbu Y values [1]
public void onsensorCha:rged(SenscrEvent event) i bernilai negatif.
:
r f ( event' sen sor' getTlT)e ( ) I Sen s
or' TYPE-ACCELEROMETER)
return;
lmplementasi method geLOrientation O tergantung pada sensor
switch (mDisplay'getorientationO ) {
orientasi. Jika perangkat tidak menyediakan sensor orientasi maka
case Surface'ROTAIION-O : / / seara]n kutub utara
msensorX = event.walues [0i ;
pengembalian Surface selalu bernilai nol, untuk implementasi suatu class
msensorY : event.values[1]
dapat disederhanakan tanpa method get.Orientation dan statement
" switch, sepedi pada contoh berikut:
break;
case Surface.ROEATION-9O: //arah timur
msensorX = -event'values[1] ;
public void onSensorChanged(SensorEvent event) {
msensorY = event.walues [0] ;
i-f (event.sensor.getTypeo I: Sensor. TYPF_
break;
Surface.ROTATION-18o: //searah kutub selatan ACCELEROMETER)
msensorx : -event'values [0] ; return;
msensorY : -event'values[1] ; : event.values [0] ;
mSensorX
break;
Surf ace.ROTATION-21 : / / arah barat
O mSensorY : event.values [1],'
msensorX = event.vatues[1] ;
msensory : -event.walues [0],' Dari kode tersebut. pengembalian values [0] dan vaLues [1] selalu
break; bernilai positif yang tidak bergantung dari orientasi Surf ace, cara ini dapat
] digunakan pada Android yang tidak mendukung sensor orientasi.
Sensor Accelerometer secara native menggunakan satuan Sl (m/s2) sehingga
statement switch
Dari kode di atas method getorientation o dan (atau besaran-besaran lainnya harus juga menggunakan satuan Sl. Berikut adalah
;;s";;;"ntu sudut .H-s;;iice pada sumbu Z sudut azimuth) bagian kode dalam method komputasiVerlet O yang menentukan
bernilai positif, sebagai
herruiuan asarmsensorx dan msensorY selalu besar percepatan tiap bola pejal:
dan sumbu y. Karena pada beberapa sensor
ffi;;;i;il1;;;rrk sumbu X dari arah medan magnet bumi sebagai publ1c void komputasiVerlet(float sx, float sy, float dT,
Accelerometer menggu;;kan
'eferensi
penBukur percepatan. Berikut penjelasannya: float dTC) {
a. Saat perangkat sejaiar kutub utara (dari nilai pengembalian state final float m : 1000 . 0f ; ,/,/ massa bo]a 1000 gr=1k9.
memberikan
rotasi sebesar'o"i"l"irtl maka sensor Accelerometer sx, sy nilai percepatan
X dan sumbu Y'
keluaran percepatan positif sumbu
final float fx : -sx * m,' / / qaya yang di-alami bola
perangkat pada arah ke timur (nilai pengembalia.n state
rotasi
b. Saat -i"nro,
pada sumbu x
sebesar g0 d;;,att Accelerometer memberikan keluaran
values [1] nernitai negatif untuk sumbu X dan values [0] final float f y : -sy * m; / / qaya yang dialami bola
bernilai Positif untuk sumbu Y'

430
pemrogranran Srnrrl l'ltrrrtl\MItrlllittlt,tkatt Iit)K Arrrlrorrl drrr 1l;rr krtIi Arrrlrrtirl tJAIJ l0 Attllk,t'.r l,r'tt',rt Arrrltlrrl 431
pada sumbu Y
Persamaan 10.2 diimplementasikan pada method komputasiVerlet ( )
untuk menghitung translasi tiap bola menggunakan modifikasi persamaan
verlet waktu terkoreksi (Persamaan 1o.2.1) karena persamaan 10.2 tidak
final float invm: l.Of / m; // I/n meng-handle At secara langsung.
finaf float ax : fx * invm; / / percepatan bola n

untuk koordinat x x(t-a)= 6(,)- x(r-nt)\


finatfloatay:fy*invm;//percepatanpartikel *: (10.2.1)

n untuk koordinat Y
*Q - nt) didefinisikan sebagai vekror posisi awal bola pada koordinat x, dan
pada implementasi class ini, sejumlah variabel digunakan tipe data primitive
""lf"i '[onttrnt" diberikan parameter. tambahan "f" "i(l) sebagai vektor posisi setelah translasi bola pada titik koordinat xr.
float masing-masing
;;;i"h;y; i"i"r. "irri p"cahan o,s :
o'sf, tipe data float digunakan
karena aplikasi ini n.."n"iup[rn prot"t iterasi komputasi agar memperoleh Besaran Lt,,-u1 dar'rLt,ro,, adalah waktu yarrg dibutuhkan tiap langkah
keakurasian Yang lebih baik. "hinggu
sinrulasi saat menjalankan proses komputasi drawing canvas,
gava f,111 dialami dengan diimplementasikan dalam method updateposisi
Dari bagian kode di atas tampak pada simulasi ini ftl1rg o darivariabel
(yang dianggap sama) sebesar trmestamp_now awal (dTawal) dan akhir (dTakhir).
ffi; ffi;, f,rnvu Altuntukan
tiJrf.
dari percepatan
mengalami gaya normal W :.m'g yang searah
s s clan benda diang*ro
,fi$;';. il;r";iir:?; akan diplroleh dari sensor Accelerometer seperti
yang dituniukkan dari peisamaan berikut: private void updatePosisi (float sXr float sy, long
.'(r,,r,) timestamp_now)
F i.' F-,F. {

a.,,a,=T='t=-:: =s,,.s, (10.1.1)


final long t : timestamp_now;
if (waktuT I: 0) {
fj.nal float dTakhlr = (float) (t - waktuT) *
Itegrator Verlet
(1.0f / 1000000000.0f) ;
bola akan digunakan if (dTawal !: 0) {
Sedarrgkan sebagai fungsi translasi dari tiap
t;;iljans aiir"nrfrn?alim persu.a.an 10'2 berfungsi :"q"qqi 'ntegrator
algoritma // perbandingan t awal simulasi s,/d. waktu t
';t
+N), tiap part.ike! did.efinisikan dalam
ii^,iti^lti iuutu partikel"Vrit,
tioiiinut cartesiian (x,, v) dimutii padi waktu t selama bt '
final float dTc : dTakhir ,/ dTawal;
final 1nt count : partikelN.length;
i(t + rt)= t(,)* ;(r)ar + LaQ)nt' = ;(r)* xQ - tt)+ )a@u' (1 0'2)
for (int i : 0; i ( count; i++) {
Particle bof a : partikelNI j-],-
pada persamaan 10.2, besaran f
didefinisikan sebagai vektor posisi suatu i/ hitung posisi partikel
t;; ft;koordinat (*yl, Uurrrrn t adalah waktu saat mulai translasi dan
yang ditentukan dari kecepatan
menggunakan persamaan Verlet
;t-";.ka; V"rg aiOri,ih[an saat translasi
bo1a. komputasiVerlet (sx, sy,
atral sebesu, i drn f"i."prtin d ' Dari pe'simaan 10'2'
besaran ."(')-41
Jid"iiniritrn ;(r-ar)
sebagai karena ;(r)ar merupakan fungsi translasi pada dTakhir, dTc);
arah vektor selama t - Ll .
]

Irt,iltr0l,rirr|,rn Srtt,trl l'lliltlt'l\4r'rll:l'rrlr,r11,rrr "ltl1 [;lrllrrlrl


rl'rtt ll'tr kttlll AtrrltOttl llAtt l0 Apltk,r',r n n(lror(l 433
432 "r'n',or
dTawal : dTakhir; protected void onDraw(Canvas canvas) {
) canvas.drawBitmap(mWood, 0, 0, nuII) ;
waktuT : t; / / set waktu awal dari time final- SistemPartikel particleSystem
stamp mParti cle Sys tem;
) final Iong timestamp_now : sensorNanoTimeStamp +
(System.nanoTime O - cpuNanoTimestamp) ;
langkah
Adanya faktor pembanding antara Lt o*o, dan Lt oro, karena setiap
pergeiakan partikel antara Lto-,, danLtooro terdapat. perbedaan waktu Nilai sensorNanoTimeStamp dan cpuNanoTimeStamp akan
dik'rsaran nano sekon seperti yang ditunjukkan pada Cambar
10'3' event Sensor seperti yang ditunjukkan
diperoleh setiap pengembalian
pada bagian kode berikut:

GOverride
Translasi bola iQ + N) public void onSensorChanged(SensorEvent evenL) {
if (event . sensor. geLType O l: Sensor. TYPE
OO O{r]rlrlrO ACCELEROMETER,)
return,'
msensorx : event.values[0],' // baca nilai
percepatan bidang sumbu X
,:O U'V msensorY : event.vafuesll.); / / baca nl1ai percepatan
Lt o .ot Lt oor,, bidang sumbu Y

Gambar '10-3 Transtasi bola tiap siklus sinulasi / / set timestamp dari event sensor dan sisLem tiap
event Sensor
sensorNanoT j-meStamp : event. timestamp;
Pada persamaan 10.2.2 ditunjukkan perbandingan antara L.t^"1 -!?\
'A;;,,.-;iJ;finisikan
sebagai A/. seperti
yang diterapkan pada method cpuNanoTimeStamp : System.nanoTimeO ;
up"ciSteposisi O dengan nama variabel dTc: )

;(r + ar)= t(,)* G(,)- ;(r -ar))' Lt, * .La(')t" (10'2'2) Selanjutnya, agar simulasi gerak partikel bola pejal menjadi lebih realistis
diperlukan penambahan gaya gesek setiap translasi bola sebesar fu, gaya
gesek tersebut untuk mensimulasikan permukaan bidang datar tidak licin
seperti yang ditunjukkan pada Cambar 10.4. Sehingga persamaan 10.2.2
Pada method onDraw variabel timestamp-now untuk menyimpan akan berubah menjadi:
iumlah time-stamp sistem dan time-stamp event yang maslng-maslng
;i;;;i"h';"nggunakan method sysrem.nanoTlme o dan dari event
sensor Accelerometer menggunakan method event ' timest.amp' ;(r + ar)= i0)* (t - f o) {t(,)-;(r - lr)}. nt, + d(t)nt2 (0 2 3)

Pcnrr0llrar|;rrr Iirrr;trl l'lrrrrrr, Mr,lrl:l:lrl|,lk,lrr


rlr, Atrrltilrrl rl,rtt l l,l, htrrli Atrrltottj llAt3 l0 Apltk.t',t iit'tt'.ot Attrltotrl 435
434 "l
Posisi bola pada waktu t d.apat dihitung menggunakan persamaan
fu, -f* .l ki
f* 10.2.4
direntukan daii percepatin a, di"n a, yrrdr";i;;entasinya
tiLi,lilf 1,_y,
ditunjukkan pada method kornputasiveriet o' sep6rti berikut
I public void komputasiVerlet (float sx, float sy, float
ini:

/_ dT,
n... o::: {

final float dTkuadrat : dT * dT;


Gambar 10.4 Titik pusat kordinat dan gaya gesek ttap partikel
x : posX2 + satuminusGayaGesek * dTC *
final_ float.
Koefisien fu gesek masing-masing bola tidak bernilai sama karena akan di-
(posX2 - posXl) + mAccelX * dlkuadrat,.
generate secara acak melalui method Math. random O dengan tipe data final float y : posy2 + satuminusGayaGesek * dTC *
float. Seperti yang ditunjukkan pada bagian kode berikut: (posy2 - posyl) + mAccely * dTkuadrat;
ParticLe O { posXl : posX2,.
/ / generate koefi.sien gesek sedikit berbeda utk tiap posYl = posy2;
partikel posX2 : x,.
PosY2 : y,'
1.0) mAccelX : ax;
final float nilaiacak: ((float) Math.randomo - 0.5f) * mAccely : ay;
0.6f;//l-0.1 < n < 0.1) i
satuminusGayaGesek : 1.0f - koefGesek + nil-aiacak; //
1.0< n < 0.1 Pada project simulasi ini, titik pusat dari sistem koordinat
cartesian mengacu
pada,titik^tengah dis.play (Cambar 10.4) yang didefinisikan
) onS i zeChanged berikut:
l;lm method

Dari kode tersebutvariabel koefGesek


menggunakan tipe final static GOverride
float. dengan koefGesek :0 . 3f dan besar gaya gesek dimasukkan protect.ed void onSizeChanged(int w, int h, int
ke variabel satuminusGayaGesek untuk digunakan oleh method o1dw, int oldh)
komputasiVerlet ( ) . t
/ / hitung panjang dan l_ebar dari 1ayar
Selanjutnya, dari persamaan 1O.2.3 tersebut akan didefinisikan dalam
koordinat cartesian x,y untuk digunakan pada proses komputasi dalam display utk menentukan pusat
method komputasiVerl-et ( ) menjadi sepefti berikut: // sb X dan Y
pusatSbX: (w - mBitmap.gett{idthO) * 0.5f;
x,: xz+0- "f)'{*, - *,}'Al. + a*Ltz pusatSby = (h - mBi-rmap.getHeightO ) * 0.5f;
(10.2.4)
! t = !z* 0 - /). {y, - y,}. tt, + a,Ltz pjgBatasHorizontal : ( (w / mMetersToPixelsX
- diameterBof a) * 0.5f ) ,.

436 Pemrograman Srrarl I'ltonl Mrtttl:l:tttr,rk,rrt ',1 lh nnrlrir(lrl.rrr ll,rr krn11 Atrrirrttrl RAR I0 Ayrhk,r,,r l,r,rr,,or Arrrlroirl
437
pjgBatasVertical : ( (h / mMetersToPixelsY - ditunjukkan pada persamaan '10.3.1 dan Cambar 10.4, besaranAx adalah
jarak kedua bola pada sumbu x dan Ay adalah.iarak kedua bola pada sumbu
diameterBofa) * 0.5f) ; Y.
)

pj gBatasHorizontal- dan p j gBatasVerticaf digunakan Ax2 + Ly'=d' (10.3.1)

sebagai referensi p.;f*; batas horii6ntal dan vertikal


bidang datar
dalam method kalkutlsitumbukanBatasBidang ( )' SedanSkan
mMetersToPixetsXdanrnMetersToPixefsYsebagaivariabel
konversi dari satuan sl-i*"i"tl ke satuan dpi
(dot per-inch) yang diperoleh
;;;i ilr.;-pixet aisptay *"nggun"kan .method metrics . xdpi- dibagi
J"rg"n O .OZSaf yangdidefiiisikan dalam method Simulationview:

public Simul-ationView(Context context) {

super (context);
mAccelerometer mSensorManager '
gr: r- D e f au I t e n s o r
S (Se n s o r' TYPE-ACCELEROMETER ) ;

DisplayMetrics metrics : new Displaylletrics O;


getWj-ndor.vManager ( ) . getDefaultDisplay ( )'
getMe'-ric s (metri cs ),'
: metrics 'xdPi;
nrXDPi
mYDP.i = met-rics'YdPi;
Gambar 10.5 Saat blla 1 dan bola 2 saling bertumbukan
mMet_ersTopixelsX : mXDpi / 0.0254f; //
konversi satuan dPi ke meter
Untuk mengukur .iarak r antara partikel n diperlukan iterasi sebanyak n x
nMetersToPj-xelsY : mYDpi / O'O254f ; n, yang diimplementasikan menggunakan statement loop for. Untuk
meningkatkan akurasi perhitungan tumbukan perlu didefinisikan variabel
lebar display dalam NUM MAX ITERATIONS sebagai iterasi tambahan pengukuran jarak r
Dalam method kornputasive::1et o , panjang dan
tiai( ukura,n dari display' pada n partikel, yaitu pada pada method upclate O sebesar 10 sehingga
satuan pixel agar r-irir"r[* translasi
Waktu saat tumbuk""?ii"Jia"pui Jit 'netarnpaui
dari dengan iarak an.tara kedua total iterasi : 10 x '100 - 1000.
"tulrri yang dituni ukkan
i;i,L prtri Ool,,"ngg;"i].,n 6urt", Pythagoras. sefierti Setelah tumbukan terjadi, partikel bertranslasi dengan derajat kelentingan
antara kedua titik pusat
puJ"-J""r*aan tO.i"dengin ,. adalah besai larak sempurna masing-masing sebesar dx dan dy (Cambar 10.5) besaran translasi
bola. di-generate menggunakan method Math. random ( ) yang lebih lengkap
ditujukkan dalam method update berikut ini:
f= *'*y' (10.3)
public void update (float sxr float sy, long timestamp_
now) {
X,,Y1 dan .bola 2 nud' x"y' yang
Saat bola pertama berada pada koordinat / / Lakukan update di tiap posisi partikel
keduanya berdiameter;;[,| bertumbukan iirt ;rrat r sama rlengin d yang

- pemrograman Smart phonc Mcrrggrrrr.rk,rrr lil)K Atttltottl tl,rtt ll,rr krrrll Artdrord IIAII l0 Atrltk,r',t lit,rt',ot Atttlt.trl 439
438
uPatstePosisi (sx, sy, timestamp_nor); tr:anslasi
// batasan iterasi NUM MAx ITEMTIONS untuk final float d = (float)
komputasi tumlcukan partikel !4ath. sqrt (dd);
final int IUU_UaX_ITERATIO{S : 10; final float c = (0.5f *
tr:ue;
boolean nore = (dianeterBofa - d)) / d;
final int count = parti kelN. t€ngth, //jn] bolaN.posx2 -= & * c;
bola bolaN.posY2 -= dy * c;
for (int k = 0; k < NI,U IAX IIERATIoIIS && bola.posx2 +: dx * c;
inore; k++) t bofa.posY2 += dy * c;
nore = false, more : true;
for (int i=0; i < count; i++) { }
Particle bolar = pertL].€tNlil; ]
for (int i : i + 1; j < count, // kalkulasi tumbukan dengan
j++) { batas bidanq
Particlebola=boIaN
partikelN I j I ; kelkulaaifutlbukanB.tasBidarlg ( ) ;
float dx = bola.posx2 - )
bolaN.posx2; )
float dy = bola.posl2 - )
bo]aN.posY2;
pengukuran jarak
/ / Sedangkan kalkukasi simulasi tumbukan dengan
anrara 2 bota latgs_ bidang diimplementasikan dalam meth-od
kalku.IasiTumbukanBatasBidangOyan8 ditunjukkan
float dd = dx * dx + dy *
sebagai
berikut:
dy, // saat teriadi tun oukan
partikef
{
dia[6tolBoraxuacEat] {
dx += ((float) Math. finar float :(t!!x = p jgBataB[olirontar; //batas
bidang horizontal
ranclom0 - 0.5f) * 0.0001f;
dy += ((float) Math. finar float l'Eex = pjgBatl3ve.tical; //batas bidang
random{) - 0.5f) * 0.0001f; vertikal
dd= dx * dx + dy * ciy; final float x = posx2; //posisi x partikel n
// tentukan koordinat final Jloat y = posy2;//posisi y partiket n

440 - Pemrograman Smart Phone Menggururkarr S[)K Attrlrotrl rl,rn ll;rr:krng Android llAtl l0 Aphk,t',t :rr!r',rr n lrhrrrl 441
// saat bola n pd titlk xmax,definisikan nilai- x
particleSystem.update(sx, Sy, timestamp now) ;
tetap di
if (x > :<rnax) {
final float xc : pusatsbX;
PosX2 : xmax;
final- fl.oat yc : pusatsby;
)
nilai final- float xs : mMetersToPixel-sX;
/ saat partikel n pd titik
/ -xmax, definisi-kan
final- float ys : mMetersToPixelsy;
x tetap di -xmax
final Bitmap bitmap : mBitmap;
else if (x < -:<rnax ) t
posX2 : -xmax;
final int count : particlesystem. getparticleCount. ( ) ;
for (lnt i : 0; i < count; i++) {
]
final float x : xc + particleSystem.getposX (i)
if (y > ynax) { * xs;
posY2 : ynax;
final float y: yc - part.iclesystem.getPosy(i)
) el-se if (y < -ymax) {
* ys;
PosY2 = -frynax;

]
canvas.drarBitmap (bi-tmap, xt y, null) ;
)
1
// lakukan drawj-ng ulang
lrlilai xnax dan ymax diperoleh dari method onSizeChanged O . Fada
lnvalidate O;
saat bola pada posisi kurang dari -xmax atau melebihi xmax maka posisi l
poslt2 dan posY2 dibuat tetap konstan pada xmax, ymax atau -xmax,
-ymax. Variabel Bitmapakandiinstansiasikan kedalam method S i_mulationVj-ew
dengan merubah skala ukuran image bola menggunakan method Bitmap -
Fungsi drawing pada Accef erometerDemoActivity di-
createscaledBitmap, seperti yang ditunjukkan pada potongan kode
implementasikan dalam onDraw O menggunakan method canvas "
berikut ini:
drawBitmap yang ditunjukkan sebagai berikut:
public Simul-ationView(Context context) {

GOverride
,r'r.r"""rrsiasikan image bola dan background
protected vold onDraw(Canvas canvas) {
//uball skala agar berdiameter sekitar 0.5 cm
canvas.drawBitmap(mWood, 0, 0, nufl) ;
particleSystem
Bi-tmap ball BitmapFactory.
final SistemPartikel-
decodeResource (getResources O , R.drawable.ball) ;
mParticleSystem; final i_nt dstWidth : (int) (diameterBola *
final long tlmestamp-now : sensorNanoTimeStamp +
mMetersToPixelsX + 0.5f) ;
(System. nanoTime O - cpuNanoTlmeStamp) ;
final int dstHeight (int) (diameterBoJ-a *
final float sx : mSensorX;
mMetersToPixelsY + 0.5f) ;
finaf float sY : mSensorY,'

BAB l0 Apltk,r'.t lirrtr.,rrt Arxlrrrrrl 44:l


442 Pemrograman Smart Phonc MCrrgl,lrrrurlr,ur lil )K Arrrlrorrl rl,rrr ll;rckrng Android
/ /ubah bitmap bola dengan skaia sama dengan ukuran
bitmap di-sp1ay
mBitmap Bitmap . createScaf edBitmap (ba1 1,
dstWidth, dstHeight, true);

Options opts : new Options O ;


opts. inDither : t.rue;
opts.inPreferredConfig : Bitmap.Config.RGB 565;
mWood ei-tmapfact.ory.
decodeResource (getResources ( ) , R. drawable . wood, opts ) ;
)
Gambar 10.1 Simulasi AccelerometerDemo pada perangkat Android

Secara garis besar, diagram alir dari simulasi Accelerator Demo dapat
ditunjukkan pada Cambar 10.6. Setelah file class telah dibuat dan di-run Tool SensorSimulator
pada perangkat Android maka simulasi translasi bola akan langsung berjalan
seperti yang telah dijelaskan sebelumnya, kini telah tersedia aplikasi third-
yang tampak pada Cambar 10.7 -
party Sensor Simulator (Cambar 10.8) merupakan bagian dari project
o pe n I ntents
(s u m ber: www. o pe n i ntents. o rg) sebagai fungsi em
u as i'sensor I

menggunakan Emulator AVD seperti yang ditunjukkan dalam Gambar '10.9

Update posisi bola


particle.q,ste 6lr'tlcr0tt|i ifl Bt
. uPdate rtr*rm*:* ii---' s k'*ll.J
t. i{ci&r6ldu Fi*lrps6s iiri-"*ot
*iE(dr(d,rh, iri d, rSftrofiDsrr. ir1],i- r*
!hta{.:{*r: !:, _,_. pi r*cc|rffrft
Ithffi i.lrEffie lrtdca cft?qff; Xld'r
4 j-t m inf

Sei posisi bolai


bola . kcq[tasivdlet Gambar 10.8 Sejumlah fungsi enulasi Aplikasi SensorSinulator
(*,sy,dfakllir,dac)
(S um b er : h fip ://cod e. g oog I e. c o nilp/ope n n t e n ts/wi ki/S e n s o r S im u Ia t o r
)
= evst.Elues [0]
= erEt.vaf@s [1] Aplikasi Sensor simulator dapat diunduh pada website komunitas
openlntents-Qoogle Developer dengan URL: http:/lcode.google.comlpl
openintents/downloadsllist dengan nama file sensorsimulatoi-t . i.o-rct .zip
yang di dalamnya terdapat 2 aplikasi binary (dalam direktori /b-Ln). yaitu
aplikasi java. sensorsimuf ator-x. x. x. j ar sebagai aplikasi scrver
side dan aplikasiAPK dengan nama file sensoisimulaLorset tirr<Js-
x . r - x. apk untuk diinstalasi melalui Emulator AVD targ,et B.rlkut
dijabarkan tahap-tahap penggunaannya:
1. Jalankan aplikasi sensorsimul-ator-x. x.x. jar p;rrl,r pc' l rost
Gambar 10.6 Diagran ali simulasiAccelerator Demo sebelum menjalankan Emulator AVD Aplikasi ini-berfurrlisi sr.lr,rgai
service server side SensorManagerSimulator.

444 Pemrograman Smart Phone Mt:ttlilittttak;ttt lll)K Arrrlrorrl rl,tn llirt.ktnli Atrrirrrtrl llAli l0 Agilrk,r.,r i,r,rr,.or Arrrlrrrrrl
445
Openlntefils Senso' Slmulalo'
3. Lakukan modifikasi pada project target, rinciannya dapat dijelaskan
sebagai berikut:
Yr n;;i::;:j:l-
Xrl -- .--* - ' - lmport librari sensorsimulat.or-1ib-x . x. x . j ar ke
ri+
'.T1 M j::--i=::-':.5:-1- dalam direktori lib/ pada project Android target.
s.stt0ls
rary - Deklarasikan import class sensorsimuf ator dalam project
trF6ffir aplikasi menjadi seperti berikut:
tF**r6raailnm_:;s.r}'{*
ss :rt I ro : licre
**:I
r.:,i:6;,i,iltiit- ii ffHe
lt:l.r:i: a::
i,-r*rrlrirr.*1r
;
i I
:
1''tsrffis import org. openi-ntents . sensorsimulator. hardware.
-' tdsr Sensor;
;;;;;;rii',r,;;-*"; *d.*
i:itii;l.i;;1",I,;':l' 1l
:
;;; import- org. openintents . sensorsimulator. hardware .
a
- -.E'!a{9: SensorEvent;
Gambar 10.9 Aplikasi iava SensorSimulator import org. openintent s . sensors imul_ator . hardware .

(S u m be r : h ttp ://code. goo g I e. c on/p/op en in tents/wi k i/S e n sor S i m u Ia to r) SensorEvent.Li tener ; s

2. lnstall dan jalankan aplikasi SensorSimulatorSettings- import org. openintents . sensorsi-mulator. hardware .

x . x. x. apk pada emulator target dengan men-set nomor lP dan Sens o rManagerS imul ato r i
nomor port (socket) yang nomor tersebut dapat diperoleh dari aplikasi
server SensorManagerSirnulator (Cambar 10"10). Aplikasi ini pada
dasarnya merupakarr service sehingg,a dapat terhubung ke server - Selanjutnya ubah kode di dalam state onCreate ( ) :
SensorManagerS i m u ator dan apl i kasi proj ect- : SensorManager ) getSystemService
I
mSensorManager ( ( SENSOR
SERVICE) ;

Menjadi seperti ini :

i:,rltlil;lr&T'{:
mSensorManager : SensorManagerSimulator. get.Systemservice ( this,
SENSOR-SERVlCE) ;

- Untuk menghubungkan ke service sensor simulator,


gunakan konfigurasi yang telah diset pada aplikasi
SensorSimulatorSettings. apk dan telah ter-insta//
pada emulator dan ditambahkan pada kode aplikasi menjadi
seperti berikut ini:

mSensorManager. connectSimulator ( ) ;

Gambar 10.10 Konfigurasi (a) lP dan socket (b) SensorS imulatorSettings pada
Untuk kode lainnya tidak diperlukan perubahan signifikan, cukup dengan
Enutal0r AVD (Sumber: hTpthode.googte.com/p/openintents/wikilSensorSinulato) meng-unregrster sensor yang ada dalam state onResume ( ) dan state
onStop ( ) . Contohnya seperti pada bagian berikut ini:

Pemrograman Smart Phone 1il)K AruIorrl rl,rrr ll;rr.ktn11 Androiri


446 Mr_.n111irrrr;rk;rrr
ItAlt l0 AlrLh,r'.r',,'rr.,'r /\rrlrrrtl 447
€Overiide // Iakukan proses selanjutnya darl data sensor
protecLed woid onRe8une O{ )

super.onResurE O i )
mSensorManaqer. registerLi stener ( this, mSensorManager .
q e t D e f a L1 I t s e n s o r {sensor ' ttPE ACCELERoUETER)
' - setelah modifikasi seresai, aktifkan aplikasi
sensorManaqer. SENSOR_DELAY_EASTEST) , ."*.r, AVD dan ApK client
msensorManager. reqisEerlistener ( this, nsensorManager. "ensorsimulator "Inrlrto,
Sensorsimulatorsettings yang diikuti prcses running
qetDefaultsensorlsensor.IYPE-MAGNETIC-EIELD), aplikasitarget'

SensorManager. SENSOR-DEI-AY_FASTEST) ;
msensorr4anager. regi sterlisrener ( rhis, msensor:Manaqer . Perlu diketahui fungsi SensorManaqersimulatot pada class Open,ntents

serDe r aur ! s en sor i sens or. rypE-oRrENrArroN) . ilru:f*ru:H:1:iT"i*tr',Jr{f,'l'"t"jf ilfiffi,:i'Hl5,il:T]Xl:


Sensoruanaqer . SENSOR_DEIAY_EASTEST ) ; lihat dokumentasi Android bagian class Android. hardware .
sensorManager. registerlistener {rhis, msensorManager. sensorManager. Sedangkan untuk proses Ca/rback, dapat
se tDe r au r t s. n 6 o, s e n s o r . r
( y pE-rEr{pE RATuRE ) , *ll}l"Jilflii:"*'lfi,:Tfir1::ntusteng
iensannJunssi vang

SensorManager. SENSOR DELAY,EASTEST) ;


l
-oo0oo-

Goverr.icle
protected void onstop O {
nSensorManager - unregisterr,istene! (this ) ;
super.onstop O ;
) SensorEventlistener

Dan di bagian teEkhir kode aplikasi diimplementasikan


SensolEventListener seperti berikul:

class I'lysensorActivity extends Activity implements


SensorEventListener(
public woid onAccuracycharged (Sensor sensor, int

i
public void ons€n6orchlnged ( SensorEvent event) {
int sensor = event. ttrpe,
floatJl values = event.values,

448 - Pemrograman Smart Pltonc Mlrrlllirrrr.rk;rrr Sl)X Anrlrorrl rl;rtr ll;u:kttt11 Atrrlrottl ItAll l0 Apltl ,r',t ',,'tr',ot Arrrhorrl 449
Trou bleshoting SD K And roid

U. ntuk tambahan pada bab inidiberikan ringkasan solusi masalah yang sering
-kompilasf
dihadapi saat melakukan developing project Android, proses
proses upload, dan running aplikasi di Emulator AVD atau perangkat android
yang akan mempermudah kita. salah satu permasalahan, diantaranya berikut:
l - Tgrladi kegagalan pengunggahan aplikasi Android hasil kompilasi
dari Eclipse, hal ini disebabkan perangkat Android atau emurator AVD
ada.package aplikasi yang sama dengan aplikasi yang diunggah atau
disebabkan ADB gagal meng-uninstall aplikasi sebelumnya. Sebagai
solusi, kita dapat menghapus aplikasi yang ter-,nsta// pada AVD atau
perangkat android secara manual, menggunakan command:

adb unist.all com. contoh.package. apJ_ikasi

AVD gagal mengakses location services, untuk mengatasinya gunakan


telnet untuk mengakses shell emulator, dengan perintah-geo fix
untuk menentukan koordinat. Hal ini disebabkan ihell Emulator AVI)
Android,lihat pada text box SDK Location apakah path direktori
akan lebih mudah terhubung melalui console emulator. Sedangkan
sudah benar.
pada perangkat fisik Android, secara default tidak mendukung emulasi
location service sehingga tetap diperlukan pengaktifan location b. Cek versi ADT yang digunakan apakah kompatibel dengan versi
services pada perangkat. SDK Tool tersebut (aplikasi ADB, DDMS, dan lainnya).
Emulator AVD tidak terkoneksi internet. Masalah ini dapat diatasi c. Cek apakah server ADB dalam keadaan aktif atau tidak jika dalam
dengan beberapa cara, yaitu: kondisi tidak aktif dapat dilakukan perintah adb start-
a. server pada menu Run atau melalui command prompt.
Jika koneksi lnternet pada PC menggunakan proxy, Cek lP proxy
dan nomor port pada menu SDK Manager; 6. Terkadang tool ddms atau telnet tidak dapat mengakses
console device karena server adb ter-disconnect dengan Emulatar
b. Cek apakah PC terhubung dengan |SPA//i-Filserver;
AVD meskipun dari task manager terlihat adb masih aktif. Untuk
c. Gunakan DNS Coogle/OpenDNS atau DNS internasional mengatasinya, dapat dilakukan restart server adb melalui command
lainnya atau gunakan DNS lokal (misalnya Telkom atau lndosat) prompt atau Run Command menggunakan perintah:
jika DNS lnternasional memperlambat koneksi;
d. .fika penggunaan DNS lnternasional memperlambat koneksi,
gunakan DNS lokal (misalnya, DNS telkom atau indosat); C: \>adb kiIl-serwer
e. Cek koneksi lnternet melalui browser internal Android. Jika
C: \>adb starL-server
browser terhubung dengan internet, dapat disimpulkan masalah
nya pada aplikasi kita dengan koneksi lnternet;
f. Sebelum Emulator AVD dijalankan, PC host harus telah terhubung Masalah ini sering muncul pada komputer host berspesifikasi rendah,
internet" Jika AVD telah aktif saat masih belum terkoneksi atau yang dapat cenderung mengalami banyak permasalahan. Command
men-dial-up ke 15P, Emulator AVD harus di-restart kembali; adb start-server tidak harus dijalankan manual saat sebelum
g. mengaktifkan Emulator atau ddms karena otomatis adb aktif saat
Jika tahap a hingga f dan AVD telah dilakukan masih tetap tidak
terkoneksi internet, maka sebagai solusi terakhir lakukan update membuka DDMS, Emulator AVD atau IDE Eclipse.
SDK ke versi terbaru (emulator, ddms hingga ADT) dengan versi
atau waktu rilis yang sama. Karena beberapa versi SDK Android -oo0oo-
terkadang masih memiliki bug.
4. Proses loading Emulator AVD lebih lebih lama dari kondisi normal,
biasanya loading membutuhkan waktu 5-1 5 menit tergantung pada
spesifikasi komputer host (prosessor dan memori). .lika waktu /oad
lebih dari 20 menit, kemungkinan terjadi hang pada Emulator AVD
yang dapat ditandaitidak tampaknya home screen. Masalah ini dapat
diatasi, salah satunya dengan menggunakan JDK versi lama, minimal
harus di atas versi 6.
Cara ini efektif diterapkan pada PC atau Laptop berspesifikasi rendah
karena dalam kasus penggunaan JDK versi lama khusus SDK Android
cenderung menggunakan resource lebih rendah dibandingkan JDK
versi terbaru. Yang dapat berimplikasi pada waktu load Emulator AVD
yang lebih cepat.
5. lika ditemui permasalahan pada proses kompilasi misalnya Emulator
tidak dapat terhubung Eclipse, hal ini dapat diatasi dengan mengikuti
langkah-langkah berikut:
a. Cek direktori SDK Android pada menu Android preferences,
dengan meng-k/ik main menu Window J Preferenr:es '

[]A[] I I llrrrt:k,r',,rrr lrorrlrlr..,lto|ng SDK Android 4s3


452 Pemrograman Strtart ['ltottl Mt'ltlilittlt,rk,rtr lil )]( Atrrltorrlrl.rtrll,rr kttt;1 Altrlrotrl
ffib tz
ffi&*sl,','':

Hacking Android

Tidak seperti ponsel generasi sebelumnya, perangkat Android berbasis sistem


operasi terbuka memungkinkan kita melakukan Hacking. Beberapa topik
yang dibahas dalam bab ini diantaranya rooting dan upgrade sistern operasi.
Perlu diingat, proses Hacking ini sepenuhnya menjadi tanggung jawab
pembaca dan diperingatkan untuk pembaca dalam memodifikasi file system
atau sistem operasi Android akan berdampak pada ketidakstabilan fungsidari
hardware Android. Meskipun demikian, resiko dapat diminimalisir dengan
melakukan tahapan-tahapan yang dijelaskan dalam bab ini.

Rooting Android
Mekanisme rooting sangat berbeda dengan jailbreak pada iPhone, yaitu
dengan menaikkan /eve/ dari user biasa dapat bertindak sebagai SuperUser
atau Adrninistrator. Contohnya memodifikasi file-file system, yang identik
dengan akses root di sistem operasi Linux. Beberapa manfaat dari rooting
Android dapat dijelaskan sebagai berikut:
'!. Akses kontrol penuh, user dapat mengkustom seluruh file sistem yang Coogle C1 (1.6) Cigabyte CSmart C 1305
terletak di seluruh direktori Android diantaranya modifikasi kernel Coogle Nexus One (2.2)
untuk peningkatan performa dan fitur tambahan seperti voice dialing Lenovo Lephone (1.6)
atau penghapusan aplikasi native.
HTC Hero (2.1) LG CTs40 (1.6)
HTC Magic (1.5) * Samsung Calaxy 5 (CT-i550x)
Z. Backup file system, kita dapat membackup seluruh file system OS
Android identik dengan backup sistem operasi komputer dalam bentuk HTC Tartoo (j.6) Samsung Calaxy Beam
file image. Sehingga sistem dapat di-recovery saat terjadi kegagalan Motorola Charrn Sony Ericsson X10 Mini (t .6)
saat mengkustom kernel atau file system. Contoh tool APK backup Motorola D roid (2.01 I 2.1 / 2.2) Sony Ericsson X10 Mini pro (t .6)
ROM yaitu aplikasi ROM Manager yang dapat diunduh pada lvlarket Motorola ME511
(Coogle Play). Vibo 4688 (1.6)
Motorola Milestone (2..l )
t lnstallaplikasi keSD Card, rooting memungkinkan sistem menggunakan
SD card juga sebagai penyimpan data cache suatu aplikasi yang telah
terinstaiasi sehingga dapat meningkatkan performa dan manajemen Penggunaan Universal Androot- sangat mudah, untuk rooting
sementara
dengan mencentang checkbox soft -Root diikuii co i*i
memoriyang lebih baik, tc;L;,
dan saat Android di-restart kembali ke kondisi awal (unroitl. Urirf.
2.1a)
4. Menjalankan aplikasi, contoh nya apl ikasi tethering Wi-Fi, menjalankan rooting
permanen hilangkan centang tersebut, untuk kembali ke mode
aplikasi yang membutuhkan super usert auto memory manager, staftup ,r.rrt a"ng"i
cara men-tap button Undo Root (Cambar 12.1b). Saat prosesi"riirs
manager, dan overclock CPU. -"'c Uerniiii
akan tampak icon Superuser pada main menu (Cambar 12.1c).
5. lnstalasi ROM Custom, user dapat menginstalasi ROM pada perangkat
menggunakan aplikasi khusus pada PC Host"

Dari berbagai aplikasi rootingAndroid yang ada, diantaranya ada yang berupa
aplikasi APK Android yang dapat melakukan rooting tanpa membutuhkarr
PC host. Juga ada pula aplikasi yang diharuskan menggunakan PC host clan
perangkat Android.
Aplikasi rooting hanya mendukung beberapa tipe perangkat Android dengarr
versi tertentu disebabkan tiap versi menriliki sistem proteksi yang berbeda.
Dalam bab ini. aplikasi rootingyangakan digunakan yaitu Urriversal Androot,
z4Root, dan UnRevoked.

(a) 6) (c)
i. Universal Androot
Universal Androot merupakan aplikasi exploit yang memanfaatkan celah @nbar r2.r (a) Apkasi uttitusdAneN, @) po*s wtdo r*t (c) tcm gwus
sistem keamanan Android versi 1.6 hingga 2.2. Untuk Androot versi terakhir Rooting memungkinkan ak1e1 fir.e system.di rever user diantaranya
(1.6.2 beta 5) dapat diunduh pada URL: http://www.23corner.com/apk/ s ys t em /_xb i n, s.y s t em / b i n / s u yang dibututrtan apritasi. -i:ontot, /
UniversalAndroot-l .6.2-beta5"apk, tool irri merupakan aplikasi rootingyang ny"
aplikasi scs Kerne/ Flasher untuk fungsi 6'a*rp ain i";Jrurt",
mendukung banyak tipe dan versi OS Android, diantaranya: kemel
yang membutuhkan akses root. saat user menjalinkan pro*,
(Gambar 12.2b) maka akan tampak notifika;i *indd
b;;ik;p lemet
(Gambar 12.2a).
s;;";; Reguesr
Motorola XT701 Androot memiliki keterbatasan tidak mendukung akses super
user secara
Motorola XT800 (2.1) remote melalui console emulator ADB di pc HostlUntuk
m;nga;nya. kita
Ericsson X10 (1 .6) dapat men ggunakan apl i kas i ApK conso/ e r m u I a,to r yiig'dip'ai'ilet"kukan

456 Pemrograman Smarl Pltorrr' Mcttlllirttt,rk,rrr lil )X Arrrlrorrl rl,rrr ll,rr.krrrl, Arrrlrorr! BAB I2 ll;rr klrg Arrrlrorrl
457
login Superuser. Melalui console emulator tersebut kita dapat memodifikasi
LC Allv Sony Ericsson X]0 Mini Pro
file system atau database aplikasi yang tersimpan di direktori /data/data
(Cambar 12.1c). LC Optimus T Sonv Xoeria Mini
Motorola Defy

Z4root dapat diunduh melalui Market atau forum XDA Developer dengan
ll.:: : -{.1
U RL: http I I for u m.xda-developers.com I attach ment. php? attach menti d : 44
:

6145&d:1290341328. Untuk z4root versi 1.3.0 terdapat fitur temporary


1.1 -a:
i
dan permanent root. Saat rooting berhasil (Gambar 12.3b), secara otomatis
:r ,_.-

r)a ' -;r,


akan menginstalasi aplikasi console based BusyBox. Aplikasi ini hanya dapat
dijalankan pada level super user, merupakan tool multi call binary sebagai
t6! | i:
penyedia perintah shell UNIX yang lebih lengkap jika dibandingkan dengan
li I I "ril
perintah yang ada di shell Android. Perintah-perintah yang didukung BusyBox
dapat dilihat pada console manual busybox seperti pada Gambar '12.3c.
(a) (b) (c)

Gambar 12.2 (a) Notifikasi akses Superuser (b) Aplikasi SGS Kernel Flashu (c) database aplkasi

Rooting tidak selalu meningkatkan performa perangkat Android, dan hanya ld!,B* l!.:1,] {2tr'0.I*.05 {} r-ia l.nIr *i
aktif saat dibutuhkan. Untuk itu, sebelum di-root Kita harus mengetahui ar-aril i1r*-,
tct'r$l tar lt!6-;t*3 E.rl h.hr!6 lil a.
ndlrt- *!'!i rll*.*t
aplikasi apa saja yang membutuhkan akses root dan fungsinya untuk !N 6!lFr L:6ral a{ar FLri.
$s ,araa tlr..rhfte ,ry tuil mrrta
menghindari kerusakan atau termodifikasinya file sistem hingga penyusupan ltuF *i:*.' ll8!t*i l."E6rl
virus yang dapat berdampak pada ketidakstabilan sistem operasi. Sebaiknya F aeri* {rqcri1,
Kita hanya meng-insta// aplikasi (yang membutuhkan akses root) dari Market brh I. *l!,..rll hrM, ilut r
*.ila sh
sr ri rt jm urs t ,rqb .*r!t$f,..
yang dibuat oleh pengembang yang terpercaya. Irar Fa!:, trlt {/irrn r
!!rA ro hutttdr .N lxh !!ri:ls tr,,
, dra! aa ute sd Arrri&r
(a) (b) (c)
2.Z4Root
Z4Root (Gambar 12.3a) merupakan aplikasi exp/oit rooting dengan versi Gambar 12.3 (a) z4root (b) rooting yang berhasil (c) busybox pada console emulator
terbaru yaitu 1.3.0 yang dapat me.root sejumlah perangkat Android maksimal
bersistem operasi Froyo, diantaranya:
Keunggulan z4root dibandingkan dari tool rooting lainnya memiliki tingkat
Asus Carmin A50 Motorola Droid 1 keberhasilan rooting yang tinggi, tetapi jika digunakan pada perangkat yang
Cricket Huawei Ascend Motorola Flipside tidak terdapat pada list di atas akan berdampak fungsi rooting gagal.
Dell streak Motorola Milestone 2
HTC Cl Samsuns Galaxv 15700 3. Unrevoked
HTC Hero Samsuns Acclaim Aplikasi Unrevoked dirancang untuk rooting produk HTC agar dapat
Huawei 8120 Samsuns Calaxy 3 15800 meng-custorn default ROM menggunakan ROM upgrade dari HTC, ROM
Motorola Backflip Samsung Calaxy S dan variannya ClockworkMod, atau ROM CyanogenMod. Beberapa handset yang dapat di-
Samsuns Galaxv Tab
root diantaranya Sprint EVO, Wildlife, Desire, Aria, dan lainnya. Penggunaan
Motorola Cliq
aplikasi Unrevoked initerdiri dari beberapa bagian, yaitu:
Motorola Droid 2 Smartq v7 android 2.1
Motorola Droid X Sony Ericsson X10 a. Unduh aplikasi Unrevoked Recovery pada URL http:lldownloads.
un revoked. com I recove ryI j. j 2 I ref I ash gackage.exe, ap I i kasi i n i

458 Pemrograman Smarl Phonc Mcttlllitttt,tk,rtr lil)K Arrrltorrl rl,rrr ll,lt krrtli Atrtlrotrl BAll I 2 ll;rr krttg Attrltottl 459
sebagai tool custom recovery image yang menyediakan fungsi alamat URL firmware yang diinginkan seperti yang terlihat pada
flashing kustom ROM dan full backup data dari perangkat HTC; Cambar 12.4.
U nduh Apl i kasi tool H BOOT, pada U RL: http://www. un revoked. **ils*****ffi
com/recovery/android-usb-driver.zip yang diperlukan untuk alb*
bf,k{arE*hdlk
H !16 dbn ri*. *r q H h; n
-
*.*d

meng-custom driver HTC agar dapat melakukan flashing pada


lingkungan OS Windows, sedangkan untuk OS Linux atau Mac :-: ,.,

c.
tidak memerlukan aplikasi ini;
Agar dapat melakukan instalasi kustom ROM, dengan catatan
m
Lit.:l
lfd3ara ffiie€ I
perangkat harus terhubung dengan PC Host pada mode "Charge
Only'. 3 !shitr€la.r

lld.rm
ffi
Karena masing-masing produk dari HTC memiliki proses upgrade firmware
yang berbeda-beda dan cukup rumit maka untuk lebih jelasnya dapat mencari
1..*4*,r"r
*rie...-
I *',..J^. iryt,
I* r

iti!*rqr*tG.lt**
!!!,@epir&
ffi
ar&rffi r*
dokumentasinya pada website resmi Apl ikasi Unrevoked http:l I unrevoked.
com atau pada Forurn XDA yaitu merupakan forum pengembang aplikasi
Android, i Phone, Tab let pada U RL http I I fo r u m.xd a-devel opers. corn.
:
treq
'&rn,rild*'
k'**
ilffi

rr ,ea
H
tdd6LK

Upgrade Firmware Android Samsung


Saatini banyak tersedia aplikasi upgrade firmware ROM yang user-friendly
g ! ll&

re
untuk berbagai jenis perangkat Android sehingga siapa pun dapat mudah Gambar 12.4 Firmware sejunlah tipe Samsung Android (hapl/www.samfirmware.coml)
melakukan upgrade tanpa memerlukan keahlian khusus. Upgrade firmware
tersebut secara otomatis akan mencakup upgrade sistem operasi, boot image,
image radio, image CSC, dan image recovery. Pada upgrade ini, penulis menggunakan firmware Android fclair untuk
Meskipun demikian, upgrade firmware sangat beresiko tinggi karena jika regional lndonesia, Malaysia, Singapura, dan Filipina yang ditandai
menggunakan firmware diluar regionalnya dapat berakibat fungsi-fungsi kode DX pada file l5503DXJC5.rar. File firmware tersebut dapit diunduh
hardware tidak berfungsi atau berjalan tidak normal akibat inkompatibilitas pada http:llwww.multiupload.nlls4Qlcz1spo atau http:/ihotfi!e.conn/
pustaka dan kernel dengan hardware perangkat tersebut meskipun dilakukan dl / 1 2 3 20 j9 6 3/ 3 2f 30f 5 / I 5 50 3 DXI c 5. rar.htm l. J i ka menggunakan fi le i mage
factory reset berulang-ulang kali. dari regional lainnya (misalnya Eropa, atau Amerika) berakibat hardwa"re
tidak berfungsi, seperti layar sentuh kapasitif, sinyal radio (CSM, Wi-Fi atau
Untuk mengurangi resiko, disarankan hanya mengunduh firmware atau bluetooth) karena perbedaan hardware.
ROM dari website resmi produsen atau dari komunitas resmi produsen.
Penggunaan ROM tidak resmi sepedi ClockworkMod atau CyanogenMod 1. unduh file pendukung Firmware ops Europe dan aplikasi Frashing
sangat berresiko karena besar kemungkinan ROM tersebut tidak kompatibel too/ untuk Samsung Android ODIN Multi Downloader versi 4.2-g
untuk perangkat milik Anda. Agar lebih jelas mengetahui prosedur upgrade pada URL: http:llwww.lshared.comlfilell-WSC\SXlodin v428 and
ROM akan dibahas lebih spesifik untuk perangkat Android Samsung Galaxy ops_file.html. -
CT-i5503 dengan penjabarannya sebagai berikut: 2. Sebelum meng-upgrade firmware dianjurkan mem-backup data
'1. menggunakan aplikasi Backup Everything (Cambar 12.5) disebabkan
Unduh file Samsung Firmware pada URL: http:llwww.samfirmware. upgrade akan menghapus seluruh data yang tersimpan di memori
com. Website ini bukanlah website firmware resmi milik Samsung, internal. Aplikasi Backup Everything akan mem-backup data
tetapi menyediakan firmware original terlengkap khusus produk phonebook, aplikasi, SMS, dan data lain.
Samsung diantaranya Galaxy S, Calaxy Tab, dan lainnya. Untuk
memperoleh link unduhan, terlebih dahulu melakukan registrasi.
Setelah registrasi selesai dan login, barulah kita dapat memperoleh

460 Pemrograman Smarl [)hottc Mottlllitttt,rk,rrr lil )h Arrrlrorrl tl,rrr ll;tr:ktttli Artrlrottl BAll l,'ll,rr kttrrl Arrrlrrrrrl 461
t---*--
,r
sltH
.l
i;i
r- -i-_- I",
ilr(ile) ,
,.:r
i
'!!

l**ry ,&,&, l|B,*

(4, (b)

Gambar 12.5 Aflikasi Backup Everything Gambar 12.6 (a) Aprikasi oDtN (b) uproad RoM firmware ke perangkat Android

1. Ekstraksikan file l5503DX|C5.rar menggunakan WinRar atau aplikasi


sejenisnya dengan memasukkan password'samfirmware"com". 1. Masukkan satu persatu fite image ke tiap direktori image, seperti
Setelah file diekstraksi tampak 4 file image berekstensi *.tar.md\ yaitu berikut:
file CSC, PDA atau sistem operasi, Bootloader, AMSS atau radio. a. File EUROPA _vt.0.ops dimasukkan OpS
2. Sebelum menghubungkan perangkat Android ke komputer, matikan b. File 5503DXJC5_BoorL2ADER.tar.md5 dimasukkan ke Boor
perangkat Android diikuti melepas baterai, kartu SlM, dan 5D Card.
Setelah 5 detik, pasang kembali baterai tanpa kartu SIM atau SD Card.
c. File l5503DXlC5_amsslhone_CL464028.tar.md5 dimasukkan
melalui PHONE
3. Selanjutnya untuk mengaktifkan mode download firmware, tekan
tombolvolume bawah + tomboltengah D Pad + tombolpoweryang
d. Fi!" l5503OLBlC4_CSC_SEA_CL.tar.md5 dimasukkan melatui
CSC
akan diikuti tampak pada display icon downloading....
4. lalankan aplikasi ODIN dengan kondisi ADB dan Kies dalam keadaan
e. Untuk EFS tetap dibiarkan bernilai kosong
non-aktif. Proses shutdown ADB dapat dilakukan menggunakan
perintah adb kill-server pada command prompt atau melalui 2. Centang check box Auto Reboor diikuti dengan meng-klik button
Task Manager dengan meng-klik tab Process -+ pilih adb.exe -+ klik stan
untuk mulai menjalankan upgrade firmwariseperti y"ang t rprt piO,
End Process. Cambar 12.4b.
5. Perangkat Android yang terdeteksi ODrN akan terlihat warna kuning 3. setelah upload berhasil, otomatis perangkat akan restart. seranjutnya
pada alamat port yang digunakan (Cambar 12.6a1.
koneksi USB pada pC host dapat'direpis dan aprikari ooiN'Juprt
dimatikan.
4. U11u!_mengecek firmware Samsung Android, memasukkan nomor
x #!2:4#. pada
akses telepon dan akan tampak versi firmwar" ,"fl.ti
pada Gambar 12.7.

462 Pemrograman Smart Phone Melrygttturkirrr lil)K Arrrlrrurl rl;rrr ll;rr:krn11 Arrrlroirl RAII 1,, Il,rr krnpl Arrrlrorrl
463
Daftar Pustaka
Gambar 12J Firnware Samsung Android (a) sebelum dan (b) sesudah Upgrade

Untuk meng-upgrade firmware dari produsen lainnya, seperti HTC,


Motorola, LC atau lainnya, kita dapat melihat pada forum XDA (http://
fo r u m.xd a-d evelopers. comi.

oo0oo-
Abelson W., F, Collins, C., Sen, R., 2009, Unlocking Android - A Deveioper's
Guide, Manning Publications Co, USA
Abelson W.F, Collins, C., Sen, R.,20I0, Source code Unlocking Androici
- A Developer's Cuide, Manning Publications Co, USA, http:liwwu,,.
manning.com/ableson/uadcode allchapters.zip, diakses 5 Oktobei
2010
Android Team Developers, 2010, Android Development Documentation -
Google, http://developer.android.comf Diakses 4 September 20'i 0
Anonim, 2010, All Newest Cadgests Reviews, http://viewgadgets.net, diakses
pada 24 September 2010

Anonim, 2011, Coogle Code - Developer project Open/ntents, http://code.


google.comiplopenintents/wikilsensorSimulator, Amerika Serikat,
diakses 5 Januari 201 1

Anonim, 20'10, Portal lnformasi Spesifikasi Cadget Mobile phone, Arena


Com, Ltd., http://www.gsmarena.com/, Amerika Serikat, diakses 20
September 2010

464 Pemrograman Smart Phone Menggttttakarr Sl)K Arrrlrolrl darr llackrng Andrtltd
Meier R., 2010, Professional Android Application Development, 2nd Edition,
Anonim, 2010, Poftal lnformasi cadget dan Teknologi, www.geeky-gadgets. Wiley Publishing, lnc., lndianapolis, lndiana, USA
com, diakses 15 Oktober 2010
Meier R., 2010, Source code Professional Android Application Development,
Canalys Research, 2011, Research Report - Coogle's. Android becomes 2nd Edition, Wiley Publishing, lnc., lndianapolis, lndiana,
the world,i leading smart phone platform , http://www.canalys. USA, http://www. wrox. comAN i eyC DAAN roxT itl e/prod uctCd-
I

cotm/prl2o1 1 lr2o1 1d13.html, Palo Alto, california, Amerika serikat, A47O565527,descCd-DOWNLOAD.html, diakses pada 20 September
diakses 5 Febuari 201 1- 201 0
Dummer, )., L.,2004, A Simple Time -corrected Verlet lntegration Method, Munir, 2008, Kurikulum Berbasis Teknologi lnformasi dan Komunikasi. CV
ntfp,iltonesock.neyarticle/verlet.html, University of California, Davis, Alfabeta, Bandung
USA
Nazmul, SAX Developer tutorials - ScreamingToaster, 1999, http://
Djuknic, C., M., Richton, R., E', 2010, Ceolocation and Assisted GPS - IEEE developerlife.com/tutorials/?.p:29, Amerika Serikat, Diakses 23
Computer society, Bell Laboratories - Lucent Technologies, http:// Oktober 20'10
cens.ucla.ed ul - *hr I csZl gllocation/dj un kicg 1 pdf, 200 1, d iakses 1 2
.

November 2010" Steele, J., Neelson, f ., 2O11, The Android Developer's Cookbook : Building
Applications With The
European Space Agency, Calileo - Europe's Ctobal Navigation Satellite
' System,, http"y'/www.esa.int/esaNA,/galileo.html, diakses'l 3 Februari Android SDK, Pearson Education, lnc., Boylston Street, Boston, MA, USA.
2011 Oracle lnc., Java J2SE Download www.oracle.com/technetwor[</Java/.iavase/
EZB Systems lnc., 201 1, LJltralso - Handle.CD and DVD lmages with Ease!, downloads/index.html , diakses pada 16 Januari 201 1
http://www.ezbsystems-com/u ltrai so/i ndex' htm I
Ryan, 2., A.,2010, z4root - APK rooting tool, http://forum.xda-deveiopers.
HTC T-Mobile cl, HTC Corporation, 2010, http://www.htc.comlwwwl com/showthread.php?t:833953, Johannesburg - Afrika selatan,
product/g1lspecification'html, diakses pada 24 Oktober 201 0 diakses 10 desember 2010

Huang s, Universal Androot 1.6.2 beta 5, 2O"lO, http://blog.23corner. SamFirmware Team, 2010. Website Firmware dan data manuai servir:e
"
coml2olOlOS/3o/universal-androot-l-6-2-beta-51, Taipei, Taiwan, Samsung Android, http://www.samfirmware.com, Holland, Dial.ses
diakses 10 oktober 20.10 10 Desember 20'10.

IBM Foundation, 20'1 0, lntegrated Development Environment Eclipse, http:// Sun Developer network, 2003, White Paper - The K virtual machine (KVM),
www.eclipse.org, USA http://Java.sun.com/produ cts/clddwp/, Sun Microsystems, lnc., San
Antonio Road, Palo Alto, California, USA
lnternet Download Manager, 2O1 O, http://www. internetdownloadmanager.
com, USA United States Ceologicas Surveys (USCS), 2010, Eathquake Hazards Program,
http://earthquake.usgs.gov, Reston, VA, USA diakses 10 DesemLrer
Kaplan E.D., HegartY, C., ]., 2006, Understanding GPS Principles and
' Applicationi, 2"0 Edition, 2006 ARTECH HouSE, lNC., 685 Canton 2010

Street, Norwood, USA UnRevoked Team, Rooting Tools for HTC Android Phones, 2011, htrp:l/
unrevoked.com, Amerika Serikat, Diakses 15 Januari 201.1
Market Android, 201 1, Portal Aplikasi Android, https://market.android.com/,
diakses Pada 10 Februari 201 1 Weiser, M., 1 99 3, U b i q u ito u s Co m p uti n g, http://n ano. xerox. com/hypertext/
weiser/UbiCompHotTopics.html, diakses pada 23 Oktober 201 0
Murphy, M., L., 2O1O, Beginning Android 2, http:l/commonsware'com/
apress, Apress, New York, USA Wikipedia, 201 O, NM
.14
EA 0 1 B 3, http:l/en.wikipedia.orglwiki/NMEA 0 l B3,
diakses pada November 20'10
Wikipedia, 2011, Verlet Integration, http://en.wikipedia.orglwikiA/erlet
Tutorial Android Forecast, http:// www.anddev'org/advanced-tutorials-f2.1/ integration, Wikipedia Foundation, San Francisco, California, USA
and roid-weather-forecast-google-weather-apidescription-t3 3 7-45. htm I

lJ;tlliu l'rr"l,rk,r 4fft


466 Pemrograman Snrart Phong Morrlilirrrr,rk,rrr lil)K Arrrlrotrl rl,rrr ll;tr:krtlli Arlrlrotti
Wikipedia, 2O'11, Teknologi 3C, http://id.wikipedia.orglwiki/3c, Wikipedia
Foundation, San Francisco, California, USA
Wikipedia, 2011, Teknologi Telepon Seluler 2C, http:llidwikipedia.orgl
wikil2C, Wikipedia Foundation, San Francisco, California, USA
Wikipedia, 2011, Ceneral Packet Radio Service (GPRS), http://id-wikipedia.
orglwi ki/C PRS, Wi kiped ia Foundation, San Francisco, Cal iforn ia, USA
Wikipedia, 201 1, Personal Digital Assistant, http://en.wikipedia.orglwiki/
Personal-Digital-Assistant, Wikipedia Foundation, San Francisco,
California, USA
Wikipedia, 201 1, Smartphone, http:i/en.wikipedia.orglwiki/Smartphone,
Wikipedia Foundation, San Francisco, California, USA
Lampiran

-oo0oo-

Tabel Spesifikasi HandsetSamsung GT- 15503 (Corby, Galaxy Europa)

Bentuk Fisik Dimensi I0B x 56 x'12.3 mrn


Massa 102 gr
Warna Hitam
Spesifikasi Prosessor ARMv6 compatible revision 5 600
Primer MHz
Baterai Li-lon 1200 mAh 3,7V
Sistem Operasi Android v2.-l lEclair. Dapat d i upgrade
ke versi 2.2/Froyo
Memori Internal - FlashMemori (OS) 186,4 MB
- RAM : 186 MB
(unlimited phonebook, photocall,
log percakapan)
Memori Eksternal microSD, kapasitas maksimal 16 GB
Display TFT 240 x 320 Pixel, 16 juta warna,
2.8 inchi

468 Pemrograman Smart Phone Menggunakirtr lil)K Arrrlrorrl ri;rrr llar:kttt51 Androrrl
Performa Waktu Stand-by Maksimal 521 jam (2G) I 375 jam Fitur Software Default Samsung Widget dan Aplikasi,
(3C) Coogle Search,
Waktu bicara Jaringan 2C : Maksimal 9,5 jam, 3G C-Mail, Youtube, Google Talk,
: 6.5 iam Maps,Voice memo, T9, Organizer,
SAR (EU) 0.65Wke lntegrasi Social network (Twitter,
Komunikasi csM 8s0 I 900 I 1800 / 1900. (CPRS Facebook, dll), TouchWiz v3.0,
Class 10, 32-48 kbps, EDGE Class Swvpe
Radio
10.236.8 kbps) Upgrade Upgrade aplikasi via Samsung Apps
3,5G : HSDPA 900 / (online), instalasi aplikasi Market
21OO (7.2 Mbps) dan non-Market via internet, USB,
WLAN Wi-Fi 802.11 b/e, DLNA
: bluetooth, memori microSD
Bluetooth : v2.1 with A2DP Driver dan Tool Phonebook, sms, multimedia
sinkronisasi manager
Akselerator Grafis OoenCL v2.0 ES-CM 1.1
Antarmuka Analog Jack Audio 3.5 mm (headphone + (Aplikasi Kies via USB)
mic) Debuseine too/ ADB, via USB
Dieital Port USB Versi 2.0 lava vendor Android Proiect, versi c/ass 46
Lavar sentuh TFT kapasitif Kernel Linux 2.6.29-perf
Komunikasi Audio Mikrofon + Soeakerohone Sensor CPS Ceo-tagging, Coogle Maps, Photo
lnternet lnternal Web browser Sensor Cesture Accelerometer, Magnetometer
(mendukuns Webkit, HTML 5) (Kompas)

Messaging SMS, MMS, E-mail, Push Mail, lM, (BOCH, MEMSIC), sensor Orientasi
RSS (kombinasi sensor Accelerometer
Multimedia Analog Radio FM densan RDS dan Magnetometer)
Digital AudiolVideo player format MP3/
WAV/eAAC+, Ogg, MP4/
H-2641H.263
Alert Rinstone Audio (Mp3, WAV), Vibrasi
Kamera 2 Mega Pixel (1600x1200 pixel),
Perekam Video QVCA 15 fps

470 _ Pemrograman Smart Phone Menggunakan SDK Android dan Hacking Androtrl I:rtnprt,ur
471
Beberapa tipe handset Android yang telah clipasarkan dari sejumlah
produsen: Produsen Produk Versi OS Display Spesifikasi, jaringan,
Android dan Fitur
Produsen Produk Versi OS Display Spesifikasi, laringan,
dan titur
CDMA 800/1900 MHz
Android EVDO Rev. A,
Acer lnc Liquid Al 1.6 3.5",480x800 CSM, UMTS, CSD,
802.1 1b/gln, Bluetooth
(sl00) (WCA, ponrait CPRS, EDCE, HSDPA, 4.3", 480x854
Motorola DROIDX 2.2 (FWVCA, mode Stereo v2.1 + EDR
mode) HSUPA, Bluetooth 2.0
portrait), 24Oppi ,{2DP AVRCP, jack
+ EDR, Wi-Fi 802.119, 3.5mm, USB 2.0 H5,
CPS with A-CPS
HDMI. Sinkronisasi
CPU 1 CHz OTA, PC, DLNA
SnapDragon, layar
Liquid 2"1 dapat di 3.7 inch A9BO. CSM, HSDPA,
sentuh kapasitif, 5MF Nexian 3.2",320x48Q
AMOLED 2"1 Bluetooth, cPS, Diri lis
Stream update ke kamera, 720p video lourney (HVCA}
sl 10 2.2 WVCA untuk pasar lndonesia
recordinS, output
Prosessor'l GHz, Duai
HDMI
2.1 dengan band CDMA. EV-DO
HSPA, WCDMA, CSM, Touchwiz
3.7", 480x800 EVDO Rev. A, WiMAX
Wi-Fi Bluetooth 2.1, 4.0", 4B0xB00
(WCA, mode Calax'v- 5 3.0, 2.5 to 2.7 CHz, CSM/
Desire 2.1 12.2 USB, Trackpad optik, (WVCA),5uper
portrait) i9000 mendukung GPRS/EDCT, HSDPA,
Ul HTC Sense AMOLED
Samsung update ke HSUPA, Wi-Fi (b/dn);
HTC Hero Wi-Fi (802.1 1b/g), 2.2 Bluetooth 3.0, USB 2.0,
3.2',32Ox4BO Bluetooth 2.0+ EDR, DLNA, FM Radio
HTC HTC Droid
't (HVCA, poftrait ExtUSB, A-CPS Quad 3.2",320x480 Prosessor ARM 800
Corporation Eris, "5,2.1
mode) band GSM CPRSI Spica i5700 1.6,2.1 (HVCA, mode MHz microSD, WiFi b,/
T-Mobile EDCE, UMTS, HSPA portrait), 1 B0ppi g, Bluetooth 2.1, AGPS,
C2 Touch Prosessor Qualcomm
2.8',24Ox32O Smart phone tipe low
MSM 7227 600 MHz,
HTC Taftoo 1.6 (QVCA, poruait end, Ul HTC Sense, 2.55 inchi,
Rachael Ul Timescape,
mode) kamera 3.2MP 240X320
Xperia X10 RAM 256 MB, ROM
WCDMA/HSPA, CSM 1.6/2.1 (QVCA),layar
AMOLED, Sony Mini Pro 256 MB, Slide keypad
sentuh kapasitif
WVCA Ericsson QWERTY, kamera 5
Lenovo LePhone 2.1 Layar sentuh kaPasitif TFT
(80Ox480) 1,7 inchi MP auto fokus, sensor
Kamera 3.2MP, cahaya linekunean.
microSD (maks 32GB), Xperia X'l 0
4.0',48Ox854 ldentik dengan X10
1.6/2.',|
(FWVCA,TFT) Mini Pro
kapabilitas mobile
3.2',32Ox48O hospot,6O0MHz WVCA 3.5" WiFi, Bluetooth, CpRS,
(HVGA, mode Qualcomm MSM7627 480x800, OLED, 3C, HSDPA, Micro
ts670 2-2
ZTE Blade 2.1
LC poruait|,TFT - GPU Adreno 200, layar sentuh USB, CPS, 3.2 MP AF
Optimus S
LCD memori 512M8, kapasitif camera, 2 GB micro SD
WiFi b,/g, Bluetooth
2.1, AGPS, kompas,
accelerometer

I antltrt;rrr
472 Pemrograman Smart Phone Menflgunakirrr Sil)K Arrrlroirl datt ll;tr:kittli Arltltorrl 473
Spesifikasi berbagai produk tablet berbasis OS Android yang tersedia di
pasaran
Mendukung
Drlplay 0nchi),
Versi Spesifikasi, Fitur &
Produsen Produk Resolusi, Aplikasi
Android laringan
Touchscreen Market
lnternet
10,1 ,1024x60O, 1 CHz ARM Cortex AB
Archos tablet 2.2 Tidak
kapasitif CPU
Archos 101

Dell Streak/
Prosessor 1 CHz
Snapdragon. Kamera
Tentang PenuEis
Dell I.6 5 Tidak
Mini5 di depan layar 5MP
denean flash
CPU Hummingbird
Cortex A8 - 1CHz,
ROM 512M8, RAM
512MB, D-RAM
128M8, Memori
user 2CB + memori
intemal 16G8, memori lazi Eko istiyanto memperoleh gelar sariana ilmu fisika (1986) ciari
eksternal maks. 32GB Universitas cadjah lvlada. Kemudian Beliau melanjutkan studinya di lnggris
7,1O24x6OO, (microSD),Wi-Fi da.n nremperoleh gelar Postgraduate Diploma in computer programming inri
Samsung Calaxy Tab 2-2 Ya
Kapasitif 802.11 b/g/n, USB Microprocessor Applications (tahun 1987), juga pada tahun lgOtt dipr:iolclr
2.0. Bluetooth, Sensor gelar M-Sc bidang Computei-Science, dan terakhir diperolei: eelar f)h i)
Cyro (Accelerometer 3 untuk bidang keilmuan Electronic systems Engineering (tahun iiig5),
'i;rnir
sumbu). Ceomagnetik, seluri-rh geiar dari studi Beliau tersebut di peroleh darluniversily r,l' 'f rr,1,,.,
Luminansi, kaPasitas lngg,i-is.
Baterai 400OmAh, 2
!,lat ini [tr:iiau n:l"l,lrbetsl:llaga; Kelii.r jrtrusan ii11u l(r_rn,plriitr,i..,, i . , ., r,
Kamera (belakang:
yang sebr:iumny'a J.,rrnah inen jahal s+,i..a;i;.ri Kc.lria pior:r;lp-1 !,111,r, , ,., .,
3MP, Auto Fokus,
Flash, depan: 1.3MP)
dan ir-,:ti.lrmr-r"i;t.,1 Nr:nld* 7i){l_l-:'()i.}I dai.i i(etu"r jLrrusan i;.i, :,,
Prosessor NVidia
.2{-lUi-:',. I i Bll:,rr, ju1;a rire;t1l.,rjar ;rada Pr,::{i.:;ii \1.t.1:r;1, -'l , .

l(rtrril}.:it'i., roy,,,,r.: ,\1dg,l:.1r:t,il),.,ktur ilrnil Iirir.a, i)!,.iii;,iiir ii.1.;. 11r, :


fegra 2, memori ,

1,.:i<nii.: i lrtkiro, rj,,rir Pros.rarn A4agiste'r h4;rr.,u*"',,"t, l.;11jr r,;,;;;-,- ;..,"r,-t, ,,.,1, .
internal 16 GB, WiFi
'to,1 , i)engarr biclarrg,, r,t:i d;rl;lrn bidang sisti,rn kear::anafi j.ri-irr!r;rrrrlpi:rr.r, - -:,i:ji-r;,
8O2.11b@n, Bluetooth,
elektrt..nik, darr tirrtenr tert;rnam (eml-retcjded sy.]lerns) Frrrri j;r,i fl,cr l. iyarrir;-
Folio 100 2,2 1024 x 6OO, 3C, card reader (5D Tidak
Toshiba Ph.D" juga sel-ragai saiah satu anggota Him;:unair ijisrk.r !r-,rjrir,l,ia ii.rn
dan MMC), HDMI port
Kapasitif Persatuan lnsinyur lndonesia. Jabatan struktural beliaLr iaiah sebag,ai curu
USB 2.0, web cam 1.3
Besar (1060,24 kLrm) untuk bidang ilmu Elektronika dan lnstrumenia-ci. Dan
MP, beterai 10.8V -
juga menjabat sebagai Wakil Ketua Bidang Fisika Komputasi pada Himpunan
2030 mAh
Fisika lndonesia, dan Depuri
ljgqg, 53 pada Asoiiasi perguruan Tinggi
lnformatika dan Komputer (APT|KOM). Untuk menghubunginetiau aa[It
melalui e-maiIdengan alamat : lazi@ugm.ac.id dan jaziugmdgmaiI.com
-oo0oo-

-oo0oo-

474 Pemrograman Snrarl Phonc Mert111iilrr;rk,rrr SI)K Arrrlr0id riarr llar;krrr11 Androttl

Anda mungkin juga menyukai