Pengambilan lokasi secara terus menerus Menggunakan Google Play Service

Update Feb 2016: Versi terakhir: https://docs.google.com/document/d/1bYU_SdfhicUH3QQnqWhcHbtPRapb7tH1qFU8jmx4jLk/edit?usp=sharing

 

Update 21 Nov 2015: mulai dari Android 6 (API 23),  ijin  ACCESS_COARSE_LOCATION and ACCESS_FINE_LOCATION menjadi bagian dari Android 6 runtime permission system. Sehingga diberikan bukan lagi saat instalasi, tapi saat runtime. Kode dibawah sudah diupdate untuk ini. Atau alternatifnya, turunkan targetSdkVersion ke bawah 23.

Jika dalam tutorial sebelumnya kita mengambil lokasi terakhir, dalam tutorial ini kita akan membuat app yang secara terus menerus mengambil posisi terakhir dari device. Ini bermanfaat misalnya dalam aplikasi tracking, geofencing, navigasi dan lain-lain.

Seperti pada tutorial sebelumnya, pastikan Google Play Service SDK sudah diinstall dan project menggunakan library Google Play Service. Supaya lebih gampang, gunakan project pada tutorial sebelumnya atau impor.

Ubah permission untuk mengakses lokasi yang paling akurat di AndroidManifest.xml

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

Tambahkan agar MainActivity mengimplement LocationListener. Hati-hati, pastikan yang diimpor adalah android.gms.location.LocationListener bukan android.location.LocationListener!

import  com.google.android.gms.location.LocationListener; 

public class MainActivity extends AppCompatActivity
       implements
       GoogleApiClient.ConnectionCallbacks,
       GoogleApiClient.OnConnectionFailedListener,
       LocationListener //<--tambahkan ini
{ …

Dengan mengimplement interface LocationListener maka jika ada perubahan lokasi, akan ditangkap oleh activity ini (di method onLocationChanged).

Tambahkan objek Locationrequest dan method untuk mengisi paramater objek tersebut (kode dibawah). LocationRequest berisi berbagai setting untuk mendapatkan update lokasi. Penjelasan tentang isi LocationRequest ada di bawah:


LocationRequest mLocationRequest;

protected void createLocationRequest() {
   mLocationRequest = new LocationRequest();
   mLocationRequest.setInterval(10000); //10 detik
   mLocationRequest.setFastestInterval(5000); //5 detik
   mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
}

Method ini dipanggil pada saat onCreate, tambahkan juga penanganan request. Karena Android 6 mewajibkan runtime permission system.

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mLatText  =  (TextView) findViewById(R.id.tvLat);
        mLongText =  (TextView) findViewById(R.id.tvLong);
        mWaktuUpdate = (TextView) findViewById(R.id.tvWaktu);

        //cek permission
        //mulai dari Android 6: API 23, persmission dilakukan secara dinamik (tidak diawal lagi saat install)
        //untuk jenis2 persmisson tertentu, termasuk lokasi
        //hati-hati, pastikan yang digunakan adalah ACCESS_FINE_LOCATION, jika salah tidak ada runtime error
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {

                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                        MY_PERMISSIONS_REQUEST);

                // MY_PERMISSIONS_REQUEST adalah konstanta, nanti digunakan di  onRequestPermissionsResult

        } else {
            //sudah diijinkan
            ijin = true;
            buildGoogleApiClient();
            createLocationRequest();
            mGoogleApiClient.connect();
        }
    }

 @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {

        if (requestCode == MY_PERMISSIONS_REQUEST) {
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                //permission diberikan, mulai ambil lokasi
                buildGoogleApiClient();
                createLocationRequest();
                mGoogleApiClient.connect();
                ijin = true;

            } else {
                //permssion tidak diberikan, tampilkan pesan
                AlertDialog ad = new AlertDialog.Builder(this).create();
                ad.setMessage("Tidak mendapat ijin, tidak dapat mengambil lokasi");
                ad.show();
            }
            return;
        }
    }

Ini penjelasan tentang isi locationrequestm, ada tiga komponen yang perlu diset yaitu interval, fastestinterval dan prioritas. Akurasi lokasi akan ditentukan oleh provider, permission dan opsi yang diminta app. Berikut penjelasannnya:

  1. Interval, menyatakan selang interval yang diinginkan, satuannya milidetik. Jika diset 10000 (10 detik), maka app akan diberi update lokasi device setiap 10 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) sehingga menyebabkan user interface berkedip-kedip (flicker).
  2. Untuk mencegah terjadinya overflow, dapat diset fastest interval untuk menyatakan interval tercepat yang akan diikirimkan ke app. Misalnya jika diset 5000 (5 detik), maka paling cepat app akan diupdate setiap 5 detik walaupun sebenarnya dapat lebih cepat.
  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.

Selanjutnya, tambahkan method permintaan untuk medapatkan update lokasi dari FusedLocation, perhatikan penggunaan mLocationRequest yang berisi paramter yang kita inginkan. Parameter ketiga “this” menyatakan bahwa activity ini akan dipanggil setiap ada update lokasi di method onLocationChanged

protected void startLocationUpdates() {
    LocationServices.FusedLocationApi.requestLocationUpdates(
            mGoogleApiClient, mLocationRequest, this);
}

Panggil startLocationUpdate saat onConnected (code bawah). Artinya segera setelah GoolgeApiClient terhubung, maka pengambilan lokasi akan dimulai.

@Override
public void onConnected(Bundle bundle) {
       startLocationUpdates();
}

Selanjutnya buat method yang dipanggil setiap lokasi diganti misalnya dengan merefresh user interface dengan data lokasi terakhir.


@Override
public void onLocationChanged(Location location) {
   mCurrentLocation = location;
   updateUI();  //update tampilan
}

private void updateUI() {
 mLatText.setText("Lat.:"+String.valueOf(mCurrentLocation.getLatitude()));
 mLongText.setText("Lon.:" + String.valueOf(mCurrentLocation.getLongitude()));
}

Saat stop dan pause, update lokasi harus distop untuk menghemat resources, dan baru dihidupkan jika app sudah resume (onResume)


    @Override
    protected void onStart() {
        super.onStart();
        if (ijin) {
            mGoogleApiClient.connect();
        }
    }

    @Override
    protected void onStop() {
        if (ijin) {
            mGoogleApiClient.disconnect();
        }
        super.onStop();
    }

    protected void stopLocationUpdates() {
        LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (ijin) {
            stopLocationUpdates();
        }
    }


    @Override
    public void onResume() {
        super.onResume();
        if (ijin) {
            if (mGoogleApiClient.isConnected()) {
                startLocationUpdates();
            }
        }
    }

Coba jalankan app, maka lokasi akan diupdate setiap 5 sd 10 detik sekali.

Source code lengkap tutorial ini: https://github.com/yudiwbs/LokasiUpdate

4 comments on “Pengambilan lokasi secara terus menerus Menggunakan Google Play Service

    • Default harusnya app akan bisa menggunakan mock location. Kalau memang nggak bisa, artinya dia dirancang agar nggak boleh. Setahu saya entah Androidnya di rooting, atau APK-nya di reverse jadi source code baru diedit.

  1. Kalo ngitung jarak total lokasi yang dillewati bagaimana?
    jadi dia update total jarak setiap device bergerak mulai dari awal sampai terakhir?

    • Simpan titik terkahir lalu hitung jarak antara titik tersebut dan titik sekarang. Jarak tsb lalu ditambahkan ke total jarak. Jadi cukup simpan satu variabel total jarak saja.

Leave a Reply

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload CAPTCHA.