You are on page 1of 182

MODUL PRAKTIKUM

MOBILE PROGRAMMING

Oleh :
PUJIANTO, S.Kom

FAKULTAS TEKNOLOGI INFORMASI


UNIVERSITAS BUDI LUHUR
JAKARTA
2012

KATA PENGANTAR
Assalamualaikum

warahmatullahi

wabarakatuh.

Alhamdulillahirabbilalamin, banyak nikmat yang Allah berikan, tetapi sedikit


sekali yang kita ingat. Segala puji hanya layak untuk Allah Tuhan seru sekalian
alam atas segala berkat, rahmat, taufik, serta hidayah-Nya yang tiada terkira
besarnya, sehingga penulis dapat menyelesaikan modul pembelajaran perkuliahan
dengan judul MOBILE PROGRAMMING. Dalam penyusunannya, penulis
memperoleh banyak bantuan dari berbagai pihak, karena itu penulis mengucapkan
terima kasih yang sebesar-besarnya kepada: Kedua orang tua dan segenap
keluarga besar penulis yang telah memberikan dukungan, kasih, dan kepercayaan
yang begitu besar. Dari sanalah semua kesuksesan ini berawal, semoga semua ini
bisa memberikan sedikit kebahagiaan dan menuntun pada langkah yang lebih baik
lagi. Meskipun penulis berharap isi dari modul ini bebas dari kekurangan dan
kesalahan, namun selalu ada yang kurang. Oleh karena itu, penulis mengharapkan
kritik dan saran yang membangun agar skripsi ini dapat lebih baik lagi. Akhir kata
penulis berharap agar makalah ini bermanfaat bagi semua pembaca.

Jakarta, 12 Oct 2012

Pujianto, S.Kom

PEMROGRAMAN ANDROID

LEMBAR PENGESAHAN MODUL PRAKTIKUM


FAKULTAS TEKNOLOGI INFORMASI
UNIVERSITAS BUDI LUHUR

Mata Kuliah
Penyusun

: Pemrograman Android
: Pujianto, S.Kom

Jakarta, tgl bln thn


Dekan
Fakultas Teknologi Informasi

Ketua Program Studi


Sistem Komputer

(Goenawan Brotosaputro, S.Kom, M.Sc)

(Irawan, S.Kom, M.Kom)

ii

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

DAFTAR ISI

Halaman
KATA PENGANTAR ............................................................................................ ii
UNIVERSITAS BUDI LUHUR ............................................................................. ii
DAFTAR ISI .......................................................................................................... iii
Pertemuan 1............................................................................................................. 1
Dasar Pemrograman Android .................................................................................. 1
Pertemuan 2........................................................................................................... 10
APLIKASI PERTAMA : Hello World ................................................................. 10
Pertemuan 3........................................................................................................... 22
WIDGET ............................................................................................................... 22
Pertemuan 4........................................................................................................... 39
Dialog .................................................................................................................... 39
Pertemuan 5........................................................................................................... 49
Activity dan Intent................................................................................................. 49
Pertemuan 6........................................................................................................... 59
Layout Manager .................................................................................................... 59
Pertemuan 7........................................................................................................... 73
Action Bar ............................................................................................................. 73
Pertemuan 8........................................................................................................... 80
Ujian Tengah Semester ......................................................................................... 80
Pertemuan 9........................................................................................................... 81
Penyimpanan Data ................................................................................................ 81
Pertemuan 10 ....................................................................................................... 101
File ...................................................................................................................... 101
Pertemuan 11 ....................................................................................................... 109
Membuat Aplikasi Client Server Project ............................................................ 109
Pertemuan 12 ....................................................................................................... 129
Grafik 2D ............................................................................................................ 129
Pertemuan 13 ....................................................................................................... 144
Sensor .................................................................................................................. 144
Pertemuan 14 ....................................................................................................... 160
Google Map ......................................................................................................... 160

iii

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Pertemuan 15 ...................................................................................................... 169


Sms Gateway....................................................................................................... 169
DAFTAR PUSTAKA ......................................................................................... 177

iv

PEMROGRAMAN ANDROID

Pertemuan 1
Dasar Pemrograman Android

1. Dasar Pemrograman Android


Membangun Aplikasi Android sangat mudah, default untuk bahasa
pemrograman yang digunakan oleh Android adalah java. Tidak semua
fitur java yang ada digunakan akan tetapi sebagian dari java yang sering
disebut dengan Dalvik Virtual Machine. Beberapa bagian kecil dari
Android:
A. Activity
Activity merupakan container untuk User Interface (UI). Sebuah
Aplikasi Android terbangun dari satu atau beberapa Activity
B. Intents
Intent merupakan sistem pesan utama yang menjalankan Android.
Intent terdiri dari Action yang harus dijalankan (Tampil, Ubah, Dial,
dll) dan Data. Intent digunakan untuk memulai aktivitas dan
komunikasi antar bagian dari sistem Android.
Suatu aplikasi dapat mengirimkan atau menerima intent
1) Mengirim Pesan dengan Intent
Ketika suatu aplikasi mengirimkan suatu intent, aplikasi
mengirimkan pesan memberitahukan Android untuk menjalankan
sesuatu. Misal: memberitahukan Android untuk menjalankan suatu
Activity dari aplikasi atau menjalankan aplikasi lain.
2) Mendaftarkan Intent Receiver
Mengirimkan pesan dengan Intent bukan berarti sesuatu
selanjutnya

akan

terjadi

secara

otomatis.

Aplikasi

harus

mendaftarkan intent receiver yang memperhatikan intent dan


memberitahukan Android apa yang harus dilakukan.
C. Cursorless Controls
Perangkat Android menggunakan jari pengguna sebagai input.
D. Views dan Widgets

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

View merupakan elemen dasar UI (User Interface). Beberapa


contoh view antara lain: : (1) ContextMenu, (2) Menu, (3) View, (4)
SurfaceView.
Widgets adalah elemen UI yang lebih canggih. Merupakan control
untuk interaksi antara sistem dengan pengguna. Beberapa contoh
Widgets antara lain: (1) Button, (2) CheckBox, (3) DatePicker, (4)
DigitalClock, (5) Gallery, (6) FrameLayout, (7) ImageView, (8)
RelativeLayout, (9) PopupWindow.
E. Asynchronous Calls
Android memiliki sebuah class yang AsyncTask yang memungkin
aplikasi menjalan beberapa operasi pada waktu yang bersamaan, tanpa
harus mengatur bagaimana thread berjalan secara khusus. Network
Communication (Internet), Media Processing, dan berbagai proses lain
yang mengharuskan pengguna menunggu.
F. Background Service
Services merupakan aplikasi yang berjalan di belakang dan tidak
terlalu penting memiliki UI.

2. Fitur Perangkat Keras Android


Perangkat Android memiliki beberapa fitur perangkat keras
didalamnya,

yang

dapat dimanfaatkan developerdalam membangun

aplikasi.
A. Touchscreen
Perangkat Android memiliki fitur layar sentuh (touchscreen)
yang memberikan beberapa kemungkinanan bagi pengguna untuk
berinteraksi dengan aplikasi dengan menggunakan jari.
dapat melakukan swipe, flip, drag, dan pinch

Pengguna

untuk zoom.

Android juga mendukung multitouch yang berarti keseluruhan


layar dapat disentuh dengan satu atau lebih jari pada saat yang
bersamaan.
B. GPS

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Sistem operasi Android mendukung GPS yang memungkinkan


developer untuk mengakses lokasi pengguna. Contoh aplikasi yang
memanfaatkan GPS adalah Aplikasi Peta (Map) yang menunjukkan
lokasi pengguna dan memberikan petunjuk untuk menuju suatu lokasi.
C. Accelerometer
Android
digunakan

mendukung Accelerometer,
untuk

yaitu perangkat

mengukur percepatan.

yang

Accelerometer dapat

memberitahukan apabila suatu Perangkat Android bergerak, atau


terguncang, atau berbalik arah posisinya.
D. SD Card
Android memiliki fitur yang memungkinkan pengguna atau
aplikasi untuk mengakses (menyimpan atau membuka) file pada SD
Card. SD Cardmerupakan media penyimpanan medium

yang

digunakan Perangkat Android dan beberapa perangkat mobile lain


non Android sebagai media penyimpanan.
3. Fitur Perangkat Lunak Android
Android memiliki banyak fitur perangkat lunak yang dapat
digunakan oleh developer dalam mengembangkan aplikasi. Beberapa
fitur populer yangakan dijabarkan disini.
A. Internet
Kemampuan akses internet pada Android memberikan banyak
keunggulan. Berbagai informasi secara real-time dapat diperoleh
dengan mudah dengan internet. Contoh, sebagai pengguna, dapat
menggunakan internet untuk melihat jadwal pemutaran film
bioskop, cuaca suatu area, jadwal penerbangan dan lainnya.
Sebagai developer, dapat menggunakan internet untuk akses secara
real-time kepada data,

updatedata.

Developer juga

dapat

menggunakan internet untuk menyimpan berbagai asset untuk


kemudian digunakan suatu aplikasi, seperti dilakukan Pandoradan
YouTube. Dengan internet dapat dibangun model aplikasi yang
disebut

client-server computing. Contoh lain, aplikasi peta,

mengakses data peta dan GPS dari web server.

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

B. Audio dan Video Support


Sistem operasi Android memungkinkan developer menyertakan
audio dan video dalam aplikasi dengan mudah. Berbagai standar
format audio dan video didukung.
C. Contact
Android memungkinkan akses ke contacs yang tersimpan dapat
Perangkat Android. Developer dapat menggunakan fitur ini untuk
menampilkan contacts dalam cara baru yang berbeda. Hal lain yang
dapat dilakukan adalah membangun aplikasi yang menggabungkan
antara contacts dengan GPS, yang memberikan notifikasi kepada
pengguna jika pengguna berada di dekat alamat satu contactyang ada.
D. Security
Android memungkinkan aplikasi untuk melakukan banyak hal.
Akan tetapi Android juga menyiapkan mekanisme keamanan berupa
permission

berkaitan dengan beberapa tugas. Contoh:

Download

image dan menyimpannya di SD Card, maka harus disetujui


terlebih dahulu permission untuk mengakses SD Card.
E. Google APIs
Sistem operasi Android memungkinkan dengan tidak terbatas
membuat panggilan telepon, mengorganisasi contacts atau menginstall aplikasi. Developer dapat mengintegrasikan peta (map) ke
dalam suatu aplikasi dengan menggunakan Maps API yang
mengandung Map Widgets. Berbagai fitur dapat ditambahkan
dengan Maps API, antara lain: (1) Menampilkan suatu lokasi di
peta, (2) Mendapatkan panduan navigasi, (3) Komunikasi data
antara aplikasi dengan clouds.

4. Instalasi Eclipse
Untuk membuat program android, ada beberapa program yang
harus di instal Antara lain:
A. Java JDK

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Untuk mendapatkan Java SDK terbaru, anda dapat mendownload


di

http://www.oracle.com/technetwork/java/javase/downloads/jdk7-

downloads-1880260.html
B. SDK ADT Bundle for Windows
Download

SDK

ADT

Bundle

http://developer.android.com/sdk/index.html.

for

Windows

Setelah

di

Download

ekstrak file tersebut, seperti terlihat pada gambar dibawah ini.

Didalam folder tersebut terdapat 2 folder :

Untuk membuat project aplikasi android jalankan eclipse.exe


terlebih daluhu yang ada dalam folder eclipse dengan cara double
click.

Akan tampil screen seperti dibawah ini :

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Lalu akan tampil Workspace Launcher, pilih folder yang berfungsi


sebagai tempat project android.

Tampilan Awal Eclipse terlihat seperti gambar di bawah ini :

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

5. Mebuat Virtual Device Manager


Buat virtual device terlebih dahulu sebelum menjalankan project
android. Berikut ini cara-cara AVD (Android Virtual Device)
A. Pilih Menu AVD

B. Pilih New

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

C. Setting konfigurasi seperti terlihat pada gambar, lalu Ok.

D. Untuk menjalankan AVD, pilih AVD yang telah kita buat lalu Start

E. Pilih Launch

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

F. Tampilan Emulator Android akan muncul, tunggu beberapa waktu.

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Pertemuan 2
APLIKASI PERTAMA : Hello World

Latihan pertama yang akan kita pelajari adalah membuat aplikasi Hello
World. Untuk memulai, jalankan Eclipse, pilih File New Android
Application Project.

Isi seperti gambar dibawah, jangan lupa ganti nama package. Package name harus
unik, aturan yang biasa digunakan adalah menggunakan nama website organisasi
anda (dalam urutan yang dibalik), ditambah dengan nama applikasi. Misalkan
nama website organisasi anda adalah puji.com, maka nama package adalah:
com.puji.namapp. Jika nama web organisasinya budiluhur.ac.id, maka nama
packagenya: id.ac.budiluhur.puji.namaapp.

Selanjutnya pilih next sampai untuk activity pilih New Android Applicatoin dan
Next.

10

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Selanjutnya pilih next sampai untuk Configure Launcer Icon dan Next.

Selanjutnya pilih next sampai untuk Create Activity Pilih Blank Activity dan
Next.

11

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Terakhir Finish

Sekarang coba kita lihat apa yang dihasilkan secara otomatis.


Komponen user interface untuk app Android disimpan di direktori /res/layout
dalam format XML. Dalam project ini secara otomatis dibuat activity_main.xml
Pertama yang kita lihat adalah graphical layout berisi rendering layout dan
fasilitas untuk mengedit layout. Lihat ke tab bagian bawah, pilih
activity_main.xml untuk melihat format XML-nya. Komponen user interface
dalam Android didefinisikan didalam XML. Jadi anda dapat mengubah elemen

12

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

tampilan dengan dua cara: melalui graphical layout atau langsung mengedit file
xml-nya.

13

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Sekarang coba buka source code. Lihat package explorer, buka src, package dan
klik MainActivity.java

Dapat dilihat file yang otomatis di bangkitkan ADT

Jalankan project android dengan cara : klik kanan project HelloWorld->Run As>Android Applicatoin

14

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Selamat! Anda telah menjalankan app pertama anda. Jangan tutup emulator ini,
Eclipse selanjutnya akan menggunakan emulator yang sudah terbuka ini sehingga
tidak perlu menjalankan yang baru.
Memodifikasi Project HelloWorld
Selanjutnya kita akan memodifikasi program ini dan menambahkan masukan
nama dari user, lalu setelah user menekan tombol, akan keluar Hello, [nama].
Terimakasih
Pertama, melalui project explorer kembali pilih activity_main.xml yang berada di
res/layout (gambar bawah).

Pilih tab Graphical Layout

Komponen-komponen user interface yang berada di bagian kiri, sering disebut


widget atau view.

15

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Pertama pilih widget TextField, pilih yang paling atas (plain text), lalu drag ke
dalam form.

Lalu drag button di Form Widget, dan letakkan disebelah kanan text field.

Terakhir, drag teks hello world dari tengah ke dekat button. Jika posisi
menjadi berantakan jangan khawatir, atur ulang sehingga posisinya seperti
dibawah.

16

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Coba run untuk melihat hasil tampilan dari program ini. Jangan lupa, jangan
tutup emulatornya, supaya tidak menunggu lama saat run berikutnya. Sekarang
kita akan menambahkan aksi yang akan dijalankan saat button diklik.
Sekarang karena kita akan membuat code yang saat button di-klik menangkap apa
yang diketikkan pengguna dan menuliskannya di TextView. Untuk itu setiap
komponen perlu diberi nama.
Kembali ke activity_main.xml. Klik Button kemudian lihat window properties
yang berada di sebelah kanan, ganti Text dengan OK dan id dengan buttonOk

Gambar untuk setting id

Gambar untuk setting text

17

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Lakukan hal yang sama untuk textfield, ganti id dengan txtNama

dan textview, ganti id dengan viewNama.

Coba lihat XML-nya, maka semua Id telah diganti (gambar bawah). Ini kelebihan
mengganti nama id menggunakan property.

Tip: untuk merapikan XML tekan ctrl-shift-F.

18

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Sekarang kita akan mengeset agar saat button diklik, method yang diinginkan
akan dipanggil. Set atribut android.onClik pada button dengan nama method yang
akan menangani event tersebut (actionTampil).

Penting: setelah update XML, tekan save (ctrl-s). Ini disebabkan file R.java
(di direktori /gen) yang berisi semua Id dan digenerate secara otomatis dapat tidak
terupdate jika file xml tidak di-save secara eksplisit.
Sekarang kita perlu menambahkan code agar saat tombol diklik app akan
mengeluarkan respon.
Melalui package explorer, kembali ke activity utama (MainActivity.java).

Kemudian buat satu method baru actionTampil. Pastikan nama


method sama dengan yang dicantumkan di activity_main.XML. Nama yang
tidak sama akan menyebakan error saat program dijalankan

19

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Tip: Jika id tidak dikenali seperti R.id.txtNama, R.id.viewNama dan


seterusnya, buka kembali activity_main.xml lalu tekan ctrl-S (save)
Jalankan program, perhatikan tab Console di bagian bawah untuk memonitor
proses emulasi. Isi teks dan tekan tombol.

Cara ini paling sederhana, tetapi programmer harus memastikan nama


method pada XML sama dengan nama method di program. Jika nama method
tidak sama, tidak akan muncul kesalahan pada saat program dicompile, tapi akan
menyebabkan kesalahan pada saat runtime (saat button diklik). Alternatif lain
adalah dengan menggunakan listener seperti code dibawah

Mana yang lebih baik? menggunakan atribut onClik atau dengan listener? itu
tergantung dari selera programmer dan standard code yang digunakan.

20

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Latihan:
Buatlah program untuk menghitung luas sebuah persegi panjang. Input adalah
panjang dan lebar (dua edit text). Output adalah luasnya (panjang kali lebar).
Gunakan method berikut untuk mengubah tipe string ke double.

Catatan: input dari method setText bertipe teks, sehingga nilai luas yang bertipe
double harus dikonversi terlebih dulu menjadi teks. Gunakan
String.valueOf(dblLuas) untuk mengkoversi double menjadi teks.

21

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Pertemuan 3
WIDGET

Pada modul sebelumnya kita telah menggunakan input box, button dan
label. Komponen user interface ini disebut widget. Beberapa widget dasar adalah:
TextView, Button, Image, EditText, CheckBox, RadioButton, ListView.
Setiap widget memiliki property atau atribut yang mengatur bagaimana
widget itu ditampilkan, seperti tinggi dan lebar widget. Property ini dapat diset
melalui xml layout, property editor atau melalui program. Beberapa widget
memiliki beberapa event yang ter-trigger berdasarkan aksi dari pengguna,
misalnya event click pada button.
Detil property dan event untuk setiap widget dapat dilihat di:
http://developer.android.com/reference/android/widget/package-summary.html
(scroll sedikit ke bawah, di bagian classes)
Berikut akan kita bahas beberapa widget yang terpenting. Silahkan buat project
baru.
A. Text View
TextView digunakan untuk menampilkan label teks. View ini sudah kita
gunakan Beberapa contoh property dari TextView adalah android:textSize,
android:textStyle, android:textColor. Coba tambahkan textview standard
dengan atribut dibawah.

Hasil :

Catatan: pada atribut textSize, direkomendasikan menggunakan ukuran sp.


sp merupakan singkatan
dari scaled-pixel yang memperhitungkan
kepadatan resolusi dan juga preferensi ukuran font dari pengguna.
B. Button
Button merupakan turunan dari TextView sehingga yang berlaku di
textView juga berlaku di button. Tambahan property yang penting adalah
onClick

22

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Hasil :

C. ImageButton dan ImageView


ImageButton adalah turunan dari button, gunakan widget ini jika Anda
ingin menggunakan image sebagai pengganti tulisan pada button.
Sedangkan ImageView dapat digunakan untuk menampilkan image.
Image yang akan ditampilkan dalam button diletakkan di direktori /res
sesuai dengan resolusinya
/[project]/res/drawable-ldpi
/[project]/res/drawable-mdpi
/[project]/res/drawable-hdpi
/[project]/res/drawable-xhdpi
/[project]/res/drawable-xxhdpi

res merupakan singkatan dari resource, file-file yang berada di dalam


direktori /res disebut dengan project resources.
ldpi digunakan untuk untuk device dengan layar low density atau resolusi
rendah 120dpi (dot per inch), mdpi untuk medium (160dpi) , hdpi untuk
high density (240dpi) dan xhdpi untuk ekstra high density (320dpi).
Sedangkan xxhdpi untuk resolusi 480dpi. Saat ini sudah jarang device
dengan resolusi ldpi.
Coba buka direktori tersebut, terdapat icon launcher untuk masing-masing
resolusi (ic-launcher.png), dapat dilihat ukuran yang berbeda untuk setiap
resolusi. Jadi untuk hasil yang maksimal, untuk setiap image yang akan
anda gunakan harus disediakan 4 image untuk setiap resolusi (mdpi sampai
dengan xxhdpi). Hal ini untuk mencegah gambar yang digunakan terlihat
pecah atau terlalu kecil pada device dengan resolusi berbeda.

23

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Misalnya kita akan menambah button dan image view. Sebagai sumber
gambar kita akan menggunakan icon standard yang sudah ada direktori
drawable. Di window palette, pilih images & media lalu Image View
(paling kiri)

Pilih ic_launcher

Coba lakukan yang sama untuk widget


tampilannya akan seperti ini

Image Button sehingga

Coba jalankan dan klik terutama untuk button-nya.


Untuk menambahkan image bersama-sama dengan teks pada button, dapat
digunakan komponen button (bukan ImageButton) lalu set atribut
drawableLeft
dengan
image
yang
diinginkan.
Coba tambah button, dan isi drawableLeft.

24

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Hasilnya :

Coba ganti drawableLeft dengan drawableRight, drawableTop atau


drawableButtom.
D. EditText
EditText digunakan untuk menerima input dari pengguna. Pada palette
telah disediakan berbagai jenis EditText, silahkan dicoba satu persatu dan
perhatikan XML yang dihasilkan.

E. Spinner
Spinner digunakan untuk menampilkan pilihan seperti combo box. Pada
palette telah disediakan, silahkan dicoba dan perhatikan XML yang
dihasilkan.

Buat spinner id diganti dengan spinnerAgama. Tambahkan code program


pada MainActivity.java seperti gambar di bawah ini

25

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Hasil :

F. CheckBox
User dapat memilih lebih dari satu pilihan dengan checkbox. Pada palette,
Checkbox ada di bagian FormWidgets.
Coba tambahkan dua checkboxs lalu set atribut id dan text melalui window
property. Tambahkan Button dan TextView di form untuk menampilkan
hasil pilihan user. Sehingga tampilannya akan seperti ini.

Sedangkan XML-nya akan seperti ini, anda dapat langsung mengedit file
XML ataupun melalui window property. Jangan lupa atribut onClick:

26

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Tambahkan di activity code method actoinHasil sebagai berikut,


perhatikan penggunaan isChecked untuk mengambil nilai apakah user
meng-check pilihan:

27

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Latihan CheckBox:
Buat soal berikut yang penggunanya dapat memilih lebih dari satu:
-------------------------------------------------------------------------------1. Manakah kota dibawah ini yang merupakan ibu kota propinsi?
Bandung
Bogor
Banjarmasin
ini button
Bontang
Periksa Nilai
Nilai anda: [ditampilkan setelah tombol periksa nilai diklik]
-------------------------------------------------------------------------------Jawaban yang benar adalah Bandung dan Banjarmasin. Setiap jawaban
benar bernilai 10, tetapi setiap jawaban yang salah akan dikurangi 5. Jadi jika
pengguna menjawab Bandung, Bogor dan Banjarmasin dan maka
pengguna mendapat nilai 20 5 = 15. Tampilkan nilai ini.
Catatan: input dari method setText adalah teks, sehingga nilai integer harus
dikonversi terlebih dulu menjadi teks. Gunakan Integer.toString(intNilai).

G. RadioButton
Pada radioButton, hanya satu pilihan yang boleh aktif (mutual exclusive) di
dalam satu group yang disebut radioGroup. Modifikasi program checkbox
diatas, tambahkan radio group (bukan radiobutton) yang ada di Form
Widget

Hasilnya:

Tambahkan button dan textview, lalu gunakan property untuk mengedit


sehingga hasilnya seperti berikut. Ganti id RadioGroup dengan rgJenisKel,
radiobutton dengan rbLaki dan rbPerempuan dan id TextView dengan

28

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

tvHasilRadio. Tambahkan property onClick pada button dengan nama


klikHasilRadio

Catatan: Anda dapat mengeset atribut android:orientation pada RadioGroup


menjadi horizontal agar radio button tersusun secara mendatar.

Sedangkan code saat tombol diklik adalah sebagai berikut.Perhatikan


pengunaan getCheckRadioButtonId yang mengambil idRadio yang dipilih
oleh pengguna:

Latihan:
Buat soal berikut yang penggunanya hanya dapat memilih tepat satu:
-------------------------------------------------------------------------------1. Sebutkan ibu kota propinsi Sulawesi Tenggara?
Samarinda
Kendari
Palu
ini button
Makasar
Periksa Nilai
Nilai anda: [ditampilkan setelah tombol periksa nilai diklik]
-------------------------------------------------------------------------------Jawaban yang benar adalah Kendari. Jika pengguna memilih pilihan yang
benar akan mendapat nilai 10, sedangkan jika menjawab salah maka akan
mendapat nilai -2
29

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

H. ListView
List view adalah widget untuk menampilkan data dalam bentuk list yang
dapat di-scroll. Karena ukuran layar smartphone terbatas, listview
merupakan salah satu widget terpenting dan paling sering digunakan untuk
menampilkan kelompok informasi.
ListView dapat berbentuk sederhana sampai kompleks. Beberapa contoh

Kita akan mulai dengan membuat list sederhana seperti gambar di bawah:

Pertama, buat project baru lalu pilih Composite dan tambahkan ListView
diactivity_main.xml

30

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Ganti id list view dengan listAngka


Di activity utama MainActivity.java, tambahkan code sebagai berikut:

Coba jalankan.

31

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Pada code di atas, dibuat adapter berisi string untuk mengisi list.
Sedangkan R.layout.simple_expandable_list_item1 adalah layout standard
yang disediakan Android.
Bagaimana mengupdate isi listview saat program sedang berjalan?
Untuk mengupdate data pada contoh diatas, nilai array dapat langsung
diubah lalu panggil method adapter.notifyDataSetChanged()untuk
merefresh tampilan. Sebagai contoh, kita akan membuat button yang saat
diklik akan mengubah item pertama:
Tambahkan button diatas listview

Tambahkan event onClick bernama actionButton dan kode pada


MainActivity.java seperti berikut:

32

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

I. Composite ListView
Listview juga dapat digunakan untuk menampilkan struktur yang
lebih rumit. Contoh berikut memperlihatkan listview dengan isi yang kita
tentukan sendiri.

Untuk membuatnya, pertama buat project baru. Tambahkan


ListView seperti pada contoh sebelumnya. Ganti id dengan listJudul.

Kemudian kita akan buat layout untuk setiap baris pada ListView
yang berisi judul dan keterangan. Pilih project pada project explorer, lalu
klik kanan Android Tools New Resources File

33

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Catatan: alternatif lain membuat layout XML, klik kanan project new
Android XML File.
Pilih resource type Layout. Beri nama file row.xml, pilih root
element LinearLayout, XML akan dibuat di dalam direktori /res/layout.
File row.xml ini akan menentukan layout dari setiap baris pada listview.

Pada row.xml yang baru digenerate tambahkan widget LargeText


dan TextView (gambar bawah).
Ganti Id kedua komponen itu.
LargeText dengan tvJudul dan TextView dengan tvKeterangan.

Pada contoh di atas hanya digunakan dua widget (LargeText dan


TextView), tapi sebenarnya apapun dapat dimasukkan di dalam layout ini.
Misalnya Button, ImageView dan lainnya. Ini memungkinkan kita
membuat ListView dengan isi yang kompleks.
Sekarang buat class untuk yang menampung data judul dan
keterangan. Pada project explorer, pilih /src/[package], klik kanan new
Class

34

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Beri nama DataList

Berikut isi dari DataList. Class ini akan berisi data yang akan
muncul di setiap baris.

Selanjutnya kita akan buat adapter untuk list. Fungsinya untuk


mengisi setiap row dengan isi objek DataList.
Buat class dengan cara yang sama dengan sebelumnya (klik
/src/[package], klik kanan, new class), beri nama DataAdapter, jadikan
class ini turunan dari kelas ArrayAdapter.
Klik browse di dialog saat membuat class di bagian superclass
(gambar bawahh)

Ketik Array, maka akan muncul ArrayAdapter, pilih item


tersebut (gambar bawah)

35

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Isi class DataAdapter adalah sebagai berikut. Pada method


getView, parameter pos adalah indeks baris. Perhatikan pengisian tvJudul
dan tvKeterangan dengan data sesuai indeks.

Terakhir, di activity utama (MainActivity.java) tambahkan kode


berikut:

36

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Jika dijalankan, hasilnya akan seperti ini:

Latihan:
Buat program dengan tampilan seperti berikut, saat tombol diklik, maka isi list
akan bertambah sesuai dengan nim dan nama. Tip: gunakan
adapter.notifyDataSetChanged() untuk merefresh data.

37

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Pengangan Click pada List View


Listview sering digunakan untuk menampilkan data masterdetail yang jika di tap barisnya akan menampilkan detil pada layar
terpisah. Listview juga dapat digunakan untuk menampilkan menu.
Untuk
menangani
setOnItemClickListener

tap

pada

listview,

gunakan

method

Contoh berikut akan menampilkan dialog singkat jika baris


ditekan, judul pada baris juga akan berubah menjadi warna merah.
Berdasarkan kode pada contoh listview sebelumnya, tambahkan kode
berikut (bagian yang dilingkari). Penjelasan tentang Toast ada di sub bab
berikutnya.

Hasilnya :

38

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Pertemuan 4
Dialog

A. DIALOG
Seringkali app perlu menyampaikan pesan sementara kepada
pengguna, misalnya jika menampilkan informasi, melaporkan kesalahan
atau memperlihatkan proses yang memakan waktu lama.
B. TOAST
Toast digunakan untuk menampilkan pesan yang kemudian akan
menghilang dengan sendirinya tanpa interaksi dengan pengguna. Fokus
juga tetap pada aplikasi dan tidak berpindah ke Toast. Kelebihan Toast
adalah mudah untuk dibuat, sedangkan kelemahannya adalah pengguna
dapat saja tidak melihat pesan yang dikandung Toast.
Untuk mencobanya, buat project baru, tambahkan satu button, beri
label Toast

39

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

dan kode berikut pada activity_main.xml:

dan kode berikut pada MainActivity.java:

C. ALERT DIALOG
Jika yang diinginkan adalah dialog yang muncul dan harus ditutup
secara manual oleh pengguna maka dapat digunakan AlertDialog.
AlertDialog dapat menampilkan tiga button.
Tambahkan button pada program sebelumnya, beri
AlertDialog. Tambahkan code berikut untuk event onClick.

label

40

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

dan kode berikut pada MainActivity.java:

Hasilnya dapat dilihat dibawah ini:

41

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Selain setMessage dan setPositiveButton, dapat digunakan method


setTitle, setIcon untuk mengeset judul dan icon message dan
SetNeutralButton (button tengah) dan SetNegativeButton.
Berikut
contohnya . Ubah code program pada actionAlert

42

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Hasil :

Di dalam Dialog kita juga bisa menambahkan widget. Tambahkan


button pada program sebelumnya, beri label WidgetDialog. Tambahkan
code berikut untuk event onClick.

Tambahkan code berikut ini pada MainActivity.java

43

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

public void actionWidget(View v) {


LinearLayout linearLayout = new LinearLayout(this);
linearLayout.setOrientation(LinearLayout.VERTICAL);
final RadioGroup rg = new RadioGroup(this);
final RadioButton rbPria = new RadioButton(this);
rbPria.setText("Pria");
final RadioButton rbWanita = new RadioButton(this);
rbWanita.setText("Wanita");
rg.addView(rbPria, 0);
rg.addView(rbWanita, 1);
linearLayout.addView(rg);
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle("ALERT WIDGET")
.setView(linearLayout)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
if(rbPria.isChecked()){
Toast.makeText(getApplicationContext(), "Pria",
Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(getApplicationContext(), "Wanita",
Toast.LENGTH_SHORT).show();
}
}
})
.setNeutralButton("CANCEL", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
arg0.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}

44

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Hasilnya:

Apabila kita pilih Pria lalu tombol OK di klik maka akan mucul

Kita bias menambahkan widget yang lain yang kita inginkan

45

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Latihan:
Buat program dengan tampilan seperti berikut apabila saat tombol button diklik,
maka akan tampil AlertDialog seperti gambar dibawah ini. Jika di tekan tombol
OK maka akan menampilkan dialog yang sesuia apa yang di inputkan. Jika di
tekan tombol CANCEL maka akan kembali. Tip : Unutk menampilkan agama
gunakan Spinner

Hasilnya

46

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Logging
Fitur logging digunakan untuk memberikan keterangan apa yang sedang terjadi
pada app. Manfaat utama fitur ini adalah untuk mendebug app.
Sebagai contoh, buka project yang pernah anda buat sebelumnya. Lalu pada
bagian MainActivity onCreate tambahkan log sebagai berikut. yw adalah tag
dan dapat diganti dengan string apapun.

Buka tab logcat dan jalankan program

Terlihat banyak message di dalam logcat, untuk memfilternya sesuai dengan tag
yang kita tentukan sebelumnya, tambahkan filter (gambar bawah). Nama filter
dapat diisi bebas.

47

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Fitur filter yang lain adalah memfilter berdasarkan jenis lognya (verbose sampai
dengan error), terutama untuk jenis error.

Pada contoh diatas kita menggunakan Log.i (info), selain itu dapat digunakan
method Log.v(), Log.d(), log.w() dan Log.e() untuk verbose, debug, warn dan
error.
Tips: untuk tag, dianjurkan menggunakan variabel yang ditempelkan di class
activity (code dibawah)

public class MainActivity extends Activity {


private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(TAG,"program dimulai");
}

48

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Pertemuan 5
Activity dan Intent
Dalam materi sebelumnya, selalu digunakan satu activity. Tentu saja
sebuah applikasi sering membutuhkan lebih dari satu activity. Activity adalah
komponen terkecil penyusun Android App yang berisi satu kegiatan yang dapat
dilakukan oleh pengguna.
Untuk menghubungkan antar activity dapat digunakan intent. Intent adalah
fasilitas untuk menghubungkan satu activity ke activity yang lain, baik untuk app
yang sama maupun app yang berbeda. Intent juga digunakan untuk notifikasi
event misalnya SD card dimasukkan, SMS masuk dan lain-lain.
Untuk lebih memahami activity dan intent, sekarang coba buka salah satu app
android yang telah dibuat sebelumnya, lalu pada project explorer pilih
AndroidManifest.xml. File XML ini berisi property aplikasi, termasuk di
dalamnya activity dan intent

Klik xml-nya dibagian bawah

Lihat tag activity, dapat dilihat ada satu activity dengan property nama dan label.

49

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Selain itu ada tag intent-filter yang digunakan untuk memfilter intent yang dapat
dihandle activity. android.intent.categori.LAUNCHER menyatakan activity ini
adalah initial activity yang dapat dipanggil langsung oleh launcher sedangkan
intent.action.MAIN menyatakan activity ini adalah initial activity tanpa data input
dan tidak menghasilkan output.

Sekarang kita akan membuat contoh app yang memiliki dua activity.
Pertama buat project baru. Kemudian langsung buat activity kedua, caranya buat
class baru: di project explorer klik package, klik kanan New Class. Beri
nama class ini ActivityDua dan pastikan superclass kelas ini adalah
android.app.Activity (gambar bawah)

50

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Sekarang kita perlu menambahkan activity ini di AndroidManifest.xml. Isi atribut


name dengan nama class lengkap dengan nama package dan label.
Penting: Tanpa menambahkan activity ke dalam AndroidManifest.xml, akan
terjadi force close saat program dijalankan.

Setelah klik Browse tunggu sehingga muncul dua activity seperti pada gambar

51

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Setelah itu jangan lupa di save (Ctrl+S). Dapat dilihat hasilnya pada
AndroidManifest.xml

Sekarang kembali ke activity utama (MainActivity), tambahkan button di


activity_main.xml, isi atribut onClick dengan clickButton. Buat implementasi
method clickButton sebagai berikut, perhatikan pengunaan class Intent:

Dari kode diatas dapat dilihat bahwa intent merupakan struktur data (objek) yang
dilempar sebagai paramater ke method startActivity.
Jika program dijalankan hasilnya akan seperti ini. Terlihat label pada ActivityDua
yang disimpan di dalam AndroidManifest.xml akan menjadi title.

52

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Terlihat ActivityDua masih polos tanpa layout. Sekarang kita akan membuat
layout untuk activity tersebut. Ini mirip saat membuat layout baris pada ListView.
Untuk membuat file layout, pilih project di project explorer, klik kanan,
AndroidTools New Resources File. Pilih resource type Layout. Beri nama
file activity_dua.xml, pilih root element LinearLayout (gambar bawah)

Tambahkan widget Large Text ke dalam layout, beri id tvDua dan save.

Sekarang kita perlu meload layout ini saat activity kedua dijalankan. Buka class
ActivityDua dan tambahkan kode dibawah dan coba jalankan.

Pertukaran Data antar Activity


Pada contoh sebelumnya, activity kedua dipanggil tanpa ada data yang dikirimkan
dari activity utama ke maupun data kembali. Sekarang kita akan belajar
bagaimana cara mengirim dan menerima data antar activity.

53

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Mengirimkan data ke activity


Kita akan memodifikasi contoh pada app sebelumnya (app dengan dua activity).
Pada MainActivity, ubah kode sebagai berikut, perhatikan method putExtra untuk
menambahkan data yang akan dikirim.

Sedangakan di ActivityDua tambah kode sebagai berikut untuk menerima data.


Method onStart ini akan otomatis dipanggil saat activity mulai dijalankan setelah
onCreate. Coba jalankan kembali app ini.

Menerima data dari actvity yang dipanggil


Untuk mengirimkan dan menerima data dari activity, dapat digunakan method
startActivityForResult.
Sebagai contoh, kita akan membuat activity yang memanggil activity lain,
pengguna mengisi data pada activity tersebut dan mengirimkannya kembali ke
activity utama. Kita akan memodifikasi program sebelumnya.
Catatan: jika anda mau program sebelumnya tidak hilang anda dapat menduplikasi
project dengan mencopy-paste project tersebut pada package explorer.
Sekarang kita kembali ke activity utama MainActivity, gunakan method putExtra
untuk menambahkan data ke intent. Pada startActivityForResult terdapat
parameter angka 99 (silahkan ganti dengan angka atau konstanta apapun).
Paremeter ini diperlukan karena satu activity bisa mengirimkan banyak intent dan
diperlukan cara untuk membedakan antara satu intent dengan intent yang lain.
Method onActivityResult akan dipanggil saat activity yang dipanggil telah selesai.

54

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Selanjutnya kita akan menambahkan widget editText pada activity dua yang dapat
diedit oleh pengguna dan hasilnya akan dikirimkan kembali ke activity utama.
Buka res/layout/activity_dua.xml. Tambakan satu editText dan satu button. Beri
nama etNama dan tambahkan android:onClick="clickButtonActDua" di button.

Sekarang kita akan membuat kode di activitydua yang akan mengisi editText
dengan data yang dikirim dari activity utama dan setelah button ditekan
mengirimkan hasil update ke activity utama. Buka file ActivityDua.java dan
tambahkan kode berikut:

55

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Jika dijalankan hasilnya sebagai berikut

Latihan Activity-Intent
Menggunakan listview (layar1), tampilkan daftar nama mahasiswa. Pengguna
dapat men-tap nama (baris), dan kemudian app akan menampilkan informasi
yang lebih detil berisi NIM, NAMA, ALAMAT dan NOHP (layar2). Pada layar
informasi detil (layar2) tersebut ada button EDIT yang jika diklik akan
membawa ke layar ketiga yang berisi editText untuk mengupdate data. Hasil
update akan muncul baik di layar1 dan layar2

56

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Activity Life Cycle


Pada contoh sebelumnya, kita telah menggunakan lebih dari satu activity. Setiap
activity memiliki siklus seperti gambar dibawah. Saat pertama kali dijalankan
activty akan berada dalam status active. Ketika user pindah app atau menjalankan
activity lain maka status dapat berubah menjadi paused atau stopped. Setelah itu
app bisa kembali active (user membuka kembali) atau di-destroy oleh Android
(memori habis).
Kita dapat menangani setiap fase dari activity. Ini berguna misalnya untuk app
game, pada saat activity berubah dari active menjadi paused, maka game juga
harus otomatis dipaused dan jika activity di-kill oleh Android, maka state game
perlu disimpan dan dikembalikan. Demikian juga untuk app yang menggunakan
sensor, koneksi dengan sensor perlu dilepaskan saat app di-pause atau distop.

Active/Running

hilang fokus tapi masih visible

Paused

sistem kekurangan memori


tidak visible

Destroyed

sistem kekurangan memori

Stopped

Saat activity di-pause, maka akan dipanggil onPause(). Ini artinya activity masih
terlihat walaupun cuma sebagian. Isi dari onPause tidak boleh terlalu berat, seperti
menulis ke database karena akan memperlambat proses transisi ke activity lain.
Umumnya onPause digunakan untuk tiga hal: menstop animasi atau aktivitas yang
menggunakan banyak CPU; commit input dari user (misalnya draft email);
melepaskan system resources seperti sensor atau kamera.

Saat activity berubah dari pause menjadi stop, maka akan dipanggil onStop().
Pada method ini dapat dilakukan komputasi yang kompleks untuk menyimpan
state. Pada saat kondisi stop, activity sama sekali tidak muncul di layar dan fokus
sudah berada di app lain.
Jika app kembali aktif, maka akan dipanggil onResume(). Pada method ini
lakukan proses untuk mengembalikan kondisi app seperti semula (kebalikan dari
onStop). Selain onResume, untuk state stop ada event lain yang terlibat yaitu
onRestart. Hubungan keduanya dapat dilihat pada gambar bawah

57

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

diambil dari: http://developer.android.com/training/basics/activitylifecycle/stopping.html


Dari gambar diatas, dapat dilihat urutan pada dari state stop menuju resumed
urutannya adalah OnRestart() onStart() onResume()
Contoh penggunaan onPause() dan onResume() dapat dilihat pada subbab
mengenai sensor.

58

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Pertemuan 6
Layout Manager

. Untuk meletakan komponen (view) pada layar, android menggunakan


layout manager. Karena ukuran layar device Android sangat beragam, tidak ada
peletakan posisi widget secara eksak per pixel.
Terdapat empat jenis layout manager yang memiliki fungsi

masing-masing.

LinearLayout, TableLayout, RelativeLayout dan FrameLayout. Berikut akan


dibahas lebih rinci untuk setiap layout.
A. Relative Layout
RelativeLayout mengatur posisi secara relatif berdasarkan posisi widget
yang lain atau parentnya. Sebagai contoh, dua widget pada gambar di
bawah. EditText posisinya relatif terhadap textView nama.

Contoh deklarasinya adalah sebagai berikut:

59

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Untuk layout_width dan layout_height ada dua pilihan: match_parent


(view berusaha sebesar parent) dan wrap_content (view hanya berusaha
sebesar content yang berada di dalamnya). Sedangkan padding
menyatakan jarak antara pinggir layar dengan komponen.

Perhatikan penggunaan atribut layout_toRightOf yang menyatakan bahwa


EditText

berada

disebelah

kanan

label.

Sedangkan

atribut

layout_baseLine digunakan agar TextView dan EditText aligned. Jika


layout_baseLine dihapus efeknya akan sebagai berikut (Text View terlalu
tinggi posisinya):

Beberapa atribut lain yang mengatur posisi widget dibandingkan dengan


widget lain adalah:

android:layout_above
android:layout_below
android:layout_toLeftOf
android:layout_toRightOf.

Untuk

mengatur

posisi

ada

tambahan

lima

atribut:

android:

layout_alignTop, android:layout_alignBottom, android:layout_alignLeft,


android:layout_alignBaseline

Contoh jika kita ingin menambahkan button sehingga posisinya sebagai


berikut:

Maka deklarasi buttonnya adalah sebagai berikut:

60

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Artinya button tersebut dibawah dan disebelah kanan EditText.

Widget juga dapat diatur berdasarkan gravity android:layout_gravity ada


beberapa pilihan untuk gravity ini: left, right, center_horizontal,
center_vertical, bottom, top.

Gravity ini juga berlaku untuk layout

manager yang lain. Berikut adalah contohnya:

Hasilnya:

Silahkan bereksperimen dengan berbagai setting atribut layout.

61

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

B. Table Layout
Untuk memilih layout manager, selain dengan cara manual dapat juga
ditentukan membuat layout (File New Other Android XML
Layout File). Saat muncul dialog berikut, pilih Root Element sebagai
TableLayout.

Buatlah project :

TableLayout meletakan komponen dalam bentuk tabel (baris dan kolom),


mirip seperti Table yang digunakan di HTML. Pengguna mendefinisikan
baris dengan tag <TableRow> dan sistem secara otomatis mendefinisikan
kolomnya. Contoh deklarasi berikut:

62

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Gantir New Layout Type dengan TableLayout

Ubahlah file activity_main.xml seperti gambar di bawah ini

63

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Hasilnya adalah sebagai berikut. Bayangkan sebagai sebuah tabel dengan


dua kolom dan dua baris.

Kolom 0

Kolom 1

Misalnya kita ingin agar EditText sampai ke bagian belakang, maka


tambahkan android:stretchColumns="1" pada TableLayout. Maka kolom
1 akan terisi penuh.

64

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Hasilnya:

Untuk menambahkan widget di kolom terntentu, gunakan


aandroid:layout_column. Misalnya kita akan menambahkan TextView di
kolom 1 (ingat kolom dimulai dari 0). Ini bisa dilakukan dengan
menggunakan atribut android:layout_column. Tanpa atribut ini, TextView
akan muncul di kolom 0

Hasilnya sebagai berikut:

65

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

C. Frame Layout
Framelayout digunakan untuk menampilkan satu komponen dalam satu
layar. Jika ada lebih dari satu widget, maka akan ditampilkan secara
bertumpuk, walaupun posisi widget dapat diatur dengan gravity. Kita bisa
menambahkan layout lain sebagai child di dalam frame layout.
Contoh untuk deklarasi berikut menampilkan dua ImageView (pastikan
file image telah disimpan di direktori [project]/res/drawable-hdpi,
[project]/res/drawable-ldpi dan [project]/res/drawable-mdpi )

Ubahlah layout dengan cara yang sama menjadi Framelayout dan


kemudian Ubahlah file activity_main.xml seperti gambar di bawah ini

66

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Hasilnya gambar akan bertumpuk seperti ini

D. LinearLayout
Sesuai dengan namanya, linear layout menyimpan widget dalam satu baris
atau satu kolom (tergantung orientasinya).
Jika orientasinya vertical
seperti ini

(android:orientation="vertical") maka hasilnya akan

67

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Sedangkan jika orientasinya horizontal (android:orientation="horizontal"), maka


hasilnya akan seperti ini.

E. ScrollView
Dengan scrollview, layout seolah-olah memiliki layar yang lebih luas.
Pengguna dapat melakukan scroll. Scrollview hanya mempunyai satu child
dan umumnya adalah LinearLayout. Scrollview hanya dapat melakukan
vertical scrolling, gunakan HorizontalScrollView untuk layout yang dapat
discroll secara horizontal.
Jangan gunakan Listview bersama layout ini karena listview telah
memiliki mekanisme scrolling tersendiri.
Berikut adalah contoh scrollview yang menghasilkan layout seperti ini
yang dapat discroll. Dua button teratas menggunakan RelativeLayout yang
disisipkan dalam ScrollView. Ini adalah contoh penggabungan antara dua
layout.

68

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Latihan Menggabungkan beberapa layout

Ubahlah default layout RelativeLayout dengan ScrollView dengan cara yang


pernah di ajarkan .
Tambah kan layout LinearLayout(Vertical) didalam layout ScrollVew seperti
pada gambar, dibawah ini

Ganti layout_width = match_parent


layout_height = wrap_content

69

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Kemudian Tambah kan RelativeLayout di dalam LinearLayout. Setelah itu


tambahkan Widget dua buah Button di dalam Relative Layout. Dan tambahkan
beberapa Widget Button di dalam LinearLayout. Seperti code di bawah ini
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/ScrollView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="110dp"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="24dp"
android:text="Button" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:text="Button" />
</RelativeLayout>

70

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

<Button
android:id="@+id/button9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button13"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button11"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button12"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

71

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

android:text="Button" />
</LinearLayout>
</ScrollView>

Latihan Layout
Berdasarkan hasil latihan activity-intent, pada layar2 dan layar3, tambahkan
layout yang tepat agar tampilan widget rapi.

72

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Pertemuan 7
Action Bar

Actionbar adalah bar yang berada diatas activity yang mulai diperkenalkan
sejak Android 3. Action bar memperlihatkan identitas berupa judul dan icon
activity, tempat fitur-fitur utama (misalnya search, shared, create dsb), dan dapat
digunakan untuk navigasi global.
Beberapa contoh action bar:

(sumber: 8)
Untuk mengimplementasikan ActionBar pada Android dengan versi lebih kecil
dari 3 dapat menggunakan library actionbarsherlock.com
Dalam aplikasi sebelumnya, sebenarnya kita secara default selalu membuat
ActionBar karena minimal SDK diset 11 (Android 3.0). Coba buka
MainActvity.java dan lihat function onCreateOptionMenu. Terlihat fungsi ini
mengisi ActionBar dengan isi res/menu/main.xml

73

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Coba lihat /res/menu/main.xml

Kita akan bahas lebih detil tentang ini pada bagian berikutnya.
ActionItem
ActionItem berbentuk button atau text yang dapat diakses langsung dari
ActionBar. Jika tidak cukup, maka actionitem akan muncul di overflow menu.
Buat project baru, pastikan minimal SDK diisi dengan 11 (Android 3.0)

Kemudian buka /res/menu/main.xml. Isi dengan item sebagai berikut. Kita


menambahkan dua item Add dan Delete yang akan muncul jika tempatnya
cukup (ifRoom).

74

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Kemudian :

Jangan lupa di simpan (Ctrl+S) untuk melihat perubahaannya


Lakukan cara yang sama untuk Delete sehingga terlihat file menu.xml seperti
dibawah ini.

75

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Saat dijalankan akan menghasilkan ActionBar sebagai berikut.

Sekarang kita akan buat aksi kalau ADD atau DELETE ditekan. Override
fungsi onOptionsItemSelected dan cek hasil getItemId().

String Resources
Pada kode diatas kata add dan delete dimasukkan ke dalam kode. Ini bukan
praktek yang baik (perhatikan warning pada /main.xml), karena akan menyulitkan
jika app akan diporting untuk bahasa lain. Solusinya adalah dengan menggunakan
string resources.
Pertama-tama, buka /res/values/strings.xml. Perhatikan bahwa secara default telah
ada string untuk nama app (app_name) dan lainnya. Tambahkan add dan delete
(gambar bawah). Jangan lupa save setelah selesai.

76

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Selanjutnya resource dapat diakses dalam file xml dengan @string/nama_res"


sedangkan untuk mengaksesnya dalam source code gunakan R.string.nama_res.
Sekarang kita akan mengubah item menu. Buka /res/menu/main.xml ganti kata
add dan delete dengan @string/add dan @string/delete

Sedangkan untuk
R.string.delete.

MainActivity.java,

ganti

dengan

R.string.add

dan

Icon
Umumnya action bar menggunakan icon yang lebih mudah dikenali oleh
pengguna. Untuk menambahkan icon, cara yang paling mudah adalah
mendownload
Android
design
icon
di:
http://developer.android.com/design/downloads/index.html
Setelah download dan ekstrak, pilih all_icons/holo_dark dan copy icon yang
diinginkan (dengan Windows Explorer) ke direktori /res/drawable-hdpi,
/res/drawable-mdpi dan /res/drawable-xhdpi. Ingat dalam pembahasan
sebelumnya bahwa setiap resoulusi membutuhkan gambar yang terpisah.
Setelah itu masuk ke package explorer dan refresh (F5), hasilnya akan seperti ini:

77

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Sesuai dengan penamaan standard untuk icon ActionBar, rename agar didahului
dengan ic_menu_ Untuk me-rename, klik kanan pada nama file refactor
rename. Semua resolusi secara otomatis akan diganti. Sehingga hasilnya sebagai
berikut:

Sekarang buka res/menu/main.xml dan tambahkan atribut android:icon

Jalankan dan hasilnya akan seperti berikut:

78

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Jika kita ingin menambahkan teks disebelah icon, tambahkan nilai withText
pada android:showAsAction sebagai berikut:

Jika dijalankan hasilnya tidak berubah. Mengapa? karena tidak cukup ruang untuk
menambahkan teks. Coba ubah orientasi AVD menjadi landscape dengan ctrl-F11
maka tulisan akan muncul (gambar bawah). Untuk mengembalikan menjadi
portrait tekan ctrl-F12.
Selain ifRoom dan withText, pilihan yang lain adalah never agar item
hanya muncul di overlflow menu (gambar bawah)

Latihan:
Modifikasi latihan activity-intent , tambahkan action item delete dan edit saat
detil data mahasiswa (layar2)

79

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Pertemuan 8
Ujian Tengah Semester

Soal UJIAN TENGAH SEMESTER TERPISAH

80

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Pertemuan 9
Penyimpanan Data

Android menyediakan beberapa cara untuk menyimpan data: file,


relasional database dengan SQLlite dan pasangan key/value yang disebut sistem
preferences. Untuk sharing antar aplikasi disediakan mekanisme yang disebut
ContentProvider.
Shared Preferences
Shared Preferences (SP) adalah mekanisme untuk menyimpan pasangan key-value
untuk tipe data primitif (integer, double, string, booelan). SP cocok untuk
penggunaan ringan seperti menyimpan setting aplikasi dan kondisi user interface
misalnya pada saat activity masuk ke state sleep karena device menerima telepon.
Data dalam shared preferences disimpan dalam device android dalam bentuk
XML.
Ada tiga mode untuk shared preferences (SP)
MODE_PRIVATE: hanya aplikasi yang membuat SP yang dapat mengakses data
MODE_WORLD_READABLE: aplikasi lain boleh membaca
MODE_WORLD_WRITEABLE: aplikasi lain boleh membaca sekaligus menulis.
Shared Preference objek untuk activity diperoleh melalui method
getPreferences(). Contoh Kode berikut memperlihatkan cara penggunaan SP.
Jangan lupa memanggil commit!
Buat project

81

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Jalankan. Kemudian coba komentari bagian isi data, dan jalankan kembali
aplikasi.

Dapat dilihat data nama dan umur tersimpan walaupun aplikasi sudah ditutup.
Latihan:
Buat applikasi yang menyimpan berapa kali aplikasi telah dijalankan. Tampilkan
jumlah tersebut.
Pertemuan 10
Topik Pertemuan 10

82

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

SQLite
SQLite adalah embedded database (hanya menggunakan sekitar 250KB memori)
yang menyediakan fasilitas relational DBMS termasuk SQL. Referensi lengkap
SQLite dapat dilihat di http://www.sqlite.org/ SQLite tidak hanya digunakan di
Android.
Setiap aplikasi memiliki instance database tersendiri, dan berbeda dengan shared
preference, tidak disediakan fasilitas agar aplikasi dapat membaca database
aplikasi lain.
Untuk menggunakan SQLite, sangat dianjurkan menggunakan class helper untuk
membuka dan menutup database, menginisiasi tabel dst. Helper juga digunakan
saat melakukan upgrade struktur database jika suatu saat aplikasi diupdate. Class
helper ini diturunkan dari class SQLiteOpenHelper.
Buatlah project baru :

Untuk latihan kita akan membuat aplikasi sederhana yang menyimpan data
mahasiswa berupa nama dan nomor telpon. Pertama kita buat class helper terlebih
dulu. Tambahkan ke dalam project tersebut satu class (ke project explorer, pilih
src/nama package; klik kanan New Class). Pastikan superclass kelas ini
adalah SQLiteOpenHelper. Beri nama class ini OpenHelper.

83

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Pada class OpenHelper berikut akan dibuat tabel Mahasiswa dan penanganan jika
database diuprade.

84

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Selanjutnya kita akan membuat class yang melakukan manipulasi terhadap data
(insert, ambil data). Beri nama DbMahasiswa, source code DbMahasiwa adalah
sebagai berikut:
package com.example.latihansepuluh;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
public class DbMahasiswa {
//class yang menampung record Mahasiswa
public static class Mahasiswa {
public String nama;
public String telepon;
}
private SQLiteDatabase db;
private final Context con;
private final OpenHelper dbHelper;
public DbMahasiswa (Context c) {
con = c;
dbHelper = new OpenHelper(con,"",null,0);
}
public void open() {
db = dbHelper.getWritableDatabase();
}
public void close() {
db.close();
}
public long insertMahasiswa(String nama, String noTelp) {
ContentValues newValues = new ContentValues();
newValues.put("NAMA", nama);
newValues.put("TELEPON", noTelp);
return db.insert("MAHASISWA", null, newValues);
}
public Mahasiswa getMahasiswa(String nama) {

85

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Cursor cur = null;


Mahasiswa M = new Mahasiswa();
//kolom yang diambil
String[] cols = new String [] {"ID", "NAMA", "TELEPON"};
//parameter, akan mengganti ? pada NAMA=?
String[] param = {nama};
cur =
db.query("MAHASISWA",cols,"NAMA=?",param,null,null,null);
if (cur.getCount()>0) { //ada data? ambil
cur.moveToFirst();
M.nama = cur.getString(1);
M.telepon = cur.getString(2);
}
return M;
}
}
Setelah kita membuat class helper dan class dbMahasiswa, sekarang kita akan
memanfaatkan dua kelas tersebut. Kembali ke activity utama yaitu class
MainActivity. Tambahkan kode dibagian onCreate sebagai berikut:

Selain tipe INTEGER dan TEXT yang digunakan pada contoh diatas, dapat
digunakan tipe REAL, BLOB.

Semua tipe lain seperti boolean, date harus

dimasukkan ke dalam tipe tersebut. SQLite tidak melakukan pengecekan tipe,


sehingga bisa saja memasukkan tipe.

86

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Group By, Having, Order By


Pada kode sebelumnya dapat dilihat penggunaan db.query untuk mengambil data
mahasiswa dengan nama tertentu.

Method query menerima tujuh parameter. Parameter pertama adalah nama table,
parameter kedua adalah array kolom yang akan diambil (SELECT), parameter
ketiga adalah bagian seleksi record (bagian setelah where), parameter keempat
adalah isi bagian seleksi. Parameter 5, 6 dan 7 adalah bagian group by, having
dan order by.
Contoh penggunaan parameter 5-7 adalah sebagai berikut: jika kita menambahkan
field KELAS pada tabel MAHASISWA dan kita ingin menampilkan jumlah
mahasiswa per kelas (contoh misalnya ada kelas A, B, C dst), tapi hanya kelas
yang mempunyai anggota >1 dengan kelas terurut descending, maka query-nya
adalah sebagai berikut:

select kelas, count(*) as jum from mahasiswa


group by kelas
having jum > 1
order by kelas desc;
Maka di dalam program pemanggilan quernya adalah sebagai berikut:

group by
having

order by

RawQuery
Selain method query, tersedia juga rawQuery untuk memasukkan langsung query.
Sebagai contoh, berikut perbandingan antara query dengan rawQuery

87

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Mana yang lebih baik? beberapa sumber mengatakan query lebih cepat
dibandingkan rawQuery dan lebih mudah untuk dibaca.
Loop Semua Record
Untuk mengambil data semua record, dapat digunakan moveToNext() dalam
loop seperti pada contoh berikut

alternatif lain yang dapat digunakan untuk loop semua record adalah adalah:

Mengisi ListView dengan Record


Listview dapat langsung dihubungkan dengan database dan untuk mencegah user
interface yang tidak responsif (ANR: Application Not Responding), idealnya data
diload di background.
Untuk mencapai hal ini dapat digunakan SimpleCursorAdapter, ContentProvider
dan Loader. Sayangnya hal ini cukup kompleks (mudah-mudahan akan lebih
disederhanakan di API berikutnya). Berikut adalah contoh penggunakan ketiga
class tersebut.
Pertama buat project baru:

88

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Seperti dalam contoh sebelumnya, buat class helper yang merupakan turunan dari
kelas SQLiteOpenHelper.
Catatan: untuk dapat menggunakan cursor adapter, table harus mengandung field
_id

(huruf kecil)

package com.example.latihansebelas;
import
import
import
import

android.content.Context;
android.database.sqlite.SQLiteDatabase;
android.database.sqlite.SQLiteDatabase.CursorFactory;
android.database.sqlite.SQLiteOpenHelper;

public class DbHelper extends SQLiteOpenHelper {


private static final int DATABASE_VERSION =1;
private static final String DATABASE_NAME ="dbMhs";
//cursoradapter mewajibkan nama _id
//harus _id dengan huruf kecil, JANGAN _ID
private static final String TABLE_CREATE =
"CREATE TABLE MHS (_id integer primary key
autoincrement, " +
"nama text);";

public DbHelper(Context context, String name,

89

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

CursorFactory factory, int version) {


super
(context,DATABASE_NAME,factory,DATABASE_VERSION);
}
public DbHelper(Context context) {
super(context, DATABASE_NAME, null,
DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
//create database
db.execSQL(TABLE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVer,
int newVer) {
//jika database diupgrade, hapus yang lama, buat
yang baru
db.execSQL("DROP TABLE IF EXISTS MHS");
onCreate(db);
}
}
Selanjutnya kita akan membuat class Contentprovider untuk mengakses tabel.

Catatan:
Biasanya Contentprovider dibuat agar data app kita dapat diakses oleh
app lain. Tapi class Contentprovider juga dapat digunakan di app
sendiri secara private (tidak bisa diakses app lain). Keuntungan content
provider adalah:
1. Dapat dieksekusi secara asynchronus, sehingga menghindari error
app not responding.
2. Memberikan akses tunggal ke data.
3. Memudahkan hubungan antara view (widget) dengan data melalui
ContentObserver milik ContentResolver.
4. Dimanfaatkan untuk rest client app.

Kerugian menggunakan contentprovider? relatif rumit.

90

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Class ini merupakan turunan dari ContentProvider (gambar bawah)

Untuk tahap pertama hanya insert dan query yang dibuat. Update dan delete akan
dibahas berikutnya. Contentprovider yang dibuat ini juga dapat digunakan untuk
widget yang lain, tidak harus berupa ListView. Cara penggunaanya dapat dilihat
di MainActivity nanti.
package com.example.latihansebelas;
import
import
import
import
import
import

android.content.ContentProvider;
android.content.ContentValues;
android.content.UriMatcher;
android.database.Cursor;
android.database.sqlite.SQLiteDatabase;
android.net.Uri;

public class MhsContentProvider extends ContentProvider {


// database
private DbHelper database;
// konstanta2 dibawah mendefinisikan bagaimana
contentprovider ini diakses

91

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

// contentprovider diakses melalui URI


// contoh penggunaa URI ini dapat dilihat di
MainActivity
private static final int MHS = 1;
private static final int MHS_ID = 2;
private static final String AUTHORITY =
"com.example.latihansebelas.contentprovider";
private static final String BASE_PATH = "mhs";
public static final Uri CONTENT_URI =
Uri.parse("content://" + AUTHORITY
+ "/" + BASE_PATH);
private static final UriMatcher sURIMatcher = new
UriMatcher(
UriMatcher.NO_MATCH);
static {
sURIMatcher.addURI(AUTHORITY, BASE_PATH, MHS);
sURIMatcher.addURI(AUTHORITY, BASE_PATH + "/#",
MHS_ID);
}
@Override
public Uri insert(Uri uri, ContentValues values) {
// insert data
int uriType = sURIMatcher.match(uri);
SQLiteDatabase sqlDB =
database.getWritableDatabase();
long id = 0;
switch (uriType) {
case MHS:
id = sqlDB.insert("MHS", null, values);
break;
default:
throw new IllegalArgumentException("URI tdk
dikenal: " + uri);
}
// notifikasi
getContext().getContentResolver().notifyChange(uri,
null);
return Uri.parse(BASE_PATH + "/" + id);
}

92

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

@Override
public boolean onCreate() {
database = new DbHelper(getContext());
return false;
}
@Override
public Cursor query(Uri uri, String[] projection,
String selection,
String[] selectionArgs, String sortOrder) {
// query tabel
SQLiteDatabase db =
database.getWritableDatabase();
Cursor cur = null;
int uriType = sURIMatcher.match(uri);
switch (uriType) {
case MHS:
// ambil semua
cur = db.query("MHS", projection,
selection, selectionArgs,
sortOrder, null, null);
break;
case MHS_ID:
// ambil berdasarkan id nanti dibuat
break;
default:
throw new IllegalArgumentException("URI
tidak dikenal: " + uri);
}
// notifikasi
cur.setNotificationUri(getContext().getContentResolver
(), uri);
return cur;
}
@Override
public int update(Uri arg0, ContentValues arg1, String
arg2, String[] arg3) {
// nanti dibuat
return 0;
}

93

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

@Override
public int delete(Uri arg0, String arg1, String[]
arg2) {
// nanti dibuat
return 0;
}
@Override
public String getType(Uri arg0) {
// nanti dibuat
return null;
}
}
Content provider ini harus didaftarkan di AndroidManifest. Buka dan tambahkan
di dalam <application>. android:exported=false menunjukkan bahwa content
provider ini private dan tidak dapat diakses app lain. Sedangkan android:name
adalah nama kelas, penggunaan titik pada .MhsContentProvider
merupakan singkatan dari nama app. Jadi .MhsContentProvider artinya sama
dengan com.example.latihansebelas.MhsContentProvider

Lalu

94

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

kemudian

95

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Pada AndroidManifest.xml terlihat seperti dibawah ini

Setelah Helper dan ContentProvider dibuat, selanjutnya kita akan mempersiapkan


ListView. Caranya seperti ListView pada contoh sebelumnya. Buka
layout/activity_main.xml, drag listview.

96

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Selanjutnya buat xml layout baru sebagai isi dari baris di listview (pilih layout,
klik kanan new Android XML ) Beri nama row.xml, dan tambahkan dua
textview. Ganti namanya dengan tvNama dan tvId.

Sebelum di lanjutkan karena pada saat membuat project LatihanSebelas minimum


sdk adalah 8 maka kita ganti menjadi 11

Selanjutnya kita akan melengkapi ActivityMain.java. Activity ini mengimplemen


LoaderCallback sehingga data akan diload dibackground dan baru diisi ke
ListView saat sudah selesai. Pada activity ini akan diinsert dua record kemudian
ditampilkan dalam listview.

97

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

package com.example.latihansebelas;
import
import
import
import
import
import
import
import
import
import

android.os.Bundle;
android.app.Activity;
android.app.LoaderManager.LoaderCallbacks;
android.content.ContentValues;
android.content.CursorLoader;
android.content.Loader;
android.database.Cursor;
android.support.v4.widget.SimpleCursorAdapter;
android.view.Menu;
android.widget.ListView;

public class MainActivity extends Activity implements


LoaderCallbacks<Cursor>{
// adapter untuk listview
private SimpleCursorAdapter adapter;
private void insertData() {
// masukkan dua data untuk testing
ContentValues values = new ContentValues();
values.put("nama", "puji");
// perhatikan penggunaan URI untuk
mengidentifikasi contentprovider
// isi dari MhsContentProvider.CONTENT_URI
adalah:
//
content://edu.upi.cs.yudi.listviewdb.contentprovider/mhs
getContentResolver().insert(MhsContentProvider.CONTENT
_URI, values);
values = new ContentValues();
values.put("nama", "alvi");
getContentResolver().insert(MhsContentProvider.CONTENT
_URI, values);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

98

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

ListView lv = (ListView)
findViewById(R.id.listView1);
// testing insert data. Setelah dijalankan
sekali, bisa dikomentari
insertData();
// harus _id dengan huruf kecil!
String[] proj = new String[] { "_id", "nama" };
// widget UI yang dipetakan sesuai field diatas
(di row.xml)
int[] to = new int[] { R.id.tvId, R.id.tvNama };
getLoaderManager().initLoader(0, null, this);
// adapter yang digunakan adalah
simplecursoradapter
adapter = new SimpleCursorAdapter(this,
R.layout.row, null, proj, to, 0);
lv.setAdapter(adapter);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle
args) {
// load data ke cursor
// harus ada _id dengan huruf kecil!
String[] projection = { "_id", "nama" };
CursorLoader cursorLoader = new
CursorLoader(this,
MhsContentProvider.CONTENT_URI,
projection, null, null, null);
return cursorLoader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader,
Cursor cur) {
// dipanggil saat cursor sudah terisi, dilakukan
// dibackground sehingga user interface tetap
responsif
// isi adapter dengan cursor yang sudah terisi
adapter.swapCursor(cur);
}
@Override

99

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

public void onLoaderReset(Loader<Cursor> loader) {


// reset, kosongkan
adapter.swapCursor(null);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the
action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}

Latihan SQLite1:
Buat applikasi untuk menyimpan datamahasiswa (NIM, NAMA, ALAMAT).
Buatlah menu untuk menambahkan data dan mencari berdasarkan NIM (NIM
diinput oleh user).

Latihan SQLite2:
Modifikasi latihan activity-intent agar dapat menyimpan ke database.

100

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Pertemuan 10
File

[cek untuk Android versi >=3.0?]


File dapat disimpan baik di dalam device maupun di media penyimpanan (SD
card). Secara default, aplikasi tidak dapat mengakses file milik aplikasi lain. Bagi
anda yang telah mengenal stream dan file di Java, anda dapat membaca secara
cepat bagian ini, karena tidak ada perbedaan antara Java dan Android. Class yang
mensupport operasi file disediakan di package java.io.*

Stream
Pemrosesan file dalam jumlah besar, yang membutuhkan kinerja yang tinggi
masih dibutuhkan berbagai bidang. Misalnya aplikasi backend yang mengelola
dokumen di perusahaan, aplikasi pengolahan teks, aplikasi pemroses XML,
HTML, aplikasi simulasi-simulasi dan sebagainya. Penguasaan stream dan file
akan membantu anda untuk memecahkan berbagai masalah
Stream adalah aliran data. Bayangkan stream sebagai sungai yang mengalirkan
air. Seperti sungai, stream mengalirkan byte-byte data. Pemrosesan input dan
output di Java pada prinsipnya menggunakan konsep stream ini.

Gambar 1: Input Stream (diambil dari http://download.oracle.com/javase/tutorial)

Gambar 1: Output Stream (diambil dari http://download.oracle.com/javase/tutorial)

101

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Untuk membantu programmer, tersedia banyak class-class untuk memproses


stream, bahkan lebih dari 60 kelas! (lihat gambar 3 dan gambar 4). Tentu saja
tidak semua kelas tersebut harus digunakan, programmer bisa memilih kelas mana
yang dibutuhkan untuk menyelesaikan masalahnya.

Persiapan
Sebelum memulai, pastikan emulator sudah memiliki SD-Card

Lalu untuk setiap project yang akan mengakses ke SD Card, tambahkan ijin untuk
menulis ke media penyimpanan external di AndroidManifest.xml

102

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

File Teks
Sebelum mulai, pastikan virtual device telah diset SD-Card dan AndroidManifest
telah ditambahkan ijin untuk menulis (baca bagian persiapan)
File teks penting untuk menulis data, XML, HTML dan sebagainya. File teks
dianggap sebagai stream dari karakter. Untuk menulis ke file teks, cara yang
paling mudah adalah dengan menggunakan class PrintWriter. Berikut adalah
contoh program yang menulis dua baris ke file teks.

Pada MainActivity.java

103

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Sedangkan untuk membaca, dapat digunakan class Scanner yang dapat membaca
baris demi baris. Berikut contoh codenya, letakkan di bawah code atas.

Latihan: buat file teks berisi


<html>
<body> Halo </body>
</html>

104

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Objek Stream
Java telah menyediakan fasilitas agar objek dapat disimpan ke dalam stream
secara otomatis dengan mudah. Class yang digunakan adalah ObjectOutputStream
dan ObjectInputStream.
Setelah membuat project baru (pastikan AndroidManifest.xml-nya telah
ditambahkan ijin menulis ke external!) Sekarang coba kita buat class Mahasiswa
sebagai berikut.

Tambah class baru (Filenewclass). Perhatikan penggunaan interface


java.io.Serializable yang menandakan bahwa class ini dapat disimpan ke dalam
stream

105

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Codenya sebagai berikut. Perhatikan variabel serialVersionUID untuk


menyatakan versi class. Jangan lupa class Mahasiswa ini mengimplementas
interface Serializable.

Selanjutnya, buat program untuk menulis dua objek mahasiswa ke dalam class.
Penulisan objek ke stream
sangat mudah, hanya dengan class
ObjectOutputStream dan method writeObject. Buatlah code ini di activity
MainActivity.java.

106

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Catatan:
Perhatikan penggunaan code
ObjectOutputStream out =
new ObjectOutputStream (new FileOutputStream(namaFileOutput));

Pada code diatas Objek FileOuputStream dibungkus dengan ObjekOutputStream. Ini


yang disebut dengan stream layering, yaitu penggunaan kombinasi beberapa class
yang memproses stream. Contoh yang lain:
pbin = new PushbackInputStream(
new BufferedInputStream(new FileInputStream("pegawai.dat"))));

Walaupun pada awalnya teknik layering stream ini terlihat sulit, tapi teknik ini sangat
bermanfaat untuk mengkombinasikan berbagai fitur yang dibutuhkan.

Sekarang kita lanjutkan ke pembacaan objek yang telah dituliskan. Untuk


membaca file berisi objek
digunakan class FileInputStream dan
ObjectInputStream. Code ditulis di bawah code diatas;

107

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Latihan:
Buatlah class User dengan atribut username dan password. Simpan data objek
user (minimal 3 user) ke dalam Android menggunakan file teks dan file objek.

108

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Pertemuan 11
Membuat Aplikasi Client Server Project
Ada beberapa alasan diperlukan koneksi dengan server diantaranya:
1. Device memiliki beberapa keterbatasan (komputasi, space). Server dapat
digunakan untuk memproses data dan hasilnya saja yang akan digunakan di
device.
2. Sinkronisasi data. Pengguna dapat mengambil data terkini atau mengupload
data tambahan.

Sebelum memulai, pastikan emulator telah terhubung dengan internet, jalankan


browser dan coba buka salah satu website.

Jika tidak terhubung dengan internet, dapat digunakan server local seperti Apache
atau PhpMyAdmin.
PENTING: Tambahkan di AndroidManifest permission untuk koneksi
internet. Tanpa menambahkan ini, program anda tidak akan berjalan!

Letakkan permission ini di atas application (gambar bawah)

109

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

A. Membuat Database
1. Buat database dengan nama db_latihan
2. Buat table tbl_mahasiswa dengan attribute :
a) Nim varchar (10)
b) Nama varchar (45)
c) Jurusan varchar (45)
Jalankan perintah sql berikut ini untuk membuat table

CREATE TABLE IF NOT EXISTS `tbl_mahasiswa` (


`nim` varchar(11) NOT NULL,
`nama` varchar(45) NOT NULL,
`jurusan` varchar(45) NOT NULL,
PRIMARY KEY (`nim`)
)

Masukkan data dengan menjalankan perintah sql berikut ini


INSERT INTO `tbl_mahasiswa` (`nim`, `nama`, `jurusan`)
VALUES
('111150011', 'Pujianto, 'TI'),
('111150022', 'Achmatim, 'TI'),
('111250033', 'Wulandari', 'SI');

B. Membuat Server dengan PHP


Buat file dengan nama server.php simpan dalam folder latihan di
localhost (sesuaikan dengan setting document root pada httpd.conf)
sehingga
apabila
kita
ingin
mengakses
menggunakan
http://localhost/latihan/server.php.

110

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

server.php
<?php
$server =
$username
$password
$database

"localhost";
= "root";
= "";
= "db_latihan";

mysql_connect($server, $username, $password) or die("<h1>Koneksi Mysql


Error : </h1>" . mysql_error());
mysql_select_db($database) or die("<h1>Koneksi Kedatabase Error : </h1>"
. mysql_error());
@$operasi = $_GET['operasi'];
switch ($operasi) {
case "view":
/* Source code untuk Menampilkan Mahasiswa */
$query_tampil_mahasiswa = mysql_query("SELECT * FROM
tbl_mahasiswa ") or die(mysql_error());
$data_array = array();
while ($data = mysql_fetch_assoc($query_tampil_mahasiswa)) {
$data_array[] = $data;
}
echo json_encode($data_array);
//print json_encode($data_array);
break;
case "insert":
/* Source code untuk Insert data */
@$nim = $_GET['nama'];
@$nama = $_GET['nama'];
@$jurusan = $_GET['jurusan'];
$query_insert_data = mysql_query("INSERT INTO tbl_mahasiswa
(nim,nama,jurusan) VALUES('$nim', '$nama', '$alamat')");
if ($query_insert_data) {
echo "Data Berhasil Disimpan";
} else {
echo "Error Inser Mahasiswa " . mysql_error();
}
break;

111

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

case "get_mahasiswa_by_nim":
/* Source code untuk Edit data dan mengirim data berdasarkan id
yang diminta */
@$nim = $_GET['nim'];
$query_tampil_mahasiswa = mysql_query("SELECT * FROM tbl_mahasiswa
WHERE nim='$nim'") or die(mysql_error());
$data_array = array();
$data_array = mysql_fetch_assoc($query_tampil_mahasiswa);
echo "[" . json_encode($data_array) . "]";

break;
case "update":
/* Source code untuk Update Mahasiswa */
@$nama = $_GET['nama'];
@$jurusan = $_GET['jurusan'];
@$nim = $_GET['nim'];
$query_update_mahasiswa = mysql_query("UPDATE tbl_mahasiswa SET
nama='$nama', jurusan='$jurusan' WHERE nim='$nim'");
if ($query_update_mahasiswa) {
echo "Update Data Berhasil";
} else {
echo mysql_error();
}
break;
case "delete":
/* Source code untuk Delete Mahasiswa */
@$nim = $_GET['nim'];
$query_delete_mahasiswa = mysql_query("DELETE FROM tbl_mahasiswa
WHERE nim='$nim'");
if ($query_delete_mahasiswa) {
echo "Delete Data Berhasil";
} else {
echo mysql_error();
}
break;
default:
break;
}
?>

Sebelum di uji coba dengan aplikasi Android, dapat dilakukan dengan


pengujian pada browser dengan menggunakan url sebagai berikut:
View
url http://localhost/latihan/server.php?operasi=view
Output:
[{"nim":"111150011","nama":"Pujianto","jurusan":"TI"},{"nim":"111150022","nama"
Insert
:"Achmatim","jurusan":"TI"},{"nim":"111250033","nama":"Wulandari","jurusan":"SI
"}]

112

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

url
http://localhost/latihan/server.php?operasi=insert&nim=111250044&nama=ana
&jurusan=SI
Output:

Data Berhasil Disimpan


Get_mahasiswa_by_nim
http://localhost/latihan/server.php?operasi=get_mahasiswa_by_nim&nim=111150
011
Output

[{"nim":"111150011","nama":"Pujianto","jurusan":"TI"}]
Update
http://localhost/latihan/server.php?operasi=update&nama=Anto&juruan=sa&nim
=111150011
Output

Update Data Berhasil


Delete
http://localhost/latihan/server.php?operasi=delete&nim=111250044

Delete Data Berhasil


Hasil yang ditampilkan di browser akan di kirim ke Android untuk selanjutnya
diproses oleh android.
C. Membuat Aplikasi Client dengan Android
Untuk membuat project aplikasi client server android jalankan
eclipse.exe terlebih daluhu yang ada dalam folder eclipse dengan cara
double click.

Akan tampil screen seperti dibawah ini :

113

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Lalu akan tampil Workspace Launcher, pilih folder yang berfungsi sebagai
tempat project android.

Buat project baru dengan nama Latihan, lalu klik tombol Next:

Tampil seperti gambar dibawah ini, lalu Next:

114

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Tampil seperti gambar dibawah ini, lalu Next:

Lalu Finish.

Sehingga tampil project kita pada eclipse seperti pada gambar dibawah ini:

115

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

116

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Ubah pada activity_main.xml yang ada di layout sehingga mejadi seperti


dibawah ini:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<Button
android:id="@+id/buttonTambahMahasiswa"
android:layout_width="186dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Tambah Mahasiswa" />
<HorizontalScrollView
android:id="@+id/horizontalScrollView"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<ScrollView
android:id="@+id/verticalScrollView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<TableLayout
android:id="@+id/tableMahasiswa"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="80dp" >
</TableLayout>
</ScrollView>
</HorizontalScrollView>
</LinearLayout>
Pada layout saya membuat TableLayout berada pada
VerticalScrollView di dalamScrollView, ini berfungsi agar data yang

117

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

memiliki lebar lebih dari ukuran layar secara otomoatis terscroll sehingga
data semua bisa kelihatan.
Buat class Koneksi.java di package com.example.latihan
Path: src/com.example.latihan/Koneksi.java
package com.example.latihan;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
public class Koneksi {
public String call(String url) {
int BUFFER_SIZE = 2000;
InputStream in = null;
try {
in = OpenHttpConnection(url);
} catch (IOException e) {
e.printStackTrace();
return "";
}
InputStreamReader isr = new InputStreamReader(in);
int charRead;
String str = "";
char[] inputBuffer = new char[BUFFER_SIZE];
try {
while ((charRead = isr.read(inputBuffer)) > 0) {
String readString = String
.copyValueOf(inputBuffer, 0,
charRead);
str += readString;
inputBuffer = new char[BUFFER_SIZE];
}
in.close();
} catch (IOException e) {
// Handle Exception
e.printStackTrace();
return "";
}
return str;
}

118

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

private InputStream OpenHttpConnection(String url) throws


IOException {
InputStream in = null;
int response = -1;
URL url1 = new URL(url);
URLConnection conn = url1.openConnection();
if (!(conn instanceof HttpURLConnection))
throw new IOException("Not An Http Connection");
try {
HttpURLConnection httpconn = (HttpURLConnection)
conn;
httpconn.setAllowUserInteraction(false);
httpconn.setInstanceFollowRedirects(true);
httpconn.setRequestMethod("GET");
httpconn.connect();
response = httpconn.getResponseCode();
if (response == HttpURLConnection.HTTP_OK) {
in = httpconn.getInputStream();
}
} catch (Exception e) {
throw new IOException("Error connecting2");
}
return in;
}
}
Buat
Mahasiswa.java
turunan
Konekasi.java
com.example.latihan
Path : src/com.example.latihan/Mahasiswa.java

di

dalam

package com.example.latihan;
public class Mahasiswa extends Koneksi {
String URL = "http://10.0.2.2/latihan/server.php";
String url = "";
String response = "";
public String tampilMahasiswa() {
try {
url = URL + "?operasi=view";
System.out.println("URL Tampil Mahasiswa: " + url);
response = call(url);
} catch (Exception e) {
}
return response;
}

119

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

public String insertMahasiswa(String nim, String nama, String jurusan) {


try {
url = URL + "?operasi=insert&nim=" + nim + "&nama="
+ nama +"&jurusan"+jurusan;
System.out.println("URL Insert Mahasiswa : " + url);
response = call(url);
} catch (Exception e) {
}
return response;
}
public String getMahasiswaByNim(String nim) {
try {
url = URL + "?operasi=get_mahasiswa_by_nim&nim=" +
nim;
System.out.println("URL get Mahasiswa by nim : " + url);
response = call(url);
} catch (Exception e) {
}
return response;
}
public String updateMahasiswa(String nim, String nama, String jurusan)
{
try {
url = URL + "?operasi=update&nim=" + nim + "&nama="
+ nama+ "&jurusan=" + jurusan;
System.out.println("URL Update Mahasiswa");
response = call(url);
} catch (Exception e) {
}
return response;
}
public String deleteMahasiswa(String nim) {
try {
url = URL + "?operasi=delete&nim=" + nim;
System.out.println("URL Delete Mahasiswa : " + url);
response = call(url);
} catch (Exception e) {
}
return response;
}
}

120

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Edit MainActivity.java sehingga menjadi seperti dibawah ini:


package com.example.latihan;
import java.util.ArrayList;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.graphics.Color;
import android.support.v4.view.ViewPager.LayoutParams;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
Mahasiswa mahasiswa = new Mahasiswa();
TableLayout tabelMahasiswa;
Button buttonTambahMahasiswa;
ArrayList<Button> buttonEdit = new ArrayList<Button>();
ArrayList<Button> buttonDelete = new ArrayList<Button>();
JSONArray arrayMahasiswa;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tabelMahasiswa = (TableLayout) findViewById(R.id.tableMahasiswa);
buttonTambahMahasiswa = (Button) findViewById(R.id.buttonTambahMahasiswa);
buttonTambahMahasiswa.setOnClickListener(this);

121

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

TableRow barisTabel = new TableRow(this);


barisTabel.setBackgroundColor(Color.CYAN);
TextView viewHeaderNim = new TextView(this);
TextView viewHeaderNama = new TextView(this);
TextView viewHeaderJurusan = new TextView(this);
TextView viewHeaderAction = new TextView(this);
viewHeaderNim.setText("NIM");
viewHeaderNama.setText("Nama");
viewHeaderJurusan.setText("Jurusan");
viewHeaderAction.setText("Action");
viewHeaderNim.setPadding(5, 1, 5, 1);
viewHeaderNama.setPadding(5, 1, 5, 1);
viewHeaderJurusan.setPadding(5, 1, 5, 1);
viewHeaderAction.setPadding(5, 1, 5, 1);
barisTabel.addView(viewHeaderNim);
barisTabel.addView(viewHeaderNama);
barisTabel.addView(viewHeaderJurusan);
barisTabel.addView(viewHeaderAction);
tabelMahasiswa.addView(barisTabel, new TableLayout.LayoutParams(
android.view.ViewGroup.LayoutParams.WRAP_CONTENT,
android.view.ViewGroup.LayoutParams.WRAP_CONTENT));
try {
arrayMahasiswa = new JSONArray(mahasiswa.tampilMahasiswa());
for (int i = 0; i < arrayMahasiswa.length(); i++) {
JSONObject jsonChildNode = arrayMahasiswa.getJSONObject(i);
String nim = jsonChildNode.optString("nim");
String nama = jsonChildNode.optString("nama");
String jurusan = jsonChildNode.optString("jurusan");
System.out.println("Nama :" + nama);
System.out.println("Jurusan :" + jurusan);
System.out.println("NIM :" + nim);
barisTabel = new TableRow(this);
if (i % 2 == 0) {
barisTabel.setBackgroundColor(Color.LTGRAY);

122

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

TextView viewNim = new TextView(this);


viewNim.setText(nim);
viewNim.setPadding(5, 1, 5, 1);
barisTabel.addView(viewNim);
TextView viewNama = new TextView(this);
viewNama.setText(nama);
viewNama.setPadding(5, 1, 5, 1);
barisTabel.addView(viewNama);
TextView viewJurusan = new TextView(this);
viewJurusan.setText(jurusan);
viewJurusan.setPadding(5, 1, 5, 1);
barisTabel.addView(viewJurusan);
buttonEdit.add(i, new Button(this));
buttonEdit.get(i).setId(Integer.parseInt(nim));
buttonEdit.get(i).setTag("Edit");
buttonEdit.get(i).setText("Edit");
buttonEdit.get(i).setOnClickListener(this);
barisTabel.addView(buttonEdit.get(i));
buttonDelete.add(i, new Button(this));
buttonDelete.get(i).setId(Integer.parseInt(nim));
buttonDelete.get(i).setTag("Delete");
buttonDelete.get(i).setText("Delete");
buttonDelete.get(i).setOnClickListener(this);
barisTabel.addView(buttonDelete.get(i));
tabelMahasiswa.addView(barisTabel,
new
TableLayout.LayoutParams(android.view.ViewGroup.LayoutParams.MATCH_PARENT,
android.view.ViewGroup.LayoutParams.MATCH_PARENT));
}
} catch (JSONException e) {
// TODO: handle exception
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

123

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID
@Override
public void onClick(View view) {
// TODO Auto-generated method stub
if (view.getId() == R.id.buttonTambahMahasiswa) {
tambahMahasiswa();
} else {
/*
* Melakukan pengecekan pada data array, agar sesuai dengan index
* masing-masing button
*/
for (int i = 0; i < buttonEdit.size(); i++) {

/* jika yang diklik adalah button edit */


if (view.getId() == buttonEdit.get(i).getId()
&& view.getTag().toString().trim().equals("Edit")) {
String nim = String.valueOf(buttonEdit.get(i).getId());
getDataByNim(nim);
} /* jika yang diklik adalah button delete */
else if (view.getId() == buttonDelete.get(i).getId()
&& view.getTag().toString().trim().equals("Delete")) {
String nim = String.valueOf(buttonDelete.get(i).getId());
deleteMahasiswa(nim);
}
}
}
}
public void deleteMahasiswa(String nim) {
mahasiswa.deleteMahasiswa(nim);
/* restart acrtivity */
finish();
startActivity(getIntent());
}
public void getDataByNim(String nim) {
String namaEdit = null, jurusanEdit = null;
JSONArray arrayPersonal;
try {
arrayPersonal = new JSONArray(mahasiswa.getMahasiswaByNim(nim));

124

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

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


JSONObject jsonChildNode = arrayPersonal.getJSONObject(i);
namaEdit = jsonChildNode.optString("nama");
jurusanEdit = jsonChildNode.optString("jurusan");
}
} catch (JSONException e) {
e.printStackTrace();
}
LinearLayout layoutInput = new LinearLayout(this);
layoutInput.setOrientation(LinearLayout.VERTICAL);
// buat id tersembunyi di alertbuilder
final TextView viewNim = new TextView(this);
viewNim.setText(nim);
viewNim.setTextColor(Color.TRANSPARENT);
layoutInput.addView(viewNim);
final EditText editNama = new EditText(this);
editNama.setText(namaEdit);
layoutInput.addView(editNama);
final EditText editJurusan = new EditText(this);
editJurusan.setText(jurusanEdit);
layoutInput.addView(editJurusan);
AlertDialog.Builder builderEditMahasiswa = new AlertDialog.Builder(this);
// builderEditMahasiswa.setIcon(R.drawable.budiluhur);
builderEditMahasiswa.setTitle("Update Mahasiswa");
builderEditMahasiswa.setView(layoutInput);
builderEditMahasiswa.setPositiveButton("Update",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String nama = editNama.getText().toString();
String jurusan = editJurusan.getText().toString();
System.out.println("Nama : " + nama + " Jurusan : "
+ jurusan);
String laporan = mahasiswa.updateMahasiswa(viewNim
.getText().toString(), editNama.getText()
.toString(), editJurusan.getText().toString());

125

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Toast.makeText(MainActivity.this, laporan,
Toast.LENGTH_SHORT).show();
/* restart acrtivity */
finish();
startActivity(getIntent());
}
});
builderEditMahasiswa.setNegativeButton("Cancel",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builderEditMahasiswa.show();
}
public void tambahMahasiswa() {
/* layout akan ditampilkan pada AlertDialog */
LinearLayout layoutInput = new LinearLayout(this);
layoutInput.setOrientation(LinearLayout.VERTICAL);
final EditText editNim = new EditText(this);
editNim.setHint("NIM");
layoutInput.addView(editNim);
final EditText editNama = new EditText(this);
editNama.setHint("Nama");
layoutInput.addView(editNama);
final EditText editJurusan = new EditText(this);
editJurusan.setHint("Jurusan");
layoutInput.addView(editJurusan);
AlertDialog.Builder builderInsertMahasiswa = new AlertDialog.Builder(
this);
// builderInsertMahasiswa.setIcon(R.drawable.budiluhur);
builderInsertMahasiswa.setTitle("Insert Mahasiswa");
builderInsertMahasiswa.setView(layoutInput);
builderInsertMahasiswa.setPositiveButton("Insert",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String nim = editNim.getText().toString();

126

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

String nama = editNama.getText().toString();


String jurusan = editJurusan.getText().toString();
System.out.println("Nim : " + nim + " Nama : " + nama
+ " Jurusan : " + jurusan);
String laporan = mahasiswa.insertMahasiswa(nim, nama,
jurusan);
Toast.makeText(MainActivity.this, laporan,
Toast.LENGTH_SHORT).show();
/* restart acrtivity */
finish();
startActivity(getIntent());
}
});

builderInsertMahasiswa.setNegativeButton("Cancel",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builderInsertMahasiswa.show();
Sehingga dalam project ini terdapat 3 file dalam package
com.example.latihan

127

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Sebelum Menjalankan program android, karena kita menggunakan


jaringan untuk mengakses server, maka kita perlu setting permission pada
AndroidManifest.xml seperti pada gambar:

Terakhir adalah mejalan project Android Latihan dan hasilnya tampak serperti
pada gambar

128

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Pertemuan 12
Grafik 2D

Dalam contoh pertama kita akan menggunakan Canvas, Paint, Path dan
Color untuk menggambar kotak. Koordinat canvas 0,0 berada di kiri atas. Makin
ke kanan nilai x semakin besar dan makin kebawah nilai y semakin besar.
Setelah membuat project baru, buatlah class yang bernama GraphicView yang
merupakan turunan class View.

package com.example.latihanempatbelas;
import
import
import
import
import
import

android.content.Context;
android.graphics.Canvas;
android.graphics.Color;
android.graphics.Paint;
android.graphics.RectF;
android.view.View;

public class GraphicView extends View {


private RectF kotak = new RectF(100,100,200,200);
Paint cat= new Paint();
public GraphicView(Context context) {

129

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

super(context);
}
protected void onDraw(Canvas c) {
cat.setColor(Color.GREEN);
c.drawRect(kotak,cat);
}
}
Lalu di-activity utama, tambahkan kode berikut yang men-set contentview dengan
class GraphicView.
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new GraphicView(this));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the
action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
Hasilnya akan seperti ini

130

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Canvas, sesuai namanya adalah tempat untuk menggambar bentuk 2D. Dengan
canvas, kita dapat menggambar bentuk (lingkaran, kotak, garis, titik),
menggambar text dan melakukan operasi translate, scale, rotate.
Paint digunakan untuk menyimpan style, warna dan informasi lainnya yang
dibutuhkan untuk menggambar.
Class Color digunakan untuk merepresentasikan warna. Android menggunakan 4
angka untuk alpha, red, green dan blue (RGB) dengan masing-masing rentang
nilai 0 sd 255. Alpha digunakan menyatakan transparansi: alpha 0 artinya
transparan 100% .

Pada code diatas, kita menggunakan color constant

(Color.GREEN). Coba ganti baris tersebut menjadi, silahkan berkesperimen


dengan alpha yang lebih kecil.

Sekarang kita coba fungsi-fungsi lain pada canvas, tambahkan code berikut dalam
class Graphicsview
package com.example.latihanempatbelas;
import
import
import
import
import
import
import

android.content.Context;
android.graphics.Canvas;
android.graphics.Color;
android.graphics.Paint;
android.graphics.Paint.Style;
android.graphics.RectF;
android.view.View;

public class GraphicView extends View {


private RectF kotak
= new
//x1,y1,x2,y2
private RectF kotak2 = new
private RectF kotak3 = new
private RectF oval
= new
//oval akan mengikut rect ini
private RectF oval2
= new

RectF(100,150,200,200);
RectF(200,25,300,75);
RectF(300,300,400,400);
RectF(100,200,200,300);
RectF(100,300,200,400);

private Paint cat= new Paint();

public GraphicView(Context context) {


super(context);

131

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

}
protected void onDraw(Canvas c) {
//gambar kotak
cat.setColor(Color.argb(75, 255, 0, 0));
//alpha,red,green,blue
c.drawRect(kotak,cat);
//gambar lingkarang biru
cat.setColor(Color.BLUE);
c.drawCircle(50, 50, 30, cat);

//x,y,radius

//gambar kotak dengan ujung membulat


c.drawRoundRect(kotak2, 10, 10, cat);
//lokasikotak,x-radius oval, y radius oval
//gambar mulai dari posisi 45 derajat sebanyak 90
derajat searah jarum jam
//lengkungan akan mengikuti rect oval
//paramater ke 4 jika true garis penutup melewati
titik pusat
//memberikan efek spt pizza yang dipotong.
c.drawArc(oval, 45, 90, true,cat);
cat.setColor(Color.RED);
//jika parameter ke-4 false maka garis akan
melewati
//ujung ke ujung tanpa harus ke titik pusat
//menyebabkan efek spt lingkarang dipotong2
mendatar
c.drawArc(oval2, 45, 90, false,cat);
//gambar garis
c.drawLine(50,500,400,500,cat); //x1,y1,x2,y2
//gambar kotak kosong
cat.setColor(Color.GREEN);
cat.setStyle(Style.STROKE);
cat.setStrokeWidth(5);
c.drawRect(kotak3,cat);
//gambar titik
cat.setColor(Color.BLACK);
for (int i=0;i<10;i++) {

132

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

c.drawPoint( (float) Math.random()*500,


(float)Math.random()*500, cat);
}
}
}
Hasilnya akan seperti berikut:

Menulis Teks di Canvas


Method drawText dapat digunakan untuk menambahkan teks di canvas,
sedangkan Path dan drawTextOnPath dapat digunakan untuk menggambar teks
yang mengikuti jalur tertentu. Untuk jelasnya, tambahkan code dibawah pada
project sebelumnya. Akan ditampilkan tulisan berwarna merah dan tulisan italic
cat.setColor(Color.RED);
//diisi dalam maupun outline
cat.setStyle(Style.FILL_AND_STROKE);
cat.setStrokeWidth(2);
cat.setTextSize(35);
c.drawText("Hello World", 10, 500, cat);
//teks serif dan italic
cat.setTypeface(Typeface.create(Typeface.SERIF,Typeface.ITALIC));
c.drawText("ini serif italic", 10, 550, cat);

133

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Selanjutnya kita akan membuat lingkarang yang mengikuti suatu jalur


menggunakan class Path. Deklarasikan satu objek ini di luar onDraw:

Dianjurkan untuk membuat objek diluar method onDraw karena onDraw dapat
dipanggil berulang-ulang.

Selanjutnya tambahkan kode berikut, kode ini akan membuat dua tulisan dengan
path berbeda.
path1.moveTo(10,85);
path1.lineTo(250,150);
path1.lineTo(350,300);
cat.setTextSize(25);
//0,0 artinya tidak ada jarak antara tulisan dgn path (offset)
c.drawTextOnPath("tulisan ini mengikuti path", path1, 0, 0, cat);
// gambar tulisan melingkar
//kosongkan path
path1.reset();
//x,y,radius dan berlawan jarumjam (CCW)
path1.addCircle(250, 250, 50, Path.Direction.CCW);
c.drawTextOnPath("ini mengikuti lingkaran", path1, 0, 0, cat);

Hasilnya akan seperti ini:

134

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Penting: Perhatikan bahwa layar Android memiliki resolusi berbeda-beda.


Sebagai contoh, 100 point di layar dengan resolusi tinggi akan memiliki panjang
berbeda dengan layar resolusi rendah. Gunakan Canvas.getWidth() dan
Canvas.getHeight untuk menghitung panjang objek yang diinginkan. Misalnya
jika kita ingin membuat garis sepanjang setengah layar, gunakan ukuran
getWidth() / 2 sehingga pada resolusi apapun, garis akan selalu sepanjang
setengah layar.

Latihan:
Buatlah gambar rumah seperti ini, tambahkan warna dan modifikasi sesuai yang
anda inginkan

Event Touch
Selenjutnya kita akan membuat app yang akan menggambar kotak ditempat
pengguna menyentuh layar. Buat project baru dan tambahkan class baru turunan
dari class View, beri nama GraphicsView. Berikut adalah isi kelas tersebut yang
membersihkan layar dan kemudian menggambar kotak pada koordinat sentuhan
jari.

135

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

package com.example.latihanlimabelas;
import
import
import
import
import

android.content.Context;
android.graphics.Canvas;
android.graphics.Color;
android.graphics.Paint;
android.view.View;

public class GraphicsView extends View {


//posisi sentuh
public float posX=-1;
public float posY=-1;
private int offset=25;
private Paint cat = new Paint();
public GraphicsView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas c) {
//clear screen
cat.setColor(Color.BLACK);
c.drawRect(0,0,c.getWidth(),c.getHeight(),cat);
//gambar kotak diposisi yang disentuh
if (posX!=-1) {
cat.setColor(Color.YELLOW);
c.drawRect(posX-offset,posYoffset,posX+offset,posY+offset,cat);
}
}
}
Sedangkan code untuk MainActivity adalah sebagai berikut. MainActivity
mengimplements onTouchListener
package com.example.latihanlimabelas;
import
import
import
import

android.os.Bundle;
android.app.Activity;
android.view.Menu;
android.view.MotionEvent;

136

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

import android.view.View;
import android.view.View.OnTouchListener;
public class MainActivity extends Activity implements
OnTouchListener{
private GraphicsView gv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gv= new GraphicsView( this);
//set listener agar saat graphicview ditouch
//maka onTouch di kelas ini akan dipanggil
gv.setOnTouchListener(this);
setContentView(gv);
}

@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN: //jari menyentuh
layar
//passing posisi ke graphicsview
gv.posX = event.getX();
gv.posY = event.getY();
gv.invalidate(); //draw ulang
break;
case MotionEvent.ACTION_MOVE: //bergerak
break;
case MotionEvent.ACTION_UP: //diangkat
break;
case MotionEvent.ACTION_CANCEL: //batal
break;
default:
break;
}
return true;
}

137

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Latihan:
Buat app yang menampilkan gambar tank (atau tentara) secara random.
Pengguna harus mentouch lokasi tank tersebut, dan jika tepat maka tank akan
hilang.

Load Image di Canvas


Jika kita ingin meload image (jpg,png) ke dalam canvas, maka file gambar
tersebut perlu dimasukkan ke dalam /res/drawable (hdpi,xhdpi dst), baca kembali
pembahasan icon dalam Actionbar. Dalam contoh berikut digunakan gambar
ic_launcher yang sudah tersedia

Buat class baru bernama GraphicsView turunan dari View:


package com.example.latihanenambelas;
import
import
import
import
import

android.content.Context;
android.graphics.Bitmap;
android.graphics.Canvas;
android.graphics.Paint;
android.view.View;

public class GraphicsView extends View {


public Bitmap bmpGambar;
private Paint cat;

138

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

public GraphicsView(Context context) {


super(context);
}
protected void onDraw(Canvas c) {
c.drawBitmap(bmpGambar,50,50,cat);
}
}
Sedangkan code mainActivity adalah sebagai berikut:
package com.example.latihanenambelas;
import
import
import
import
import
import

android.os.Bundle;
android.app.Activity;
android.content.res.Resources;
android.graphics.Bitmap;
android.graphics.BitmapFactory;
android.view.Menu;

public class MainActivity extends Activity {


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GraphicsView gv = new GraphicsView(this);
//load bitmap
Resources res = getResources();
Bitmap bmp = BitmapFactory.decodeResource(res,
R.drawable.ic_launcher);
gv.bmpGambar = bmp;
setContentView(gv);
}
}

139

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Hasilnya akan muncul seperti ini

Animasi di Canvas
Animasi di canvas cocok digunakan untuk game sederhana seperti game berjenis
puzzle yang melibatkan sedikit objek dan tidak memperlukan animasi berat.
Canvas juga lebih sederhana dibandingkan dengan OpenGL
Animasi dapat dilakukan dengan membersihkan layar dan menggambar objek di
tempat yang baru. Class Asyntask dapat digunakan untuk mengatur posisi objek
dan jeda antar frame. Asyntask melakukan proses dibackground, sehingga app
tidak terkunci dan tetap responsif.
Berikut adalah contoh codenya. Buat project baru, tambahkan class GraphicsView
yang merupakan turunan View seperti pada contoh sebelumnya. Class ini akan
membersihkan layar dan menggambar image sesuai posisi

140

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

package com.example.latihantujuhbelas;
import
import
import
import
import
import

android.content.Context;
android.graphics.Bitmap;
android.graphics.Canvas;
android.graphics.Color;
android.graphics.Paint;
android.view.View;

public class GraphicsView extends View{


//posisi bola
public float posX=0;
public float posY=0;
public Bitmap bmpGambar;
private Paint cat = new Paint();
public GraphicsView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas c) {
//clear screen
c.drawColor(Color.WHITE);
//gambar bitmap
c.drawBitmap(bmpGambar,posX,posY,cat);
}
}
Selanjutnya buat class AnimasiTask yang merupakan turunan dari Asynctask.
Kelas ini berperan untuk mengatur posisi bola dan memerintahkan agar canvas
didraw ulang setiap posisi berubah.
package com.example.latihantujuhbelas;
import android.os.AsyncTask;
import android.util.Log;
public class AnimasiTask extends AsyncTask <Void, Void,
Void> {
public GraphicsView gv; //tempat animasi digambar
@Override
protected Void doInBackground(Void... arg0) {

141

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

// method ini dijalankan di background secara


asynchronous
for (int i=10;i<600;i=i+20) {
//bergerak diagonal
gv.posX=i;
gv.posY=i;
//publisgProgress adalah method standard di
Asyntask
//dipanggil pada saat loop untuk memberikan
kesempatan
//UI untuk mendraw
//contohnya untuk mendraw progressBar
//tapi dalam app ini digunakan untuk
mendraw image
//diposisi baru
publishProgress();
//tidur 0.2 detik, agar animasi tdk terlalu
cepat
try {
Thread.sleep((long)(1000*0.2));
} catch (InterruptedException e) {
e.printStackTrace();
Log.e("yw","error saat mencoba
sleep"+e.getMessage());
}
}
return null;
}
@Override
protected void onProgressUpdate(Void... progress) {
gv.postInvalidate(); //refresh canvas agar
menggambar image di posisi baru
}
}
Terakhir, di-activity utama tambahkan code berikut:
package com.example.latihantujuhbelas;
import
import
import
import

android.os.Bundle;
android.app.Activity;
android.content.res.Resources;
android.graphics.Bitmap;

142

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

import android.graphics.BitmapFactory;
import android.view.Menu;
public class MainActivity extends Activity {
private GraphicsView gv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gv = new GraphicsView(this);
Resources res = getResources();
Bitmap bmp = BitmapFactory.decodeResource(res,
R.drawable.ic_launcher);
gv.bmpGambar = bmp;
setContentView(gv);
AnimasiTask at = new AnimasiTask();
at.gv = gv;
at.execute(); // jalankan animasi secara async
dan dibackground
}
}
Latihan:
Buatlah game sederhana memukul serangga di layar. Program menampilkan
kotak di layar, jika pengguna memukulnya dengan jari, maka pengguna
mendapat skor. Tampilkan animasi jika kotak terkena pukulan (misal kotak
berubah warna).

143

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Pertemuan 13
Sensor

Android mendukung berbagai sensor, mulai dari yang umum tersedia


seperti accelerometer, magnetometer, GPS sampai barometer, termometer dan
pengukur kelembaban.

Accelerometer
Accelerometer adalah alat yang mengukur akselerasi atau percepatan (perubahan
kecepatan) baik yang disebabkan hal yang statik seperti gaya gravitasi (ingat
bahwa benda yang jatuh mengalami percepatan) maupun perubahan dinamik
seperti saat device bergerak atau bergetar.
Dengan mengukur gaya gravitasi, kita bisa mengetahui sudut kemiringan device.
Sedangkan dengan mengukur akselerasi dinamik kita bisa mengetahui ke arah
mana benda bergerak dan secepat apa.
Penggunaan accelerometer di smartphone/tablet yang paling umum adalah
mendeteksi posisi portrait dan landscape. Selain itu telah ada app yang
memanfaatkan accelerometer untuk menghitung kecepatan dan jarak lari,
membunyikan alarm jika device dipindahkan, game dan sebagainya.
Sebagian besar device Android memiliki sensor accelerometer ini. Sensor ini
mengukur perubahan kecepatan di tiga sumbu: x, y dan z (gambar bawah).
Satuannya adalah m/det^2. Gaya gravitasi selalu mempengaruhi. Sehingga jika
device diletakkan diam, nilai sumbu z tetap terbaca sekitar 9.8m/det^2.

Diambil dari: http://developer.android.com/reference/android/hardware/SensorEvent.html

Untuk menggunakan sensor di Android, class yang harus digunakan adalah


SensorManager untuk mengetahui apakah device mensupport sensor yang kita
inginkan. Kemudian class Sensor untuk mendapatkan data dari sensor dan
interface SensorEventListener yang diimplement oleh activity.

144

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Buat project baru, tambahkan kode berikut di MainActivity.

package com.example.latihandelapanbelas;
import
import
import
import
import
import
import
import
import

android.hardware.Sensor;
android.hardware.SensorEvent;
android.hardware.SensorEventListener;
android.hardware.SensorManager;
android.os.Bundle;
android.app.Activity;
android.content.Context;
android.view.Menu;
android.widget.TextView;

public class MainActivity extends Activity implements


SensorEventListener {
private SensorManager mSensorManager;
private Sensor mSensor;
private TextView tvHasil;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvHasil = (TextView)
findViewById(R.id.textView1);
mSensorManager = (SensorManager)
getSystemService(Context.SENSOR_SERVICE);

145

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

if
(mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
!= null){
//device memiliki accelerometer,lanjutkan
mSensor =
mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(this,
mSensor,
SensorManager.SENSOR_DELAY_NORMAL);
}
else {
//tidak punya sensor accelerometer, tampilkan
pesan error
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int
accuracy) {
// kalau akurasi berubah
}
@Override
public void onSensorChanged(SensorEvent event) {
double ax=0,ay=0,az=0;
// menangkap perubahan nilai sensor
//if
(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){
if
(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER) {
ax=event.values[0];
ay=event.values[1];
az=event.values[2];
}
//ax,ay,az bisa digunakan
tvHasil.setText("x:"+ax+" y:"+ay+" z:"+az);
}
@Override
protected void onPause() {
//app kehilangan fokus (misal user menerima
telp), lepaskan sensor
super.onPause();

146

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

mSensorManager.unregisterListener(this);
}
@Override
protected void onResume() {
//app kembali
super.onResume();
mSensorManager.registerListener(this, mSensor,
SensorManager.SENSOR_DELAY_NORMAL);
//SENSOR_DELAY_NORMAL:sampling setiap 200,000
microseconds
//SENSOR_DELAY_GAME: 20,000 microsecond
//SENSOR_DELAY_UI: 60,000 microsecond
//SENSOR_DELAY_FASTEST: 0 microsecond
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the
action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
Masalahnya adalah AVD tidak mensupport accelerometer sehingga saat app harus
dijalankan pada device langsung. Caranya bisa dengan langsung menghubungkan
atau manual melalui APK.

Agar langsung dapat menjalankan app pada device, hubungan handphone/tablet


dengan komputer melalui kabel USB. Pastikan USB driver telah terinstall. Untuk
jenis Nexus, usb driver dapat diinstall melalui SDK manager (Extra Google
USB Driver).
Kemudian klik kanan project Run As Run Configuration

Pilih tab target, lalu pilih launch on all dengan Active Devices

147

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Kemudian pada device, jalankan USB Debugging dengan pilihan Setting


Developer Options USB Debugging.

Catatan: Jika menu Developer Option tidak muncul pada Android versi 4.2.*,
maka untuk mengaktifkannya pilih settings About Phone, lalu tap Build
Number sebanyak tujuh kali.

Orientasi: Yaw (Azimuth), Pitch & Roll


Dengan mengkombinasikan sensor accelerometer dan magnetometer maka dapat
diperoleh pitch, roll dan yaw. Khusus untuk yaw, posisi yang didapat sesuai
dengan medan magnet bumi sehingga dapat digunakan sebagai kompas. Ini
sebabnya posisi yaw sering disebut disebut azimuth.
Gambar berikut memperlihatkan dengan jelas apa yang disebut yaw, pitch dan
roll.

148

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Ketiga informasi ini (azimuth, roll, pitch) dapat dimanfaaatkan untuk banyak hal.
Azimuth dapat digunakan untuk kompas dan dikombinasikan dengan GPS
bermanfaat untuk augmented reality. Dengan GPS kita bisa mengetahui posisi
device, tapi kita tidak mengetahui ke arah mana device menghadap. Tetapi jika
GPS dikombinasikan dengan informasi azimuth dan pitch maka dapat diketahui
ke arah mana device menghadap. Roll dan pitch juga dapat digunakan untuk
mengontrol game.

Contoh Augmented Reality


(diambil dari: nilsmengedoht http://www.flickr.com/photos/nilsmengedoht/5109833017/)

Berikut adalah contoh kode untuk mendapatkan tiga orientasi tersebut, penjelasan
ada di dalam kode. Pertama, tambahkan tiga Large textview pada layout, beri
nama tvAzimuth, tvPitch dan tvRoll.

149

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

package com.example.latihansembilanbelas;
import
import
import
import
import
import
import
import

android.hardware.Sensor;
android.hardware.SensorEvent;
android.hardware.SensorEventListener;
android.hardware.SensorManager;
android.os.Bundle;
android.app.Activity;
android.content.Context;
android.widget.TextView;

public class MainActivity extends Activity implements


SensorEventListener {
private
private
private
private

SensorManager mSensorManager;
Sensor accel;
Sensor magneto;
TextView tvAzimuth, tvPitch, tvRoll;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSensorManager = (SensorManager)
getSystemService(Context.SENSOR_SERVICE);
if
(mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
!= null) {
// device memiliki accelerometer,lanjutkan
accel =
mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
magneto = mSensorManager
.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
// register listener
mSensorManager.registerListener(this,
accel,

150

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

SensorManager.SENSOR_DELAY_NORMAL);
mSensorManager.registerListener(this,
magneto,
SensorManager.SENSOR_DELAY_NORMAL);
tvAzimuth = (TextView)
findViewById(R.id.tvAzimuth);
tvPitch = (TextView)
findViewById(R.id.tvPitch);
tvRoll = (TextView)
findViewById(R.id.tvRoll);
} else {
// tidak punya sensor , tampilkan pesan
error
}
}
float[] mGravity;
float[] mGeomagnetic;
float azimuth;
float pitch;
float roll;
public void onSensorChanged(SensorEvent event) {
// menggunakan clone, agar persis sama
if (event.sensor.getType() ==
Sensor.TYPE_ACCELEROMETER)
mGravity = event.values.clone();
;
if (event.sensor.getType() ==
Sensor.TYPE_MAGNETIC_FIELD)
mGeomagnetic = event.values.clone();
;
if (mGravity != null && mGeomagnetic != null) {
float R[] = new float[9];
float I[] = new float[9];
// ambil rotationmatrix
boolean success =
SensorManager.getRotationMatrix(R, I, mGravity,
mGeomagnetic);
if (success) {
float orientation[] = new float[3];
SensorManager.getOrientation(R,
orientation);

151

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

// orientation akan terisi: azimut,


pitch and roll
// orieantation[0]:azimuth;
orieantation[1]:pitch
// orieantation[2]:roll
// azimuth adalah arah utara-selatantimur-barat
// dengan Math.toDegreee hasilnya -180
sd 180
azimuth = (float)
Math.toDegrees((double) orientation[0]);
// dikonversi jadi 0 sd 360
// 0=Utara, 90=Timur, 180=Selatan,
270=Barat
azimuth = (azimuth + 360) % 360;
// print dua angka belakang koma, agar
mudah dibaca
tvAzimuth.setText("Azimuth=" +
String.format("%6.2f", azimuth));
// pitch adalah rotasi kedepan &
belakang
// bayangkan pesawat yg sedang
dogfight dikejar musuh
// kemudian naik berputar sehingga
berada di belakang musuhnya
pitch = (float)
Math.toDegrees((double) orientation[1]);
pitch = (pitch + 360) % 360;
tvPitch.setText("Pitch=" +
String.format("%6.2f", pitch));
// roll adalah rotasi ke kiri dan
kekanan
// bayangkan pesawat yg sedang
berbelok kekiri dan ke kanan
roll = (float) Math.toDegrees((double)
orientation[2]);
roll = (roll + 360) % 360;
tvRoll.setText("roll=" +
String.format("%6.2f", roll));
}
}
}

152

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

@Override
protected void onPause() {
// app kehilangan fokus (misal user menerima
telp),
// lepaskan listener sensor
super.onPause();
mSensorManager.unregisterListener(this);
}
@Override
protected void onResume() {
// app kembali, daftarkan lagi listener
super.onResume();
mSensorManager.registerListener(this, accel,
SensorManager.SENSOR_DELAY_NORMAL);
mSensorManager.registerListener(this, magneto,
SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
// TODO Auto-generated method stub
}
}
Jalankan di device dan coba lakukan gerakan pitch, roll dan yaw dan perhatikan
angka yang didapat.
Catatan:

Penjelasan

rinci

tentang

rotationmatrix

dapat

diperoleh

di:

http://gentlenav.googlecode.com/files/DCMDraft2.pdf

Location API
Dengan GPS (Global Positioning Service), suatu device dapat diketahui posisi
geolokasinya. GPS menggunakan 24 satelit yang memancarkan sinyal secara
bersamaan. Sinyal berisi waktu kirim dan posisi satelit. Device akan menerima
sinyal satelit itu secara pasif (device tidak memancarkan sinyal, hanya menerima).
Berdasarkan kecepatan sinyal sampai ke device maka dapat ditentukan jarak
antara device dengan satelit. Minimal diperlukan 4 satelit berbeda untuk
menentukan lokasi. Selain GPS, Rusia mengembangkan sistem serupa yang
disebut GLONASS dan Eropa mengembangkan Galileo.

153

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Hampir semua device Android mendukung GPS dan sebagian mendukung


kombinasi GPS + GLONASS. Selain itu Android mendukung penentuan lokasi
berbasis network yang memanfaatkan cell tower dan wifi. GPS lebih akurat
dibandingkan network location provider, tetapi membutuhkan waktu lebih lama,
akses ke langit dan lebih boros batere.
Android menyediakan location API yang mengatur provider lokasi (GPS, network
atau pasif).
Kita akan mencoba membuat aplikasi sederhana yang memanfaatkan lokasi.
Untuk lebih memahami proses pengambilan lokasi, jalankan app langsung pada
device (lihat subbab accelerometer untuk caranya).
Buat project baru. Edit AndroidManifest.xml karena app membutuhkan ijin dari
user untuk mengakses lokasi. Gunakan ACCESS_COARSE_LOCATION untuk
lokasi berdasarkan network dan ACCESS_FINE_LOCATION untuk lokasi
berdasarkan GPS. Jika kita menggunakan FINE_LOCATION maka tidak perlu
lagi meminta COARSE_LOCATION karena otomatis akan masuk.

154

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Jangan lupa di save (Ctrl+S), maka akan terlihat pada AndroidManifest.xml

Untuk mengambil lokasi, kita akan activity yang meng-implement


LocationListener dan kemudian dipassing ke LocationManager.

Pertama tambahkan tiga textview dalam activity_main.xml. Ganti id dengan


tvStatus, tvLat dan tvLng.

Berikut adalah code untuk class MainActivity, perhatikan comment yang ada.
Jalankan langsung di-device.
package com.example.latihanduapuluh;

155

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

import
import
import
import
import
import
import
import
import
import

android.location.Criteria;
android.location.Location;
android.location.LocationListener;
android.location.LocationManager;
android.os.Bundle;
android.app.Activity;
android.content.Context;
android.text.format.Time;
android.view.Menu;
android.widget.TextView;

public class MainActivity extends Activity implements


LocationListener {

TextView tvLat;
TextView tvLng;
TextView tvStatus;
double lat;
double lng;
long minTime;
float minDistance;
String locProvider;
LocationManager locMgr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvStatus = (TextView) findViewById(R.id.tvStatus);
tvLat = (TextView) findViewById(R.id.tvLat);
tvLng = (TextView) findViewById(R.id.tvLng);
// ambil location manager
locMgr = (LocationManager)
this.getSystemService(Context.LOCATION_SERVICE);

//ambil lokasi terakhir berdasarkan network agar


cepat
//user dapat kesal jika diawal menunggu terlalu
lama app mendapatkan lokasi
tvStatus.setText("ambil lokasi terakhir
berdasarkan network");
locProvider = LocationManager.NETWORK_PROVIDER;

156

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Location lastKnownLocation =
locMgr.getLastKnownLocation(locProvider);
lat = lastKnownLocation.getLatitude();
lng = lastKnownLocation.getLongitude();
tvLat.setText(String.valueOf(lat));
tvLng.setText(String.valueOf(lng));
//sambil user melakukan aktivitas2 (misalnya)
//maka ambil lokasi yang lebih akurat dan terus
mendengarkan
//perubahan lokasi device
//selanjutnya plih provider yang tinggi akurasinya
//dengan mengeset Criteria, tapi ingat semakin
tinggi
//akurasi maka semakin boros menggunakan batere
Criteria cr = new Criteria();
cr.setAccuracy(Criteria.ACCURACY_FINE);
//contoh penggunaan criteria yang lain:
//akurasi relatif rendah, tapi paling hemat batere
//cr.setAccuracy(Criteria.ACCURACY_COARSE);
//cr.setPowerRequirement(Criteria.POWER_LOW);

//berdasarkan kriteria, sistem akan memberikan


//provider yang paling tepat
locProvider = locMgr.getBestProvider(cr, false);

//1 menit: waktu refresh lokasi dalam milidetik


(1*60*1000)
//pilih selama mungkin untuk menghemat batere tapi
//user masih bisa menerima
//long minTime = 1 * 60 * 1000;
minTime = 5 * 1000; //lima detik

//posisi pergeseran dalam meter


//lokasi akan diupdate jika telah melewati batas
distance
minDistance = 1;

157

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

//onResume akan dipanggil dan mulai mendengarkan


pergantian lokasi
}
@Override
protected void onResume() {
//mulai mendengarkan dari awal dan juga saat
dibangunkan dari pause
super.onResume();
locMgr.requestLocationUpdates(locProvider,
minTime, minDistance, this);
}
@Override
protected void onPause() {
//lepaskan listener, agar tidak memakan resources
saat dipause
super.onPause();
locMgr.removeUpdates(this);
}
@Override
public void onLocationChanged(Location loc) {
//dipanggil saat lokasi berubah atau waktu
refersh
lat = loc.getLatitude();
lng = loc.getLongitude();
tvLat.setText(String.valueOf(lat));
tvLng.setText(String.valueOf(lng));
Time now = new Time();
now.setToNow();
tvStatus.setText("Direfresh berdasarkan:
"+locProvider
+" Waktu:
"+now.hour+":"+now.minute+":"+now.second);
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onProviderEnabled(String provider) {

158

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

}
@Override
public void onStatusChanged(String provider, int
status, Bundle extras) {
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the
action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
Jika dijalankan maka pada saat awal lokasi akan diisi dengan cepat berdasarkan
data terakhir (network). Perhatikan icon GPS di kiri atas yang menyatakan GPS
diaktifkan.

Setelah beberapa saat (bawa device ke dekat jendela atau ruang terbuka). Maka
akan muncul lokasi berdasarkan GPS yang diupdate setiap 5 detik. Jika anda
berada di dalam ruangan tertutup, maka layar dibawah tidak akan pernah muncul
karena lokasi GPS tidak pernah didapatkan:

TBD: caching lokasi


(http://developer.android.com/guide/topics/location/strategies.html).
Tip: Untuk mendapatkan lokasi berdasarkan GSM, pastikan uncheck Settings ->
Applications -> Development -> Allow mock locations
Latihan:
Buatlah app yang menyimpan data lokasi latitude, longitude, dan data
accelerometer (x,y,z) untuk suatu perjalanan dengan kendaraan (motor/mobil).
Simpan data tersebut beserta waktu pengambilan data ke dalam database.
159

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Pertemuan 14
Google Map

Google Map adalah fitur yang disediakan oleh Google, dan bukan standard
Android.
Catatan:
Google Maps Android v1 API - Perpustakaan Eksternal

Catatan: Versi 1 dari Maps API Android Google telah resmi ditinggalkan pada 3
Desember 2012. Ini berarti bahwa dari 18 Maret 2013 Anda akan tidak lagi dapat
meminta API key untuk versi ini. Tidak ada fitur baru akan ditambahkan ke
Google Maps Android API v1. Namun, aplikasi menggunakan v1 akan terus
bekerja pada perangkat. Pengembang yang ada dan baru dianjurkan untuk
menggunakan Google Maps API v2 Android.
Diperlukan key yang didapat dari Google untuk menggunakan fasilitas ini.
Baca terlebih dulu https://developers.google.com/maps/documentation/android/
Sekilas
Membuat aplikasi Android baru yang menggunakan Google Maps API v2
Android memerlukan beberapa langkah. Banyak langkah-langkah yang diuraikan
dalam bagian ini hanya perlu dilakukan sekali, tetapi beberapa informasi akan
menjadi referensi yang berguna untuk aplikasi masa depan. Keseluruhan proses
penambahan peta ke aplikasi Android adalah sebagai berikut:
1. Menginstal SDK Android.
2. Download dan mengkonfigurasi Google Play layanan SDK, yang meliputi
Maps API Google Android. Jika Anda menggunakan Google Maps Mobile
SDK untuk Bisnis Anda harus men-download dan mengkonfigurasi Google
Maps Mobile SDK untuk Bisnis perpustakaan statis.
3. Mendapatkan kunci API. Untuk melakukan ini, Anda akan perlu untuk
mendaftarkan proyek di Google API Console, dan mendapatkan sertifikat
penandatanganan untuk aplikasi Anda.
4. Tambahkan pengaturan yang diperlukan dalam aplikasi nyata Anda.
5. Menambahkan peta ke aplikasi Anda.
6. Publikasikan aplikasi Anda.

160

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Menginstal SDK Android

Sebagai prasyarat, Anda perlu menginstal SDK Android. Lihat Dapatkan SDK
Android di http://developer.android.com/sdk/index.html. Kita telah menginstall
sdk bundle windows saat pertama kali.

Menginstal dan mengkonfigurasi Google Play Service SDK


Google Maps API v2 Android didistribusikan sebagai bagian dari Google Play
Services SDK. Anda dapat men-download Google Play layanan SDK melalui
SDK Android manajer.

Untuk petunjuk rinci, lihat dokumentasi Google Play Service. Berikut ini adalah
ringkasan dari langkah yang perlu mengambil:

1. Instal Google Play Services SDK.


2. Menambahkan Google Play Services sebagai proyek library Android.
3. Referensi layanan Google Play dalam proyek aplikasi Anda.
Untuk menginstall Google Play Service terlebih daluhu buka Android SDK
Manager

161

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Pastikan pada Extras->Google Play Services di checklist lalu


Install

Install Google APIs platform

162

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Jika kita ingin mencoba app kita pada emulator, maka pilih Android 4.4 (API 19)
lalu pilih Google APIs dan install. Kemudian buat AVD dengan Google APIs
sebagi platform target
Copy project Google Play Service library
Copy

project

library

yang

ada

pada

<android-

sdk>/extras/google/google_play_services/libproject/google-playservices_lib/ ke tempat di mana project workspace kita berada. Jika kita

menggunakan Eclipse, import

library project kedalam workspace. Click File >

Import, pilih Android > Existing Android Code into Workspace, dan browse
<androidsdk>/extras/google/google_play_services/libproject/google-playservices_lib/ check list copy project into workspace kemudian Finish.

Tambahkan versi Google Play Services untuk mewujudkan aplikasi Anda


Edit file AndroidManifest.xml aplikasi Anda, seperti terlihat pada gambar
dibawah ini

163

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Mendapatkan sertifikat Android dan Google Maps API key


Catatan: Google Maps Android API v2 menggunakan sistem baru dalam
mengelola key. Key yang ada dari Maps Android v1 aplikasi Google, umumnya
dikenal sebagai MapView, tidak akan bekerja dengan API v2.

Untuk mengakses server Google Maps dengan Maps API, Anda harus
menambahkan kunci API Maps untuk aplikasi Anda. Kuncinya adalah gratis,
Anda dapat menggunakannya dengan aplikasi Anda yang memanggil Maps API,
dan mendukung jumlah yang tidak terbatas penggunanya. Anda memperoleh
kunci API Maps dari Google API Console dengan menyediakan menandatangani
sertifikat aplikasi Anda dan nama paket tersebut. Tambahkan kunci untuk aplikasi
Anda dengan menambahkan elemen ke file AndroidManifest.xml aplikasi Anda.
Cara menampilkan sertifikat fingerprint debug
1. Cari lokasi debug.keysoter caranya

2. Menampilkan List the SHA-1 fingerprint.


Windows Vista and Windows 7/8, run:
keytool -list -v -keystore "%USERPROFILE%\.android\debug.keystore" -alias androiddebugkey storepass android -keypass android

Contoh :

164

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

3. Output yang di hasilkan

Atau untuk menampilkan SHA1 fingerprint dapat dilihat pada eclipse Window>Preferences->Android->Build

Membua sebuah API project pada Google APIs Console


Untuk membuat project API pada Google APIs Console ikutliah

pada

https://code.google.com/apis/console/?noredirect#project:185545471159

165

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Dibawah ini adalah hasil yang didapat kan setelah mendaftarkan SHA1 fingerprint
pada Google APIs Console ditambah nama package project android

Mendapatkan sebuah Google Maps API key


Jika aplikasi Anda terdaftar dengan layanan Google Maps API v2 Android, maka Anda
dapat meminta API key. Ini mungkin untuk mendaftarkan lebih dari satu kunci per proyek.
1.

Arahkan ke proyek Anda dalam Google APIs Console.

2.

Di bar navigasi sebelah kiri, klik API Access.

3.

Pada halaman yang dihasilkan, click Create New Android Key....

4.

Dalam dialog, masukkan SHA-1 fingerprint, Kemudian titik koma, kemudian nama paket
aplikasi Anda. Sebagai contoh:
10:4A:9D:8D:15:DA:35:24:73:B0:9F:77:65:89:47:36:06:53:F6:DE;com.puji.mpas

5.

Google API Console merespon dengan menampilkan Kunci untuk aplikasi Android (dengan
sertifikat) diikuti oleh API key empat puluh karakter, misalnya:
AIzaSyBdVl-cTICSwYKrZ95SuvNw7dbMuDt1KG0

Setelah ini mari kita buat project android

166

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Rubah file [project]->AndroidManifest.xml menjadi seperti dibawah ini :


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.puji.peta"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="13"
android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission
android:name="com.google.android.providers.gsf.permission.READ_GSERVICE
S" />
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.puji.peta.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="AIzaSyD_FLMIDsQCuaokhXkLfn30YPIXs4kEWv0" />
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
</application>
</manifest>

167

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Kemudian ganti isi file yang ada di res->layout->activity_main.xml


<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.google.android.gms.maps.MapFragment"/>
Setelah itu tambahkan program pada yang ada di src->com.puji.peta>MainActivity.java
package com.puji.peta;
import android.os.Bundle;
import android.app.Activity;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
Jalankan Program. Semoga Sukses

168

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Pertemuan 15
Sms Gateway
Pada kali ini kita akan Membuat Aplikasi Android SMS, siapa saja yang
mempunyai handphone baik itu smartphone ataupun handphone biasa pasti
mengetahui dan pernah menggunakan SMS. Sms digunakan untuk mengirm pesan
singkat dari suatu handphone ke handphone yang lain.
Sama halnya dengan dial, SMS juga merupakan fungsi utama dari smartphone
android, pada aplikasi ini kita akan belajar bagaimana sebenarnya cara membuat
aplikasi SMS yang selalu kita gunakan setiap menggunakan smartphone android.
Aplikasi SMS ini kita akan buat sehingga bisa mengirim pesan dari satu emulator
device android ke emulator yang lain.
Buat Project Baru

Buat Layout pada res->layout->activity_main.xml seperti terlihat pada gambar di


bawah ini

169

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<EditText
android:id="@+id/editTextNo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="NO HP" >
<requestFocus />
</EditText>
<EditText
android:id="@+id/editTextPesan"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="PESAN" />
<Button
android:id="@+id/buttonKirim"
android:layout_width="286dp"
android:layout_height="wrap_content"
android:text="KIRIM" />
</LinearLayout>
Kemudian rubah file src->com.example.latihanduapuluhsatu->MainActivity.java
package com.example.kirimsms;
import android.os.Bundle;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;

170

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

import android.content.Intent;
import android.content.IntentFilter;
import android.telephony.SmsManager;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
Button buttonKirim;
EditText editTextNo, editTextPesan;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editTextNo = (EditText) this.findViewById(R.id.editTextNo);
editTextPesan = (EditText)
this.findViewById(R.id.editTextPesan);
buttonKirim = (Button) this.findViewById(R.id.buttonKirim);
buttonKirim.setOnClickListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private void kirimSMS(String nomor, String pesan) {
String SENT = "SMS_SENT";
String DELIVERED = "SMS_DELIVERED";
PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new
Intent(
SENT), 0);
PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
new Intent(DELIVERED), 0);
// action ketika sms dikirim
registerReceiver(new BroadcastReceiver() {

171

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "DATA
Berhasil dikirim",
Toast.LENGTH_SHORT).show();
break;
case
SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(getBaseContext(), "DATA
gagal dikirim",
Toast.LENGTH_SHORT).show();
break;
case
SmsManager.RESULT_ERROR_NO_SERVICE:
Toast.makeText(getBaseContext(), "DATA
gagal dikirim",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(getBaseContext(), "DATA
gagal dikirim",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast.makeText(getBaseContext(), "DATA
gagal dikirim",
Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(SENT));

172

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

// action ketika sms berhasil dikirim


registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS
Berhasil dikirim",
Toast.LENGTH_SHORT).show();
break;
case Activity.RESULT_CANCELED:
Toast.makeText(getBaseContext(), "SMS
gagal dikirim",
Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(DELIVERED));
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(nomor, null, pesan, sentPI, deliveredPI);
}
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
if (arg0 == buttonKirim) {
Toast.makeText(getBaseContext(), "SMS dikirim",
Toast.LENGTH_SHORT)
.show();
kirimSMS(editTextNo.getText().toString(),
editTextPesan.getText()
.toString());
}
}
}

173

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Sekarang kita akan membuat sebuah kelas yang berfungsi untuk membaca sms
yang baru masuk, kemudian sms tersebut kita tampilkan dalam layar melalui
Toast. Buatlah Class padd src->com.example.latihanduapuluhsatu.PenerimaSMS
Turunan dari Class BroadcastReceiver
package com.example.latihanduapuluhsatu;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.gsm.SmsMessage;
import android.widget.Toast;
public class PenerimaSMS extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null;
String str = "";
if (bundle != null)
{
Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
for (int i = 0; i < msgs.length; i++) {
msgs[i] = SmsMessage.createFromPdu((byte[])
pdus[i]);
str += "SMS dari " +
msgs[i].getOriginatingAddress();
str += " :";
str += msgs[i].getMessageBody().toString();
str += "\n";

174

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

}
Toast.makeText(context, str,
Toast.LENGTH_SHORT).show();
}
}
}
Setting AndroidManifest.xml menjadi seperti dibawah ini
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.latihanduapuluhsatu"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.latihanduapuluhsatu.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="PenerimaSMS">
<intent-filter>
<action
android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
</application>
</manifest>

175

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

Jalankan program, lalu test kirim SMS ke no hp teman anda. Coba kirim sms kehp
android yang telah kita pasang program ini, lihat apakah ada popup Toast di layar
yang berisi sms.
LATIHAN
Buatlah program sms gateway menggunakan android. Apabila ada SMS Masuk
dengan format
JENENG<spasi>nama
auto replay Nama anda adalah <nama>
Jika yang di ketik tidak sesuai format maka auto replay nya Maaf Format Anda
Salah

176

PUJIANTO, S.KOM
11/13/13
PEMROGRAMAN ANDROID

DAFTAR PUSTAKA
Wibisono, Yudi., 2013, Pengantar Mobile Programming dan Android, [online],
(http://yuliadi.com/ilkom/, diakses tanggal 13 November 2013 )

177

You might also like