Android - Layanan Berbasis Lokasi

API lokasi Android memudahkan Anda membangun aplikasi sadar lokasi, tanpa perlu berfokus pada detail teknologi lokasi yang mendasarinya.

Ini menjadi mungkin dengan bantuan Google Play services, yang memfasilitasi penambahan kesadaran lokasi ke aplikasi Anda dengan pelacakan lokasi otomatis, pembatasan wilayah, dan pengenalan aktivitas.

Tutorial ini menunjukkan cara menggunakan Layanan Lokasi di APP Anda untuk mendapatkan lokasi saat ini, mendapatkan pembaruan lokasi berkala, mencari alamat, dll.

Objek Lokasi

Itu LocationObjek mewakili lokasi geografis yang dapat terdiri dari garis lintang, garis bujur, cap waktu, dan informasi lain seperti arah, ketinggian, dan kecepatan. Ada metode penting berikut yang dapat Anda gunakan dengan objek Lokasi untuk mendapatkan informasi khusus lokasi -

Sr.No. Metode & Deskripsi
1

float distanceTo(Location dest)

Mengembalikan perkiraan jarak dalam meter antara lokasi ini dan lokasi yang ditentukan.

2

float getAccuracy()

Dapatkan perkiraan keakuratan lokasi ini, dalam meter.

3

double getAltitude()

Dapatkan ketinggian jika tersedia, dalam meter di atas permukaan laut.

4

float getBearing()

Dapatkan arahnya, dalam derajat.

5

double getLatitude()

Dapatkan lintang, dalam derajat.

6

double getLongitude()

Dapatkan garis bujur, dalam derajat.

7

float getSpeed()

Dapatkan kecepatan jika tersedia, dalam meter / detik di darat.

8

boolean hasAccuracy()

Benar jika lokasi ini memiliki akurasi.

9

boolean hasAltitude()

Benar jika lokasi ini memiliki ketinggian.

10

boolean hasBearing()

Benar jika lokasi ini memiliki arah.

11

boolean hasSpeed()

Benar jika lokasi ini memiliki kecepatan.

12

void reset()

Menghapus konten lokasi.

13

void setAccuracy(float accuracy)

Tetapkan perkiraan akurasi lokasi ini, meter.

14

void setAltitude(double altitude)

Atur ketinggiannya, dalam meter di atas permukaan laut.

15

void setBearing(float bearing)

Atur baring, dalam derajat.

16

void setLatitude(double latitude)

Atur lintang, dalam derajat.

17

void setLongitude(double longitude)

Tetapkan bujur, dalam derajat.

18

void setSpeed(float speed)

Atur kecepatannya, dalam meter / detik di atas tanah.

19

String toString()

Mengembalikan string yang berisi deskripsi singkat dan dapat dibaca manusia dari objek ini.

Dapatkan Lokasi Saat Ini

Untuk mendapatkan lokasi saat ini, buat klien lokasi yaitu LocationClient objek, hubungkan ke Layanan Lokasi menggunakan connect() metode, dan kemudian memanggilnya getLastLocation()metode. Metode ini mengembalikan lokasi terbaru dalam bentukLocationobjek yang berisi koordinat lintang dan bujur serta informasi lainnya seperti yang dijelaskan di atas. Untuk memiliki fungsionalitas berbasis lokasi dalam aktivitas Anda, Anda harus mengimplementasikan dua antarmuka -

  • GooglePlayServicesClient.ConnectionCallbacks
  • GooglePlayServicesClient.OnConnectionFailedListener

Antarmuka ini menyediakan metode callback penting berikut, yang perlu Anda implementasikan di kelas aktivitas Anda -

Sr.No. Metode & Deskripsi Callback
1

abstract void onConnected(Bundle connectionHint)

Metode panggilan balik ini dipanggil ketika layanan lokasi berhasil tersambung ke klien lokasi. Anda akan menggunakanconnect() metode untuk menyambung ke klien lokasi.

2

abstract void onDisconnected()

Metode panggilan balik ini dipanggil ketika klien terputus. Anda akan menggunakandisconnect() metode untuk memutuskan sambungan dari klien lokasi.

3

abstract void onConnectionFailed(ConnectionResult result)

Metode callback ini dipanggil ketika ada kesalahan saat menghubungkan klien ke layanan.

Anda harus membuat klien lokasi di onCreate() metode kelas aktivitas Anda, lalu hubungkan ke onStart(), sehingga Layanan Lokasi mempertahankan lokasi saat ini sementara aktivitas Anda terlihat sepenuhnya. Anda harus memutuskan klien di onStop()metode, sehingga ketika aplikasi Anda tidak terlihat, Layanan Lokasi tidak mempertahankan lokasi saat ini. Ini membantu dalam menghemat daya baterai hingga sebagian besar.

Dapatkan Lokasi yang Diperbarui

Jika Anda ingin memiliki pembaruan lokasi, selain dari antarmuka yang disebutkan di atas, Anda perlu menerapkannya LocationListenerantarmuka juga. Antarmuka ini menyediakan metode callback berikut, yang perlu Anda implementasikan di kelas aktivitas Anda -

Sr.No. Metode & Deskripsi Callback
1

abstract void onLocationChanged(Location location)

Metode panggilan balik ini digunakan untuk menerima pemberitahuan dari LocationClient ketika lokasi telah berubah.

Kualitas Layanan Lokasi

Itu LocationRequest objek digunakan untuk meminta kualitas layanan (QoS) untuk pembaruan lokasi dari LocationClient. Berikut adalah metode penyetel berguna yang dapat Anda gunakan untuk menangani QoS. Ada metode pengambil setara yang tersedia yang dapat Anda periksa di dokumentasi resmi Android.

Sr.No. Metode & Deskripsi
1

setExpirationDuration(long millis)

Setel durasi permintaan ini, dalam milidetik.

2

setExpirationTime(long millis)

Setel waktu kedaluwarsa permintaan, dalam milidetik sejak boot.

3

setFastestInterval(long millis)

Secara eksplisit menyetel interval tercepat untuk pembaruan lokasi, dalam milidetik.

4

setInterval(long millis)

Setel interval yang diinginkan untuk pembaruan lokasi aktif, dalam milidetik.

5

setNumUpdates(int numUpdates)

Setel jumlah pembaruan lokasi.

6

setPriority(int priority)

Tetapkan prioritas permintaan.

Sekarang misalnya, jika aplikasi Anda menginginkan lokasi dengan akurasi tinggi, aplikasi harus membuat permintaan lokasi dengan setPriority(int) setel ke PRIORITY_HIGH_ACCURACY dan setInterval(long)sampai 5 detik. Anda juga dapat menggunakan interval yang lebih besar dan / atau prioritas lain seperti PRIORITY_LOW_POWER untuk meminta akurasi tingkat "kota" atau PRIORITY_BALANCED_POWER_ACCURACY untuk akurasi tingkat "blok".

Aktivitas harus sangat mempertimbangkan untuk menghapus semua permintaan lokasi saat memasuki latar belakang (misalnya di onPause ()), atau setidaknya menukar permintaan ke interval yang lebih besar dan kualitas yang lebih rendah untuk menghemat konsumsi daya.

Menampilkan Alamat Lokasi

Setelah Anda memilikinya Location objek, Anda dapat menggunakan Geocoder.getFromLocation()metode untuk mendapatkan alamat untuk lintang dan bujur tertentu. Metode ini sinkron, dan mungkin membutuhkan waktu lama untuk melakukan tugasnya, jadi Anda harus memanggil metode daridoInBackground() metode dari sebuah AsyncTask kelas.

Itu AsyncTask harus menjadi subkelas untuk digunakan dan subkelas tersebut akan diganti doInBackground(Params...) metode untuk melakukan tugas di latar belakang dan onPostExecute(Result)metode dipanggil pada UI thread setelah komputasi latar belakang selesai dan pada saat menampilkan hasilnya. Ada satu metode penting yang tersedia di AyncTask yaituexecute(Params... params), metode ini menjalankan tugas dengan parameter yang ditentukan.

Contoh

Contoh berikut menunjukkan kepada Anda secara praktis cara menggunakan Layanan Lokasi di aplikasi Anda untuk mendapatkan lokasi saat ini dan alamat yang setara, dll.

Untuk bereksperimen dengan contoh ini, Anda memerlukan perangkat Seluler yang dilengkapi dengan OS Android terbaru, jika tidak, Anda harus berjuang dengan emulator yang mungkin tidak berfungsi.

Buat Aplikasi Android

Langkah Deskripsi
1 Anda akan menggunakan IDE studio Android untuk membuat aplikasi Android dan menamakannya Tutorialspoint di bawah paket com.example.tutorialspoint7.myapplication .
2 tambahkan file src / GPSTracker.java dan tambahkan kode yang diperlukan.
3 Ubah file src / MainActivity.java dan tambahkan kode yang diperlukan seperti yang ditunjukkan di bawah ini untuk berhati-hati dalam mendapatkan lokasi saat ini dan alamat yang setara.
4 Ubah layout file XML res / layout / activity_main.xml untuk menambahkan semua komponen GUI yang menyertakan tiga tombol dan dua tampilan teks untuk menunjukkan lokasi / alamat.
5 Ubah res / values ​​/ strings.xml untuk menentukan nilai konstan yang diperlukan
6 Ubah AndroidManifest.xml seperti yang ditunjukkan di bawah ini
7 Jalankan aplikasi untuk meluncurkan emulator Android dan verifikasi hasil perubahan yang dilakukan dalam aplikasi.

Berikut adalah konten file aktivitas utama yang dimodifikasi MainActivity.java.

package com.example.tutorialspoint7.myapplication;

import android.Manifest;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.test.mock.MockPackageManager;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

   Button btnShowLocation;
   private static final int REQUEST_CODE_PERMISSION = 2;
   String mPermission = Manifest.permission.ACCESS_FINE_LOCATION;

   // GPSTracker class
   GPSTracker gps;

   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
		
      try {
         if (ActivityCompat.checkSelfPermission(this, mPermission)
            != MockPackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(this, new String[]{mPermission}, 
               REQUEST_CODE_PERMISSION);

            // If any permission above not allowed by user, this condition will
               execute every time, else your else part will work
         }
      } catch (Exception e) {
         e.printStackTrace();
      }

      btnShowLocation = (Button) findViewById(R.id.button);

      // show location button click event
      btnShowLocation.setOnClickListener(new View.OnClickListener() {

         @Override
         public void onClick(View arg0) {
            // create class object
            gps = new GPSTracker(MainActivity.this);

            // check if GPS enabled
            if(gps.canGetLocation()){

               double latitude = gps.getLatitude();
               double longitude = gps.getLongitude();

               // \n is for new line
               Toast.makeText(getApplicationContext(), "Your Location is - \nLat: "
                  + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();
            }else{
               // can't get location
               // GPS or Network is not enabled
               // Ask user to enable GPS/network in settings
               gps.showSettingsAlert();
            }

         }
      });
   }
}

Berikut adalah konten file aktivitas utama yang dimodifikasi GPSTracker.java.

package com.example.tutorialspoint7.myapplication;

import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;
import android.util.Log;

public class GPSTracker extends Service implements LocationListener {

   private final Context mContext;

   // flag for GPS status
   boolean isGPSEnabled = false;

   // flag for network status
   boolean isNetworkEnabled = false;

   // flag for GPS status
   boolean canGetLocation = false;

   Location location; // location
   double latitude; // latitude
   double longitude; // longitude

   // The minimum distance to change Updates in meters
   private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters

   // The minimum time between updates in milliseconds
   private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute

   // Declaring a Location Manager
   protected LocationManager locationManager;

   public GPSTracker(Context context) {
      this.mContext = context;
      getLocation();
   }

   public Location getLocation() {
      try {
         locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);

         // getting GPS status
         isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

         // getting network status
         isNetworkEnabled = locationManager
            .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

         if (!isGPSEnabled && !isNetworkEnabled) {
            // no network provider is enabled
         } else {
            this.canGetLocation = true;
            // First get location from Network Provider
            if (isNetworkEnabled) {
               locationManager.requestLocationUpdates(
                  LocationManager.NETWORK_PROVIDER,
                  MIN_TIME_BW_UPDATES,
                  MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
						
               Log.d("Network", "Network");
               if (locationManager != null) {
                  location = locationManager
                     .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
							
                  if (location != null) {
                     latitude = location.getLatitude();
                     longitude = location.getLongitude();
                  }
               }
            }
				
            // if GPS Enabled get lat/long using GPS Services
            if (isGPSEnabled) {
               if (location == null) {
                  locationManager.requestLocationUpdates(
                     LocationManager.GPS_PROVIDER,
                     MIN_TIME_BW_UPDATES,
                     MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
							
                  Log.d("GPS Enabled", "GPS Enabled");
                  if (locationManager != null) {
                     location = locationManager
                        .getLastKnownLocation(LocationManager.GPS_PROVIDER);
								
                     if (location != null) {
                        latitude = location.getLatitude();
                        longitude = location.getLongitude();
                     }
                  }
               }
            }
         }

      } catch (Exception e) {
         e.printStackTrace();
      }

      return location;
   }

   /**
      * Stop using GPS listener
      * Calling this function will stop using GPS in your app
   * */
	
   public void stopUsingGPS(){
      if(locationManager != null){
         locationManager.removeUpdates(GPSTracker.this);
      }
   }

   /**
      * Function to get latitude
   * */
	
   public double getLatitude(){
      if(location != null){
         latitude = location.getLatitude();
      }

      // return latitude
      return latitude;
   }

   /**
      * Function to get longitude
   * */
	
   public double getLongitude(){
      if(location != null){
         longitude = location.getLongitude();
      }

      // return longitude
      return longitude;
   }

   /**
      * Function to check GPS/wifi enabled
      * @return boolean
   * */
	
   public boolean canGetLocation() {
      return this.canGetLocation;
   }

   /**
      * Function to show settings alert dialog
      * On pressing Settings button will lauch Settings Options
   * */
	
   public void showSettingsAlert(){
      AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);

      // Setting Dialog Title
      alertDialog.setTitle("GPS is settings");

      // Setting Dialog Message
      alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");

      // On pressing Settings button
      alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
         public void onClick(DialogInterface dialog,int which) {
            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            mContext.startActivity(intent);
         }
      });

      // on pressing cancel button
      alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
         public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
         }
      });

      // Showing Alert Message
      alertDialog.show();
   }

   @Override
   public void onLocationChanged(Location location) {
   }

   @Override
   public void onProviderDisabled(String provider) {
   }

   @Override
   public void onProviderEnabled(String provider) {
   }

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

   @Override
   public IBinder onBind(Intent arg0) {
      return null;
   }
}

Berikut akan menjadi konten res/layout/activity_main.xml file -

<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
   android:layout_width = "fill_parent"
   android:layout_height = "fill_parent"
   android:orientation = "vertical" >


   <Button
      android:id = "@+id/button"
      android:layout_width = "fill_parent"
      android:layout_height = "wrap_content"
      android:text = "getlocation"/>

</LinearLayout>

Berikut akan menjadi konten res/values/strings.xml untuk mendefinisikan dua konstanta baru -

<?xml version = "1.0" encoding = "utf-8"?>
<resources>
   <string name = "app_name">Tutorialspoint</string>
</resources>

Berikut ini adalah konten default dari AndroidManifest.xml -

<?xml version = "1.0" encoding = "utf-8"?>
<manifest xmlns:android = "http://schemas.android.com/apk/res/android"
   package = "com.example.tutorialspoint7.myapplication">
   <uses-permission android:name = "android.permission.ACCESS_FINE_LOCATION" />
   <uses-permission android:name = "android.permission.INTERNET" />
   <application
      android:allowBackup = "true"
      android:icon = "@mipmap/ic_launcher"
      android:label = "@string/app_name"
      android:supportsRtl = "true"
      android:theme = "@style/AppTheme">
		
      <activity android:name = ".MainActivity">
         <intent-filter>
            <action android:name = "android.intent.action.MAIN" />

            <category android:name = "android.intent.category.LAUNCHER" />
         </intent-filter>
      </activity>
   </application>

</manifest>

Ayo coba jalankan Tutorialspointaplikasi. Saya berasumsi bahwa, Anda telah menghubungkan perangkat Seluler Android Anda yang sebenarnya dengan komputer Anda. Untuk menjalankan aplikasi dari Android Studio, buka salah satu file aktivitas proyek Anda dan klik

ikon Run dari toolbar. Sebelum memulai aplikasi Anda, penginstal Android studio akan menampilkan jendela berikut untuk memilih opsi tempat Anda ingin menjalankan aplikasi Android Anda.

Sekarang untuk melihat lokasi pilih Get Location Button yang akan menampilkan informasi lokasi sebagai berikut -