Lokasi (Bagian 2B: Google Location API: Mengambil secara rutin & penanganan Error)

Update Oktober 2015: Jangan gunakan tutorial ini, sebaiknya gunakan versi tutorial yang lebih baru versi yang lebih baru

Lanjutan dari bagian 2A

Mengambil Lokasi Secara Rutin
Selanjutnya kita akan membuat project yang menangkap lokasi secara reguler. Buat project baru, tambahkan tiga label sebagai berikut, dengan id tvStatus, tvLat dan tvLang.

loc_2_8

Untuk mengambil koordinat secara rutin, diperlukan tiga parameter:

  1. Update interval, menyatakan selang interval yang diinginkan, satuannya milidetik. Jika diset 5000 (5 detik), maka app akan diberi update lokasi device setiap 5 detik sekali. Tapi jika ada beberapa app yang menggunakan google location service, maka interval sesungguhnya dapat lebih pendek lagi, karena untuk efisiensi, jika app lain mendapat update lokasi, app kita akan mendapatkannya juga. Ini dapat membuat app terlalu banyak mendapatkan update (overflow).
  2. Untuk mencegah terjadinya overflow, dapat diset fastest interval untuk menyatakan interval tercepat yang dimungkinkan. Misalnya jika diset 1000 (1 detik), maka paling cepat app akan diupdate setiap 1 detik.
  3. Prioritas. Terdapat beberapa pilihan. Mulai dari yang prioritas paling tinggi yang paling banyak menghabiskan energi yaitu PRIORITY_HIGH_ACCURACY sampai dengan PRIORITY_NO_POWER yang paling hemat energi. Untuk PRIORITY_NO_POWER, app tidak akan mendapatkan lokasi kecuali jika ada app lain yang meminta lokasi.

Parameter tersebut kemudian dimasukkan pada objek LocationRequest yang kemudian dipassing ke method LocationClient.requestLocationUpdates. Setelah method tersebut dipanggil, maka setiap kali update maka method onLocationChanged akan dipanggil (callback).

Selain harus mengimplementasikan ConnectionCallbacks, OnConnectionFailedListener, Activity juga harus mengimplementasikan LocationListener (tapi dari com.google.android.gms.location bukan android.location). Berikut kode lengkapnya:

package edu.upi.cs.yudiwbs.cobagooglelocation;

import android.location.Location;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.text.format.Time;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesClient;
import com.google.android.gms.location.LocationClient;
import com.google.android.gms.location.LocationRequest;


//implements ConnectionCallBacks dan OnConnectionFailedListener
//tambah LocationListener
//LocationListener sengaja dituliskan lengkap karena 
//bisa tertukar dengan android.location.LocationListener

public class CobaGoogleLocation extends FragmentActivity implements   
GooglePlayServicesClient.ConnectionCallbacks,
GooglePlayServicesClient.OnConnectionFailedListener, 
com.google.android.gms.location.LocationListener {
	
//client untuk mendapatkan lokasi
LocationClient mLocationClient;

//lokasi terakhir
Location mCurrentLocation;
	
//untuk output
    TextView tvLat;
    TextView tvLng; 
    TextView tvStatus;
    
    //parameter update lokasi
    
    //interval update dalam Milidetik yang diinginkan
    //jika tidak ada app lain yg mengakses, interval akan sesuai ini
    //tapi jika ada app lain yg mengakses, interval bisa lebih pendek
    private static final long UPDATE_INTERVAL = 1000 * 5; //5 detik 
    
    //interval tercepat yang dapat dihandle oleh app
    //karena interval bisa lebih pendek daripada nilai UPDATE_INTERVAL
    //sehingga dapat terjadi overflow, yaitu data update lebih cepat
    //daripada yang app bisa handle 
    //untuk mengatasi itu dapat diset fasteset_interval sebagai batas
    //tercepat
    //jika diset 1 detik, maka *paling cepat* app akan diupdate lokasinya
    //tiap 1 detik
    private static final long FASTEST_INTERVAL =1000 * 1; //1 detik
    
    // objek berisi parameter2 update lokasi
    LocationRequest mLocationRequest;
    
    private Time waktu;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_coba_google_location);
		mLocationClient = new LocationClient(this, this, this);
		
		//init user interface
		tvStatus = (TextView) findViewById(R.id.tvStatus);
		tvLat =  (TextView) findViewById(R.id.tvLat);
		tvLng =  (TextView) findViewById(R.id.tvLng);

		waktu = new Time();
	    
		//siapkan paramter request
		mLocationRequest = LocationRequest.create();
        	// akurasi tertinggi
        	mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        	// Set the update interval dan fastetst update interval
        	mLocationRequest.setInterval(UPDATE_INTERVAL);
        	mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
	}
	

    //Dipanggil saat Activity  visible.
    @Override
    protected void onStart() {
        super.onStart();
        // Connect ke client
        mLocationClient.connect();
    }
    
    /*
     * dipanggil saat activity tidak terlihat
     */
    @Override
    protected void onStop() {
        // disconnect dengan client
        mLocationClient.disconnect();
        super.onStop();
    }


	@Override
	public void onConnected(Bundle arg0) {
		//method ini dipanggil saat sudah terhubung dgn client
		
		tvStatus.setText("Terhubung.. mulai mengupdate");
		
		//mulai update request dengan parameter
		//yang ada pada mLocationRequest
		//selanjutnya jika ada update lokasi maka 
		//method onLocationChanged akan dipanggil
		mLocationClient.requestLocationUpdates(mLocationRequest, this);
	}
	
	@Override
	public void onLocationChanged(Location loc) {
		//dipanggil setiap ada perubahan lokasi
		//freq pemangilan sesuai parameter 
		//interval dan fastestinterval
		
		//catat waktu update
		waktu.setToNow();
		String strWaktu =  "Direfresh:"+
		       waktu.hour+":"+waktu.minute+":"+waktu.second;
		tvStatus.setText(strWaktu);
		
		//tulis latitude dan longitude
		tvLng.setText(Double.toString(loc.getLongitude()));
		tvLat.setText(Double.toString(loc.getLatitude()));   
	}

	@Override
	public void onDisconnected() {
		// dipanggil saat sudah tidak terhubung
		Toast.makeText(this, "Disconnected", Toast.LENGTH_SHORT).show();
	}

	@Override
	public void onConnectionFailed(ConnectionResult arg0) {
		// sekarang tampilkan pesan dulu
		// nanti ada mekanisme resolve
		Toast.makeText(this, "Koneksi gagal.",
               Toast.LENGTH_SHORT).show();
	}
}


Penanganan Error
Pada dua contoh sebelumnya, belum ditangani jika terjadi kesalahan saat koneksi dengan Google Play Service. Beberapa kemungkinan error yang dapat terjadi misalnya user belum melakukan sign-in, google play belum diupdate, tanggal yang salah dan sebagainya (ingat kelemahan Google Location API adalah API ini bergantung pada Google Play Service). Beberapa kesalahan dapat diselesaikan dengan memanggil intent.

Kita akan memodifikasi code pada bagian sebelumnya untuk menangani kesalahan saat app mencoba terhubung dengan service.

Tambahkan konstanta berikut:

//kode result setelah intent dipanggil, akan digunakan di
//onActvityResult
private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000; 

Kemudian ubah isi method onConnectionFailed yang akan dipanggil jika terjadi gagal koneksi. Jika ada kemungkinan untuk solusi (misalnya harus login ulang dengan account Google), maka akan dipanggil intent melalui startResolutionForResult. Setelah selesai pemanggilan intent, onActivityResult akan dipanggil.

@Override
	public void onConnectionFailed(ConnectionResult cr) {
		tvStatus.setText("Koneksi gagal, coba resolusi");
		if (cr.hasResolution()) {
            		try {
                	//memungkinkan resolusi (misal install google 
            		//play versi terbaru, login dll). 
            		//Jalankan intent 
            		//nanti hasilnya ditangkap di onActivityResult
                	cr.startResolutionForResult(
                        	this,
                        	CONNECTION_FAILURE_RESOLUTION_REQUEST);

            	} catch (IntentSender.SendIntentException e) {
                   e.printStackTrace();
            	}
        	} else {
            	   //tidak ada resolusi, tampilkan error code
                   Toast.makeText(this, "Tidak bisa melakukan koneksi, kode:"+
                                  cr.getErrorCode(), Toast.LENGTH_SHORT).show();
                }
	}

onActivityResult akan dipanggil saat intent selesai, dicek melalui requestCode dan jika resultCode berisi RESULT_OK maka artinya resolusi berhasil dan berhasil terhubung dengan Google Play Service.

	 @Override
	 protected void onActivityResult(
			int requestCode, int resultCode, Intent data) {
	        switch (requestCode) {
	            //hasil kiriman dari startResolutionForResult
	        	case CONNECTION_FAILURE_RESOLUTION_REQUEST :
	                if (resultCode==Activity.RESULT_OK) {
	                   //resolusi sukses
	                   tvStatus.setText("Resolusi sukses, terhubung");	
	                } else {
		               tvStatus.setText("Gagal terhubung");		
	                }	
	                break;
	        }
	 }

Lokasi (Bagian 2A: Google Location API: Instalasi + Lokasi Terakhir)

Update 6 Oktober 2015, penting!

Tutorial terbaru yang mengambil lokasi terakhir menggunakan Google Play Service Location API dengan Android Studio (gradle) sudah tersedia: http://indonesiaberkicau.com/pengambilan-lokasi-terakhir-di-android-dengan-google-play-services-location-api-android-studiogradle/

End Update.

 

 

Instalasi Google Play Service

Dibandingkan Android Location API yang dibahas sebelumnya, kelebihan Google Location API adalah lebih hemat energi dan lokasi dapat diperoleh langsung karena proses mendapatkan lokasi dilakukan melalui Google Play Service yang berjalan di background. Berbagai app yang membutuhkan lokasi juga dapat menggunakan service secara bersama-sama sehingga secara keseluruhan akan menghemat batere. Kelemahan utamanya, app jadi bergantung pada layanan Google.

Google Location API dapat dijalankan di Android versi 2.3 ke atas, tetapi jika menggunakan AVD harus menggunakan minimal versi 4.2.2. Untuk memanfaatkan Google location, pertama yang harus dinstall (jika belum) adalah Google Play Service.

Jalankan SDK Manager (jika lewat Eclipse: Window –> Android SDK Manager) lalu install komponen tersebut (gambar bawah).
loc_2_1

Setelah berhasil, lihat lokasi Android SDK di kiri atas

loc_2_2

lalu copy library yang berada di android SDK tersebut:
/extras/google/google_play_services/libproject/google-play-services_lib/
ke lokasi bebas asalkan bukan di direktori workspace dan sdk. Sekarang impor library tersebut di workspace Ecplise dengan menu File –> Import, Android –> Existing Android Code into Workspace (gambar bawah)

loc_2_3

Pilih direktori library yang sudah kita copy, setelah muncul dialog (gambar bawah), check “copy projects into workspace” lalu tekan finish.

loc_2_4

Google-play-service_lib akan masuk ke workspace dan muncul dibagian project explorer (gambar bawah)

loc_2_5

Mengambil Lokasi Terakhir
Sekarang kita akan buat app untuk mengambil koordinat terakhir. Buat project baru, tambahkan Google Play Service lib ini sebagai library. Pada project explorer, klik kanan lalu pilih properperties. Pilih Android, lalu add (gambar bawah).

loc_2_6

Setelah add di-klik akan muncul seperti gambar bawah. Pilihlah google-play-service_lib

loc_2_7

Lalu pada file AndroidManifest.xml tambahkan elemen berikut di dalam elemen <application>

<meta-data android:name="com.google.android.gms.version"
           android:value="@integer/google_play_services_version" />

Jangan lupa tambahkan permission ditambahkan di dalam elemen <manifest>

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

Selanjutnya buat activity yang mengimplement ConnectionCallbacks untuk dua method: onConnected yang dipanggil setelah terhubung dengan googleplay service dan onDisconnected saat terputus.

Selain itu activity juga perlu mengimpelement OnConnectionFailedListener yang menangani jika hubungan dengan googleplay service gagal dilakukan. Berikut kode lengkapnya, penanganan kesalahan jika terjadi kegagalan hubungan dengan Google Play Service belum ditangani (nanti akan dibahas kemudian). Jika program ini dijalankan maka akan langsung ditampilkan lokasi terakhir. Untuk mendapatkan lokasi secara terus menerus dan penanganan kesalahan akan dibahas pada posting berikutnya.


package edu.upi.cs.yudiwbs.cobagooglelocation;

import android.location.Location;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.widget.Toast;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesClient;
import com.google.android.gms.location.LocationClient;

//implements ConnectionCallBacks dan OnConnectionFailedListener
public class CobaGoogleLocation extends FragmentActivity implements
GooglePlayServicesClient.ConnectionCallbacks,
GooglePlayServicesClient.OnConnectionFailedListener {

	//client untuk mendapatkan lokasi
	LocationClient mLocationClient;

	//lokasi terakhir
	Location mCurrentLocation;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_coba_google_location);
		mLocationClient = new LocationClient(this, this, this);
	}

    //Dipanggil saat Activity  visible.

    @Override
    protected void onStart() {
        super.onStart();
        // Connect the client.
        mLocationClient.connect();

    }

    /*
     * dipanggil saat activity tidak terlihat
     */

    @Override
    protected void onStop() {
        // disconnect dengan client
        mLocationClient.disconnect();
        super.onStop();
    }

	@Override
	public void onConnected(Bundle arg0) {
		//method ini dipanggil saat sudah terhubung dgn client
		Toast.makeText(this, "Terhubung", Toast.LENGTH_SHORT).show();

		//akses terhadap lokasi
		//hanya boleh dipanggil saat sudah connected
		mCurrentLocation = mLocationClient.getLastLocation();
		Toast.makeText(this, "Lat: "+mCurrentLocation.getLatitude()+
        		             " Long:"+mCurrentLocation.getLongitude(),
		                     Toast.LENGTH_LONG).show();
	}

	@Override
	public void onDisconnected() {
		// dipanggil saat sudah tidak terhubung
		Toast.makeText(this, "Disconnected", Toast.LENGTH_SHORT).show();
	}

	@Override
	public void onConnectionFailed(ConnectionResult arg0) {
		// sekarang tampilkan pesan dulu
		// nanti ada mekanisme resolve
		Toast.makeText(this, "Koneksi gagal.",
        Toast.LENGTH_SHORT).show();

	}
}

Berlanjut ke bagian 2B: Mengambil lokasi secara reguler dan penanganan error

Lokasi (Bagian 1: Android Location API)

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

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.

Ada dua cara app Android untuk mendapatkan lokasi, pertama dengan Android Location API dan kedua dengan Google Location API. Google Location API lebih simple API-nya, lebih hemat batere, cepat memperoleh lokasi tapi bergantung pada Google Play Service. Pada bagian ini, kita akan membahas mengenai Android Location API terlebih dulu baru kemudian Google Location API. Kita akan mencoba membuat aplikasi sederhana yang mengambil lokasi. Untuk lebih memahami proses pengambilan lokasi, sebaiknya jalankan app langsung pada device bukan AVD.

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 sudah termasuk (gambar bawah).

loc_1_1

Untuk mengambil lokasi, kita akan buat activity yang meng-implement LocationListener dan kemudian dipassing ke LocationManager.

public class MainActivity extends Activity implements LocationListener {

Pertama tambahkan tiga textview dalam activity_main.xml. Ganti id dengan tvStatus, tvLat dan tvLng (gambar bawah).

loc_1_2

Berikut adalah code lengkap untuk class MainActivity, perhatikan comment yang ada. Jalankan langsung di-device.


import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.text.format.Time;
import android.view.Menu;
import 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;
	    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;

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

	@Override
	public void onStatusChanged(String provider, int status, Bundle extras) {
	}

}

Jika dijalankan maka pada saat awal lokasi akan diisi dengan cepat berdasarkan data terakhir (network). Perhatikan icon GPS di kiri atas yang menyatakan GPS mulai diaktifkan (gambar bawah)

loc_1_3

Setelah beberapa saat (bawa device ke dekat jendela atau ruang terbuka atau lapangan). 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:

loc_1_4

Tip: Untuk menghemat batere, dapat dilakukan 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

Berlanjut di bagian 2 :  Google Location API

Bagian 4: Widget Dasar

Lanjutan tutorial bagian 3

Update: Des 2015, update sesuai android studio.

Pada modul sebelumnya kita telah menggunakan input box, button dan label. Komponen user interface  ini disebut widget. Beberapa widget dasar yang akan dibahas adalah:  TextView, Button, Image, EditText, CheckBox, RadioButton, ListView. Semua merupakan turunan dari kelas View, sehingga sering juga disebut View. Untuk widget yang menerima input, disebut juga input control. (kadang memang membingungkan untuk urusaan penamaan di Android ini)

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 app. 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)

Text View

TextView digunakan untuk menampilkan label teks. View ini sudah kita gunakan  Beberapa contoh property dari TextView adalah android:textSize untuk mengatur ukuran, android:textStyle untuk mengatur apakah font bold atau italic, android:textColor dsb.

Coba masuk activity_main.xml, klik kaca pembesar untuk zoom lalu   klik textview yang ada di form, perhatikan property editor  di bagian kanan (gambar bawah)

widget_property

 

Property dapat diedit melalui property editor. Coba edit property text color dan text size sebagai berikut (gambar bawah) dan perhatikan efeknya:

textview_properties

 

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.

Selain melalui property editor,  property juga dapat diedit langsung melalui xml. Pindah dari mode design graphical layout ke text xml (gambar bawah)

ganti_mode
Lihat XML untuk textview dan tambahkan android:textStyle = “bold” (code bawah)

&lt;TextView
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="Hello World!"
 android:textColor="#ff0000"
 android:textSize="40sp"
 android:textStyle="bold" &gt;

Perhatikan hasilnya.

Sekarang kita coba mengganti property melalui code.  Melalui property editor, ganti id textview menjadi tvHalo. Lalu masuk ke MainActivity.java, tambahkan code berikut di bagian onCreate, tekan Alt-Enter untuk menambahkan impor yang dibutuhkan.


	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		//ambil textview dan set property-nya
		TextView tvHalo = (TextView) findViewById(R.id.tvHalo);
		tvHalo.setTextColor(Color.GREEN);
	}

Jalankan program dan lihat hasilnya (warna teks menjadi hijau).

Button

Button merupakan turunan dari TextView sehingga yang berlaku di textView juga berlaku di button. Tambahan property yang penting adalah onClick.  Pembahasan tentang button sudah ada di tutorial sebelumnya.

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.

Berbeda dengan program pada desktop, app di Android dapat berjalan di device dengan berbagai resolusi.  Oleh karena itu, kita perlu menyiapkan image untuk berbagai kategori resolusi. Hal ini untuk mencegah gambar yang digunakan terlihat pecah atau terlalu kecil pada device dengan resolusi berbeda. Ada lima jenis resolusi: mdpi untuk medium (160dpi) , hdpi untuk high density (240dpi) dan xhdpi untuk ekstra high density (320dpi).  xxhdpi untuk resolusi 480dpi dan xxxhdpi untuk 640.

 

4_4

Image yang akan ditampilkan dalam button diletakkan di direktori /res/drawable sesuai dengan resolusinya. res merupakan singkatan dari “resource”,  file-file yang berada di dalam direktori /res disebut dengan project resources.

Catatan: di dalam direktori res juga ada direktori mipmap, direktori ini khusus untuk menyimpan icon app.

Catatan: Icon gratis dapat didownload di: https://design.google.com/icons/   Tinggal pilih ukuran yang kita inginkan (dalam dp) maka langsung disiapkan untuk hdpi sampai xxxhdpi.  Setelah didonwload dan diekstrak, letakan di direktori [project]/app/src/main/res seperti ini:

direktori_res

Misalnya kita akan menambah button dan image view. Di window palette, pilih Image View” dan drag ke form. PIlih property src, lalu tekan button disebelahnya. Pilih tab Project, lalu cari direktori Drawable (gambar bawah) dan pilih salah satu drawable.

property_src_imageview

Hasilnya akan seperti ini

imageview
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, ke mode text dan isi property drawableLeft di dalam elemen <button> seperti berikut:

android:drawableLeft="@drawable/abc_btn_check_to_on_mtrl_000"

Hasilnya akan seperti ini:

button_dgn_image

Coba ganti drawableLeft dengan drawableRight, drawableTop atau drawableButtom.

EditText

EditText digunakan untuk menerima input dari pengguna.  Pada palette telah disediakan berbagai jenis EditText, silahkan dicoba satu persatu dan perhatikan property setiap widget .

text_fields

CheckBox

User dapat memilih lebih dari satu pilihan dengan checkbox.

Coba tambahkan dua checkboxs. Double klik pada checkbox lalu isi id dan text

setidtext_checkbox2

Satu bertuliskan “Java” dengan id cbJava , dan yang kedua PHP” dengan id cbPHP
4_13

Tambahkan Button dan TextView di form untuk menampilkan hasil pilihan user. Sehingga tampilannya akan seperti ini. Beri nama id textview dengan  tvHasil.

contoh_checkbox

 

Jangan lupa set atribut onClick button dengan method “klikHasil”, yang implementasinya sebagai berikut. Perhatikan penggunaan isChecked untuk mengambil nilai apakah user meng-check pilihan:

public void klikHasil(View v) {
		//ambil komponen
		TextView tvHasil = (TextView) findViewById(R.id.tvHasil);
		CheckBox cbJava = (CheckBox) findViewById(R.id.cbJava);
		CheckBox cbPHP = (CheckBox) findViewById(R.id.cbPHP);

		//proses checkbox yang dicheck user
		String s = "";
		if (cbJava.isChecked())  {
			s = s+ " java dicheck ";
		}
		if (cbPHP.isChecked())  {
			s = s+ " PHP dicheck ";
		}

		//tampilkan di textview
		tvHasil.setText(s);

	}

Hasilnya akan sepertin ini:

4_16

Latihan CheckBox:

Buat soal berikut yang penggunanya dapat memilih lebih dari  satu:

4_21Jawaban 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).

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 bagian Container.  Baru kemudian tambahkan radio button.

Hasilnya:

4_18

Tambahkan button dan textview, lalu gunakan property untuk mengedit sehingga hasilnya seperti berikut.

4_19

Sekarang kita perlu set id setiap widget. Ganti id RadioGroup dengan rgJenKel,  radiobutton dengan rbPria dan rbWanita dan id TextView dengan tvHasilRadio.  Tambahkan property onClick pada button  dengan nama klikHasilRadio.

Catatan: atribut android:orientation pada RadioGroup dapat diisi “horizontal” agar radio button tersusun secara mendatar

Jangan lupa save, lalu masuk ke MainActivity.java. Code saat tombol diklik adalah sebagai berikut. Perhatikan pengunaan getCheckRadioButtonId yang mengambil idRadio yang dipilih oleh pengguna:


public void klikHasilRadio(View v) {
		TextView tvHasilRadio = (TextView) findViewById(R.id.tvHasilRadio);
		RadioGroup rgJenKel = (RadioGroup) findViewById(R.id.rgJenKel);

		//ambil pilihan user
		int idPil = rgJenKel.getCheckedRadioButtonId();

		//isi string
		String s;
		if (idPil==R.id.rbPria) {
			s = "Pilihan: Pria";
		} else if (idPil==R.id.rbWanita){
			s = "Pilihan: Wanita";
		} else {
			s = "Tidak ada yg dipilih";
		}

		//isi textview
		tvHasilRadio.setText(s);

	}

Hasilnya akan seperti ini jika button di tap:

4_20

Latihan radiogroup:

Buat soal berikut yang penggunanya hanya dapat memilih tepat satu:

4_22

Jawaban yang benar adalah “Kendari”.  Jika pengguna memilih pilihan yang benar akan mendapat nilai 10, sedangkan jika menjawab salah maka akan mendapat nilai -2

Berlanjut ke tutorial bagian 5: ListView

Daftar isi lengkap semua tutorial

Bagian 3: App Hello [nama]

Lanjutan dari tutorial bagian 2.

Selanjutnya kita akan memodifikasi program hello world pada tuturial sebelumnya 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).

2.2

Pilih tab “Graphical Layout”  (gambar bawah)

3_1

Komponen-komponen user interface yang berada di bagian kiri, sering disebut “widget” atau “view”.

Pertama pilih widget TextField,  pilih yang paling atas (plain text), lalu drag ke dalam form. (Gambar bawah).  Widget ini berfungsi menerima input “nama” dari pengguna.

3_2

3_3

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

3_4

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

3_5

Save dan coba run (ctrl-F11) 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. 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 “Sapa” dan id dengan “bSapa”  (Gambar bawah)

3_6

Saat id diganti maka ada pesan untuk mengupdate semua kemunculan id, jawab ini dengan “Yes”.  Kemudian muncul window “Rename Resource” dan jawab ini juga dengan OK (gambar bawah).   Cara ini akan membuat semua kemunculan id ini di activity_main akan otomatis diganti. Ini akan lebih mudah dibandingkan harus mengganti secara manual file xml.

3_7

Lakukan hal yang sama untuk textfield, ganti id dengan etNama dan textview, ganti id dengan tvSalam (Gambar bawah).

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

3_9

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

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 (code bawah yang di-highlight):

<Button
android:id="@+id/bSapa"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/etNama"
android:layout_alignParentRight="true"
android:onClick="bSapaClick"
android:text="Sapa" />

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  (Gambar bawah).

3_10

Kemudian buat satu method baru bSapaClick (code dibawah, baris 3-11).  Pastikan nama method sama dengan yang dicantumkan di activity_main.XML.  Nama yang tidak sama akan menyebakan error saat program dijalankan

public class MainActivity extends Activity {

	public void bSapaClick(View v) {
		//ambil komponen text dan label
		EditText etNama = (EditText) findViewById(R.id.etNama);
		TextView tvSalam = (TextView) findViewById(R.id.tvSalam);
		//ambil masukkan dari user
		String nama = etNama.getText().toString();
		//tulis di label
		tvSalam.setText("Halo "+ nama + " senang bertemu dengan anda");
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	@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;
	}

}

Tambahkan impor class yang dibutuhkan dengan Ctrl-Shift-O.

Tip: Jika id tidak dikenali seperti R.id.etNama, R.id.tvSalam dan seterusnya, buka kembali activity_main.xml lalu tekan ctrl-S (save)

Jalankan program (ctrl-F11), 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.  Listener akan banyak digunakan, jadi penting juga dipelajari

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Button btSapa = (Button) findViewById(R.id.bSapa);
		btSapa.setOnClickListener(new OnClickListener() {
			public void onClick(View arg) {
				EditText etNama = (EditText) findViewById(R.id.etNama);
				TextView tvSalam = (TextView) findViewById(R.id.tvSalam);
				String nama = etNama.getText().toString();
				tvSalam.setText("Halo "+ nama + " senang bertemu dengan anda");
			}
		} );
	}

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

Kerjakan latihan di bawah dan lanjut ke bagian 4: widget dasar

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 dari tipe string ke double.

    double dblPanjang = Double.valueOf(StrPanjang);

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.

Bagian 2: App Hello World (Eclipse)

Update Apr 2015:

Posting ini masih menggunakan Eclipse. Google tidak akan lama lagi akan mendrop support terhadap Eclipse sehingga lebih baik beralih ke Android Studio. Versi tutorial ini untuk Android Studio.

=End Update=

Lanjutan dari bagian 1: Instalasi

Sesuai tradisi programmer, langkah pertama saat mencoba suatu platform 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 yuliadi.com, maka nama package adalah: com.yuliadi.nam_app. Jika nama web organisasinya cs.upi.edu, maka contoh nama packagenya: edu.upi.cs.yudiwbs.nama_app.

2_1

Dapat dilihat pada gambar di bawah bahwa minimum required SDK diset dengan API11 Android 3.0 (HoneyComb) karena versi ini telah mendukung ActionBar. Sedangkan “Target SDK”, “Compile With” dapat diisi dengan SDK yang paling tinggi.

Selanjutnya pilih next sampai untuk activity pilih “BlankActiviy” dan Next. Terakhir, klik “Finish” dan tunggu beberapa saat.

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 di buat activity_main.xml. Jika belum terbuka, coba buka /res/layout/activity_main.xml melalui package explorer (gambar bawah).

2.2

Pertama yang kita lihat adalah graphical layout berisi rendering layout dan fasilitas untuk mengedit layout. Lihat ke tab bagian bawah, pilih activity_main.xml (gambar bawah) untuk melihat format XML-nya. Komponen user interface dalam Android didefinisikan didalam XML. Jadi anda dapat mengubah elemen tampilan dengan dua cara: melalui graphical layout atau langsung mengedit file xml-nya.

2_3

Sekarang coba buka source code. Lihat package explorer, buka src, package dan klik MainActivity.java (gambar bawah)

2_4

Dapat dilihat source code yang dibangkitkan ADT

Sekarang jalankan project dengan mengklik icon run (gambar bawah) atau ctrl-F11 dan pilih Android Application. Tunggu emulator dilaunch jika emulator telah ditutup sebelumnya .

2_5

Perhatikan tab console dibagian bawah (gambar bawah). Tab ini penting untuk melihat apa yang terjadi. Jika emulator sudah tertutup, harap tunggu beberapa lama (bisa 1-10 menit tergantung kemampuan komputer). Tip: Penggunaan emulator sangat lambat, jika tersedia, sebaiknya gunakan device asli yang terhubung dengan USB.

2_6

Lihat emulator maka akan akan muncul aplikasi berikut (jika device dalam kondisi lock, unlock terlebih dulu)

2_7

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.

Lanjut ke tutorial bagian 3: Hello XXX

Hal Baru pada Android KitKat bagi Developer

Beberapa hal yang baru pada KitKat yang menarik bagi Android dev:

  1. Full screen (Immersion mode): benar-benar full screen yang dapat menyembunyikan tiga tombol standard: home, back dan multitasking.  Cocok untuk aplikasi game.
  2. Scene Transition: animasi antar page
  3. Screen recording:  seperti print-screen tapi untuk video. Memudahkan dev untuk membuat video demo app. Diaktifkan melalui ADB atau dengan klik button di Android Studio.
  4. Storage Access Framework: memudahkan mengelola file yang berasal dari cloud.
  5. Chromium WebView: Webview berbasis choromium, menggunakan JScript engine V8.
  6. Host Card Emulation (HCE): Mengemulasikan Android phone menjadi NFC card.
  7. Printing API: Mobile printing via wifi atau cloud.
  8. Infrared: menjadikan android sebagai remote TV dan remote-remote yang lain.
  9. Bluetooth HID over GATT (HOGP) & Bluetooth MAP:  HOGP untuk low-latency,  low-powered devices seperti mouse dan keyboard. Bluetooth MAP untuk berkomunikasi dengan devices terdekat seperti smartwatch.
  10. Low Power Sensor: hardware sensor batching sehingga menggunakan lebih sedikit energi.
  11. RenderScript: sekarang menggunakan GPU.
  12. Procstats: Tools untuk memonitor memori dan waktu yang digunakan suatu proses. Cocok kalau kita mengembangkan app yang berjalan di background dan ingin memonitor penggunaan resources-nya.
  13. Mendukung Java 1.7 (http://tools.android.com/). Sekarang kita bisa menggunakan diamond operator, multi-catch, strings dalam switch, try with resources. Oh ya, khusus untuk “try with resources” membutuhkan KitKat.

Rencananya akan saya coba setelah KitKat bisa diinstall dan SDK-nya tersedia 🙂

Sumber: http://readwrite.com/2013/11/07/android-kitkat-developers-users

Bagian 1: Instalasi SDK Android pada Windows (Eclipse)

Update Feb 2015:
Menggunakan Eclipse sudah tidak direkomendasikan lagi, sebaiknya langsung menggunakan Android Studio saja. Demikian halnya juga dengan emulator, kecuali untuk kondisi darurat, emulator terlalu lambat dan menggunakan memori terlalu besar. Ini tutorial untuk versi Android Studionya.
End-Update

Sebelumnya pastikan JDK telah diinstall. Jika belum, Anda dapat mendownloadnya di: http://www.oracle.com/technetwork/java/javase/downloads/

Untuk membuat app Android,  diperlukan Android SDK (Software Development Kit) yang dapat diperoleh di http://developer.android.com/sdk   sedangkan untuk IDE (Integrated Development Environment)  dapat dipilih Eclipse, Netbeans atau bahkan langsung dengan command line dan notepad. Tapi saat ini telah tersedia instalasi untuk Windows yang telah menyediakan semua komponen yang dibutuhkan (ADT Bundle for Windows).  Download ADT Bundle ini, dan setelah selesai ekstrak ke tempat yang anda inginkan dan langsung dapat dijalankan karena tidak ada proses instalasi.

Salah satu file hasil ekstrak dari ADT Bundle adalah “SDK Manager.exe”, jalankan file ini. Dapat dilihat bahwa versi default API yang terinstall adalah 4.2.2 (API17). Jika anda terkoneksi dengan internet, anda dapat download API versi lain yang dibutuhkan.

Selanjutnya kita perlu membuat emulator smartphone android (AVD: Android Virtual Device). Program yang akan kita buat dikomputer akan dijalankan di emulator ini.

Masih pada SDK Manager, Pilih ToolsàManage AVDs. Akan muncul dialog berisi daftar AVD  kemudian klik “New”  (Gambar bawah)

1

Kita akan buat AVD versi 4.2. (JellyBean) Isi nama, device dan target (gambar bawah)

2

Lalu isi RAM dengan ukuran kecil terlebih dulu, dan centang “Use Host GPU” (jika komputer anda memiliki GPU).  Lalu tekan OK (gambar bawah)

3

Pilih AVD yang baru Anda buat lalu klik Start dan kemudian Launch (gambar bawah). Tunggu 1-5 menit (tergantung kemampuan komputer yang Anda miliki).

4

Emulator ini membutuhkan waktu cukup lama dan memori yang  besar. Ambil secangkir kopi dan silahkan tunggu sampai layar berikut muncul (jika yang muncul masih tulisan Android berkelap-kelip, tunggu). Setelah emulator dijalankan, sebaiknya jangan ditutup lagi untuk menghemat waktu.

5

Terutama bagi yang belum memiliki Android, Anda dapat gunakan emulator ini untuk mengeksplorasi fitur-fitur Android.

Selanjutnya kembali ke file bundle yang telah diekstrak, terdapat direktori Eclipse. Masuk ke direktori ini dan jalankan eclipse.exe. Akan muncul dialog untuk memilih direktori tempat source akan diletakkan, lalu akan tampil window welcome seperti gambar dibawah. Close window ini selanjutnya anda siap membuat program pertama.

6

Tip: Jika anda menggunaka prosesor Intel, ada cara untuk mempercepat emulator Android, anda dapat menggunakan teknologi intel VT-x. Baca: (http://yudiwbs.wordpress.com/2012/09/15/mempercepat-emulator-android/)

Berlanjut ke bagian 2: membuat app pertama, hello world.