Menampilkan Lokasi Saat Ini Dengan Maps API Pada Android Studio

Nugroho Ardi Sutrisno 7 Maret 2017

Menampilkan Lokasi Saat Ini Dengan Maps API Pada Android Studio

Untuk aplikasi android yang berbasis lokasi, memiliki fungsionalitas untuk mendeteksi lokasi terkini pengguna menjadi salah satu fungsi yang harus dimiliki. Dengan memanfaatkan Google Maps API, lokasi pengguna dapat diketahui dengan jaringan yang disediakan service provider maupun wifi yang terhubung dengan perangkat android pengguna.

Disini akan dijelaskan bagaimana cara membuat sebuah aplikasi android sederhana untuk melihat lokasi terkini pengguna dengan memanfaatkan Google Maps API yang akan dibangun menggunakan Android Studio. Sebelum memulai diperlukan aplikasi yang sebelumnya dibangun di tutorial Menampilkan Peta Dengan Google Maps API Pada Android Studio.

Persiapan

Beberapa hal yang perlu disiapkan antara lain :

  1. Android Studio.
  2. Perangkat android untuk uji coba aplikasi yang akan dibuat, pastikan perangkat terhubung dengan internet dan aktifkan akses lokasi.
  3. Aplikasi android dengan Google Maps API yang sebelumnnya dibuat di tutorial Menampilkan Peta Dengan Google Maps API Pada Android Studio.

Callback dan Variable Baru

Buka MapsActivity.java pada package java, tambahkan beberapa calback yang diperlukan, antara lain:

  1. GoogleApiClient.ConnectionCallbacks: Callback ini akan memiliki function 'public function onConnected()' yang akan dipanggil saat perangkat terhubung dengan jaringan internet.
  2. GoogleApiClient.OnConnectionFailedListener: Menyediakan callback saat klien dengan penyedia layanan gagal terhubung.
  3. LocationListener: Callback ini diperlukan saat terjadi perubahan lokasi pengguna.

Masukan ketiga callback setelah OnMapReadyCallback hingga menjadi

tekan ALT+ENTER dan import class yang diperlukan, hingga menjadi

Klik kanan pada bagian dengan garis bawah merah lalu pilih "Generate", kemudian pilih "Implement Method".

Pilih semua method lalu klik OK, lalu tambahkan beberapa variable baru yang nanti akan digunakan dibawahnya. Variable tersebut antara lain :

GoogleApiClient mGoogleApiClient;
private LocationRequest mLocationRequest;
private Marker mCurrLocationMarker;
private Location mLastLocation;

onMapReady()

Fungsi ini dipanggil saat peta siap digunakan. Disini letak ditambahkannya marker, listener dan atribut-atribut fungsional lainnya. Tambahkan kode berikut didalam onMapReady()

mMap = googleMap;

        //Memulai Google Play Services
        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (ContextCompat.checkSelfPermission(this,
                    android.Manifest.permission.ACCESS_FINE_LOCATION)
                    == PackageManager.PERMISSION_GRANTED) {
                buildGoogleApiClient();
                mMap.setMyLocationEnabled(true);
            }
        }
        else {
            buildGoogleApiClient();
            mMap.setMyLocationEnabled(true);
        }

buildGoogleApiClient()

Sekarang kita perlu menginisialisasi Google Play Services. Metode yang akan digunakan adalah builder method (buildGoogleApiClient()). Setelahnya setMyLocationEnabled diperlukan untuk mengaktifkan location layer yang memungkinkan perangkat untuk berinteraksi dengan lokasi terkini pengguna.

Buat fungsi baru dengan nama function protected synchronized void buildGoogleApiClient() dan tambahkan kode berikut:

mGoogleApiClient = new GoogleApiClient.Builder(this).addConnectionCallbacks(this).addOnConnectionFailedListener(this).addApi(LocationServices.API).build();
mGoogleApiClient.connect();
  1. GoogleApiClient.Builder digunakan untuk konfigurasi klien.
  2. .addConnectionCallbacks menyediakan callback yang diperlukan saat klien tengah terhubung atau terputus dari server.
  3. .addOnConnectionFailedListener menyediakan callback yang diperlukan saat klien gagal terhubung dengan layanan.
  4. .addApi menambahkan LocationServices API titik akhir Google Play Services.
  5. mGoogleApiClient.connect() klien harus terhubung terlebih dahulu sebelum dapat melakukan sebuah operasi.

onConnected()

Dalam aplikasi yang berbasis lokasi, sangat perlu untuk memperbarui lokasi terkini secara berkala. Dengan Location Provider yang memanfaatkan data lokasi dari GPS, sinyal cellular dan jaringan Wi-Fi dapat dilakukan analisa lokasi dengan sangat akurat. Tambahkan kode berikut didalam onConnected():

LocationRequest mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(1000);
        mLocationRequest.setFastestInterval(1000);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
        if (ContextCompat.checkSelfPermission(this,
                android.Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
            LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
        }

Jadi sekarang aplikasi berbasis lokasi ini telah dapat mengetahui kemungkinan lokasi terkini. Selanjutnya perlu ditambahkan apa yang harus dilakukan saat lokasi pengguna berubah. Untuk itu Google Maps API telah menyediakan fungsi onLocationChanged.

onLocationChanged()

Tambahkan kode berikut didalam onLocationChanged() :

mLastLocation = location;
        if (mCurrLocationMarker != null) {
            mCurrLocationMarker.remove();
        }
        LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());

        CameraPosition cameraPosition = new CameraPosition.Builder().target(new LatLng(latLng.latitude, latLng.longitude)).zoom(16).build();

        mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));

        //menghentikan pembaruan lokasi
        if (mGoogleApiClient != null) {
            LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
        }

Selanjutnya diperlukan izin untuk mengakses lokasi terkini.

Permintaan Izin Akses Lokasi

Pada Android 6.0 Marshmallow, aplikasi tidak akan diberi izin apapun pada saat instalasi. Melainkan aplikasi harus meminta izin satu per satu pada saat aplikasi berjalan. Jadi tambahkan kode berikut:

public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99;
    public boolean checkLocationPermission(){
        if (ContextCompat.checkSelfPermission(this,
                android.Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    android.Manifest.permission.ACCESS_FINE_LOCATION)) {
                ActivityCompat.requestPermissions(this,
                        new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
                        MY_PERMISSIONS_REQUEST_LOCATION);
            } else {
                ActivityCompat.requestPermissions(this,
                        new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
                        MY_PERMISSIONS_REQUEST_LOCATION);
            }
            return false;
        } else {
            return true;
        }
    }

Pada kode diatas checkSelfPermission harus menghasilkan PackageManager.PERMISSION_GRANTED, sehingga apliksi dapat melanjutkan prosesnya. Jika aplikasi tidak mendapatkan izin, method ini akan menghasilkan PERMISSION_DENIED, dan aplikasi akan meminta persetujuan izin dari pengguna.

Respon Permintaan Akses Lokasi

Sebuah dialog box akan ditampilkan saat aplikasi meminta persetujuan dari pengguna. Saat pengguna menanggapi, sistem yang menyangkut method onRequestPermissionsResult(), memberikan aplikasi tanggapan dari pengguna. Aplikasi ini mengambil alih apabila persetujuan telah diberikan. Tambahkan kode berikut:

@Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_LOCATION: {
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                    // Izin diberikan.
                    if (ContextCompat.checkSelfPermission(this,
                            android.Manifest.permission.ACCESS_FINE_LOCATION)
                            == PackageManager.PERMISSION_GRANTED) {

                        if (mGoogleApiClient == null) {
                            buildGoogleApiClient();
                        }
                        mMap.setMyLocationEnabled(true);
                    }

                } else {

                    // Izin ditolak.
                    Toast.makeText(this, "permission denied", Toast.LENGTH_LONG).show();
                }
                return;
            }
        }
    }

Setalah semua proses pengkodean selesai seluruh script MapsActivity.java akan terlihat seperti berikut :

package com.example.root.peta;

import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.support.v4.content.ContextCompat;
import android.view.View;
import android.widget.Toast;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback,
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener, LocationListener {

    private GoogleMap mMap;
    GoogleApiClient mGoogleApiClient;
    private LocationRequest mLocationRequest;
    private Marker mCurrLocationMarker;
    private Location mLastLocation;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        // Memuat SupportMapFragment dan memberi notifikasi saat telah siap.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }


    /**
     * Manipulates the map once available.
     * This callback is triggered when the map is ready to be used.
     * This is where we can add markers or lines, add listeners or move the camera. In this case,
     * we just add a marker near Sydney, Australia.
     * If Google Play services is not installed on the device, the user will be prompted to install
     * it inside the SupportMapFragment. This method will only be triggered once the user has
     * installed Google Play services and returned to the app.
     */
    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        //Memulai Google Play Services
        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (ContextCompat.checkSelfPermission(this,
                    android.Manifest.permission.ACCESS_FINE_LOCATION)
                    == PackageManager.PERMISSION_GRANTED) {
                buildGoogleApiClient();
                mMap.setMyLocationEnabled(true);
            }
        }
        else {
            buildGoogleApiClient();
            mMap.setMyLocationEnabled(true);
        }
    }

    private void buildGoogleApiClient() {
        mGoogleApiClient = new GoogleApiClient.Builder(this).addConnectionCallbacks(this).addOnConnectionFailedListener(this).addApi(LocationServices.API).build();
        mGoogleApiClient.connect();
    }

    @Override
    public void onConnected(@Nullable Bundle bundle) {
        LocationRequest mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(1000);
        mLocationRequest.setFastestInterval(1000);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
        if (ContextCompat.checkSelfPermission(this,
                android.Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
            LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
        }
    }

    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

    }

    @Override
    public void onLocationChanged(Location location) {
        mLastLocation = location;
        if (mCurrLocationMarker != null) {
            mCurrLocationMarker.remove();
        }
        LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());

        CameraPosition cameraPosition = new CameraPosition.Builder().target(new LatLng(latLng.latitude, latLng.longitude)).zoom(16).build();

        mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));

        //menghentikan pembaruan lokasi
        if (mGoogleApiClient != null) {
            LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
        }
    }

    public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99;
    public boolean checkLocationPermission(){
        if (ContextCompat.checkSelfPermission(this,
                android.Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    android.Manifest.permission.ACCESS_FINE_LOCATION)) {
                ActivityCompat.requestPermissions(this,
                        new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
                        MY_PERMISSIONS_REQUEST_LOCATION);
            } else {
                ActivityCompat.requestPermissions(this,
                        new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
                        MY_PERMISSIONS_REQUEST_LOCATION);
            }
            return false;
        } else {
            return true;
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_LOCATION: {
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                    // Izin diberikan.
                    if (ContextCompat.checkSelfPermission(this,
                            android.Manifest.permission.ACCESS_FINE_LOCATION)
                            == PackageManager.PERMISSION_GRANTED) {

                        if (mGoogleApiClient == null) {
                            buildGoogleApiClient();
                        }
                        mMap.setMyLocationEnabled(true);
                    }

                } else {

                    // Izin ditolak.
                    Toast.makeText(this, "permission denied", Toast.LENGTH_LONG).show();
                }
                return;
            }
        }
    }
}

Untuk uji coba aplikasi yang telah dibuat gunakan perangkat android yang terhubung ke android studio dan memiliki koneksi internet serta aktifkan akses lokasi pada pengaturan perangkat android. Jika uji coba berhasil maka akan muncul gambar seperti di bawah ini

Image