Bagikan melalui


Layanan lokasi di Android

Panduan ini memperkenalkan kesadaran lokasi di aplikasi Android dan menggambarkan cara mendapatkan lokasi pengguna menggunakan ANDROID Location Service API, serta penyedia lokasi yang menyatu yang tersedia dengan GOOGLE Location Services API.

Android menyediakan akses ke berbagai teknologi lokasi seperti lokasi menara sel, Wi-Fi, dan GPS. Detail setiap teknologi lokasi diabstraksi melalui penyedia lokasi, memungkinkan aplikasi untuk mendapatkan lokasi dengan cara yang sama terlepas dari penyedia yang digunakan. Panduan ini memperkenalkan penyedia lokasi yang menyatu, bagian dari Layanan Google Play, yang secara cerdas menentukan cara terbaik untuk mendapatkan lokasi perangkat berdasarkan penyedia apa yang tersedia dan bagaimana perangkat digunakan. Android Location Service API dan menunjukkan cara berkomunikasi dengan layanan lokasi sistem menggunakan LocationManager. Bagian kedua dari panduan ini menjelajahi ANDROID Location Services API menggunakan LocationManager.

Sebagai aturan umum praktis, aplikasi harus lebih suka menggunakan penyedia lokasi yang menyatu, mengembalikan API Layanan Lokasi Android yang lebih lama hanya jika perlu.

Dasar-dasar lokasi

Di Android, apa pun API yang Anda pilih untuk bekerja dengan data lokasi, beberapa konsep tetap sama. Bagian ini memperkenalkan Penyedia Lokasi dan izin terkait lokasi.

Penyedia lokasi

Beberapa teknologi digunakan secara internal untuk menentukan lokasi pengguna. Perangkat keras yang digunakan tergantung pada jenis penyedia lokasi yang dipilih untuk pekerjaan mengumpulkan data. Android menggunakan tiga penyedia lokasi:

  • Penyedia GPS – GPS memberikan lokasi yang paling akurat, menggunakan daya terbanyak, dan berfungsi paling baik di luar ruangan. Penyedia ini menggunakan kombinasi GPS dan GPS terbantu (aGPS), yang mengembalikan data GPS yang dikumpulkan oleh menara seluler.

  • Penyedia Jaringan – Menyediakan kombinasi data WiFi dan Seluler, termasuk data aGPS yang dikumpulkan oleh menara sel. Ini menggunakan lebih sedikit daya daripada Penyedia GPS, tetapi mengembalikan data lokasi dengan akurasi yang bervariasi.

  • Penyedia Pasif – Opsi "piggyback" menggunakan penyedia yang diminta oleh aplikasi atau Layanan lain untuk menghasilkan data lokasi dalam aplikasi. Ini adalah opsi yang kurang andal tetapi hemat daya ideal untuk aplikasi yang tidak memerlukan pembaruan lokasi konstan untuk bekerja.

Penyedia lokasi tidak selalu tersedia. Misalnya, kita mungkin ingin menggunakan GPS untuk aplikasi kita, tetapi GPS mungkin dimatikan di Pengaturan, atau perangkat mungkin tidak memiliki GPS sama sekali. Jika penyedia tertentu tidak tersedia, memilih penyedia tersebut mungkin mengembalikan null.

Izin lokasi

Aplikasi yang sadar lokasi memerlukan akses sensor perangkat keras untuk menerima GPS, Wi-Fi, dan data seluler. Akses dikontrol melalui izin yang sesuai dalam Manifes Android aplikasi. Ada dua izin yang tersedia - tergantung pada persyaratan aplikasi Anda dan pilihan API Anda, Anda ingin mengizinkannya:

  • ACCESS_FINE_LOCATION – Memungkinkan akses aplikasi ke GPS. Diperlukan untuk opsi Penyedia GPS dan Penyedia Pasif (Penyedia Pasif memerlukan izin untuk mengakses data GPS yang dikumpulkan oleh aplikasi atau Layanan lain). Izin opsional untuk Penyedia Jaringan.

  • ACCESS_COARSE_LOCATION – Memungkinkan akses aplikasi ke lokasi Seluler dan Wi-Fi. Diperlukan untuk Penyedia Jaringan jika ACCESS_FINE_LOCATION tidak diatur.

Untuk aplikasi yang menargetkan API versi 21 (Android 5.0 Lollipop) atau yang lebih tinggi, Anda dapat mengaktifkan ACCESS_FINE_LOCATION dan masih berjalan di perangkat yang tidak memiliki perangkat keras GPS. Jika aplikasi Anda memerlukan perangkat keras GPS, Anda harus secara eksplisit menambahkan android.hardware.location.gpsuses-feature elemen ke Manifes Android. Untuk informasi selengkapnya, lihat referensi elemen fitur penggunaan Android.

Untuk mengatur izin, perluas folder Properti di Pad Solusi dan klik dua kali AndroidManifest.xml. Izin akan dicantumkan di bawah Izin yang Diperlukan:

Cuplikan layar pengaturan Izin yang Diperlukan Manifes Android

Mengatur salah satu izin ini memberi tahu Android bahwa aplikasi Anda memerlukan izin dari pengguna untuk mengakses ke penyedia lokasi. Perangkat yang menjalankan API level 22 (Android 5.1) atau yang lebih rendah akan meminta pengguna untuk memberikan izin ini setiap kali aplikasi diinstal. Pada perangkat yang menjalankan API level 23 (Android 6.0) atau yang lebih tinggi, aplikasi harus melakukan pemeriksaan izin run-time sebelum membuat permintaan penyedia lokasi.

Catatan

Catatan: Pengaturan ACCESS_FINE_LOCATION menyiratkan akses ke data lokasi kasar dan halus. Anda seharusnya tidak perlu mengatur kedua izin, hanya izin minimal yang diperlukan aplikasi Anda untuk bekerja.

Cuplikan ini adalah contoh cara memeriksa apakah aplikasi memiliki izin untuk ACCESS_FINE_LOCATION izin:

 if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.AccessFineLocation) == Permission.Granted)
{
    StartRequestingLocationUpdates();
    isRequestingLocationUpdates = true;
}
else
{
    // The app does not have permission ACCESS_FINE_LOCATION 
}

Aplikasi harus toleran terhadap skenario di mana pengguna tidak akan memberikan izin (atau telah mencabut izin) dan memiliki cara untuk menangani situasi tersebut dengan baik. Silakan lihat Panduan izin untuk detail selengkapnya tentang menerapkan pemeriksaan izin run-time di Xamarin.Android.

Menggunakan penyedia lokasi yang menyatu

Penyedia lokasi yang menyatu adalah cara yang disukai bagi aplikasi Android untuk menerima pembaruan lokasi dari perangkat karena akan secara efisien memilih penyedia lokasi selama run time untuk memberikan informasi lokasi terbaik dengan cara yang hemat baterai. Misalnya, pengguna yang berjalan-jalan di luar ruangan mendapatkan pembacaan lokasi terbaik dengan GPS. Jika pengguna kemudian berjalan di dalam ruangan, di mana GPS bekerja dengan buruk (jika sama sekali), penyedia lokasi yang menyatu dapat secara otomatis beralih ke WiFi, yang bekerja lebih baik di dalam ruangan.

API penyedia lokasi yang menyatu menyediakan berbagai alat lain untuk memberdayakan aplikasi yang sadar lokasi, termasuk geofencing dan pemantauan aktivitas. Di bagian ini, kita akan fokus pada dasar-dasar menyiapkan LocationClient, membangun penyedia, dan mendapatkan lokasi pengguna.

Penyedia lokasi yang menyatu adalah bagian dari Layanan Google Play. Paket Layanan Google Play harus diinstal dan dikonfigurasi dengan benar dalam aplikasi agar API penyedia lokasi yang menyatu berfungsi, dan perangkat harus menginstal APK Layanan Google Play.

Sebelum aplikasi Xamarin.Android dapat menggunakan penyedia lokasi yang menyatu, aplikasi harus menambahkan paket Xamarin.GooglePlayServices.Location ke proyek. Selain itu, pernyataan berikut using harus ditambahkan ke file sumber apa pun yang mereferensikan kelas yang dijelaskan di bawah ini:

using Android.Gms.Common;
using Android.Gms.Location;

Memeriksa apakah Layanan Google Play diinstal

Xamarin.Android akan mengalami crash jika mencoba menggunakan penyedia lokasi yang menyatu saat Layanan Google Play tidak diinstal (atau kedaluarsa) maka pengecualian runtime akan terjadi. Jika Layanan Google Play tidak diinstal, aplikasi harus kembali ke Layanan Lokasi Android yang dibahas di atas. Jika Google Play Services sudah kedaluarsa, aplikasi dapat menampilkan pesan kepada pengguna yang meminta mereka untuk memperbarui versi Google Play Services yang diinstal.

Cuplikan ini adalah contoh bagaimana Aktivitas Android dapat secara terprogram memeriksa apakah Google Play Services diinstal:

bool IsGooglePlayServicesInstalled()
{
    var queryResult = GoogleApiAvailability.Instance.IsGooglePlayServicesAvailable(this);
    if (queryResult == ConnectionResult.Success)
    {
        Log.Info("MainActivity", "Google Play Services is installed on this device.");
        return true;
    }

    if (GoogleApiAvailability.Instance.IsUserResolvableError(queryResult))
    {
        // Check if there is a way the user can resolve the issue
        var errorString = GoogleApiAvailability.Instance.GetErrorString(queryResult);
        Log.Error("MainActivity", "There is a problem with Google Play Services on this device: {0} - {1}",
                  queryResult, errorString);

        // Alternately, display the error to the user.
    }

    return false;
}

FusedLocationProviderClient

Untuk berinteraksi dengan penyedia lokasi yang menyatu, aplikasi Xamarin.Android harus memiliki instans FusedLocationProviderClient. Kelas ini mengekspos metode yang diperlukan untuk berlangganan pembaruan lokasi dan untuk mengambil lokasi perangkat terakhir yang diketahui.

Metode OnCreate Aktivitas adalah tempat yang cocok untuk mendapatkan referensi ke FusedLocationProviderClient, seperti yang ditunjukkan dalam cuplikan kode berikut:

public class MainActivity: AppCompatActivity
{
    FusedLocationProviderClient fusedLocationProviderClient;

    protected override void OnCreate(Bundle bundle) 
    {
        fusedLocationProviderClient = LocationServices.GetFusedLocationProviderClient(this);
    }
}

Mendapatkan lokasi terakhir yang diketahui

Metode ini FusedLocationProviderClient.GetLastLocationAsync() menyediakan cara sederhana dan non-pemblokiran bagi aplikasi Xamarin.Android untuk dengan cepat mendapatkan lokasi perangkat terakhir yang diketahui dengan overhead pengodean minimal.

Cuplikan ini menunjukkan cara menggunakan GetLastLocationAsync metode untuk mengambil lokasi perangkat:

async Task GetLastLocationFromDevice()
{
    // This method assumes that the necessary run-time permission checks have succeeded.
    getLastLocationButton.SetText(Resource.String.getting_last_location);
    Android.Locations.Location location = await fusedLocationProviderClient.GetLastLocationAsync();

    if (location == null)
    {
        // Seldom happens, but should code that handles this scenario
    }
    else
    {
        // Do something with the location 
        Log.Debug("Sample", "The latitude is " + location.Latitude);
    }
}

Berlangganan pembaruan lokasi

Aplikasi Xamarin.Android juga dapat berlangganan pembaruan lokasi dari penyedia lokasi yang menyatu menggunakan metode , seperti yang FusedLocationProviderClient.RequestLocationUpdatesAsync ditunjukkan dalam cuplikan kode ini:

await fusedLocationProviderClient.RequestLocationUpdatesAsync(locationRequest, locationCallback);

Metode ini mengambil dua parameter:

  • Android.Gms.Location.LocationRequest – Objek LocationRequest adalah bagaimana aplikasi Xamarin.Android meneruskan parameter tentang cara kerja penyedia lokasi yang menyatu. Informasi LocationRequest penahanan seperti seberapa sering permintaan harus dibuat atau seberapa penting pembaruan lokasi yang akurat. Misalnya, permintaan lokasi penting akan menyebabkan perangkat menggunakan GPS, dan akibatnya lebih banyak daya, saat menentukan lokasi. Cuplikan kode ini menunjukkan cara membuat LocationRequest untuk lokasi dengan akurasi tinggi, memeriksa sekitar setiap lima menit untuk pembaruan lokasi (tetapi tidak lebih cepat dari dua menit di antara permintaan). Penyedia lokasi yang menyatu akan menggunakan LocationRequest sebagai panduan untuk digunakan penyedia lokasi mana saat mencoba menentukan lokasi perangkat:

    LocationRequest locationRequest = new LocationRequest()
                                      .SetPriority(LocationRequest.PriorityHighAccuracy)
                                      .SetInterval(60 * 1000 * 5)
                                      .SetFastestInterval(60 * 1000 * 2);
    
  • Android.Gms.Location.LocationCallback – Untuk menerima pembaruan lokasi, aplikasi Xamarin.Android harus subkelas LocationProvider kelas abstrak. Kelas ini mengekspos dua metode yang mungkin dipanggil oleh penyedia lokasi yang menyatu untuk memperbarui aplikasi dengan informasi lokasi. Ini akan dibahas secara lebih rinci di bawah ini.

Untuk memberi tahu aplikasi Xamarin.Android tentang pembaruan lokasi, penyedia lokasi yang menyatu akan memanggil LocationCallBack.OnLocationResult(LocationResult result). Parameter Android.Gms.Location.LocationResult akan berisi informasi lokasi pembaruan.

Ketika penyedia lokasi yang menyatu mendeteksi perubahan ketersediaan data lokasi, penyedia lokasi akan memanggil metode .LocationProvider.OnLocationAvailability(LocationAvailability locationAvailability) LocationAvailability.IsLocationAvailable Jika properti mengembalikan , maka dapat diasumsikan truebahwa hasil lokasi perangkat yang dilaporkan oleh OnLocationResult seakurat dan terbaru seperti yang diperlukan oleh LocationRequest. Jika IsLocationAvailable false, maka tidak ada hasil lokasi yang akan dikembalikan oleh OnLocationResult.

Cuplikan kode ini adalah implementasi LocationCallback sampel objek:

public class FusedLocationProviderCallback : LocationCallback
{
    readonly MainActivity activity;

    public FusedLocationProviderCallback(MainActivity activity)
    {
        this.activity = activity;
    }

    public override void OnLocationAvailability(LocationAvailability locationAvailability)
    {
        Log.Debug("FusedLocationProviderSample", "IsLocationAvailable: {0}",locationAvailability.IsLocationAvailable);
    }

    public override void OnLocationResult(LocationResult result)
    {
        if (result.Locations.Any())
        {
            var location = result.Locations.First();
            Log.Debug("Sample", "The latitude is :" + location.Latitude);
        }
        else
        {
            // No locations to work with.
        }
    }
}

Menggunakan API Layanan Lokasi Android

Layanan Lokasi Android adalah API yang lebih lama untuk menggunakan informasi lokasi di Android. Data lokasi dikumpulkan oleh sensor perangkat keras dan dikumpulkan oleh layanan sistem, yang diakses dalam aplikasi dengan LocationManager kelas dan ILocationListener.

Layanan Lokasi paling cocok untuk aplikasi yang harus berjalan pada perangkat yang tidak menginstal Layanan Google Play.

Layanan Lokasi adalah jenis layanan khusus yang dikelola oleh Sistem. Layanan Sistem berinteraksi dengan perangkat keras perangkat dan selalu berjalan. Untuk memanfaatkan pembaruan lokasi di aplikasi kami, kami akan berlangganan pembaruan lokasi dari Layanan Lokasi sistem menggunakan LocationManager dan RequestLocationUpdates panggilan.

Untuk mendapatkan lokasi pengguna menggunakan Layanan Lokasi Android melibatkan beberapa langkah:

  1. Dapatkan referensi ke LocationManager layanan.
  2. Terapkan ILocationListener antarmuka dan tangani peristiwa saat lokasi berubah.
  3. LocationManager Gunakan untuk meminta pembaruan lokasi untuk penyedia tertentu. Dari ILocationListener langkah sebelumnya akan digunakan untuk menerima panggilan balik dari LocationManager.
  4. Hentikan pembaruan lokasi ketika aplikasi tidak lagi sesuai untuk menerima pembaruan.

Manajer Lokasi

Kita dapat mengakses layanan lokasi sistem dengan instans LocationManager kelas. LocationManager adalah kelas khusus yang memungkinkan kita berinteraksi dengan layanan lokasi sistem dan memanggil metode di atasnya. Aplikasi bisa mendapatkan referensi ke dengan memanggil GetSystemService dan meneruskan jenis Layanan, seperti yang LocationManager ditunjukkan di bawah ini:

LocationManager locationManager = (LocationManager) GetSystemService(Context.LocationService);

OnCreate adalah tempat yang baik untuk mendapatkan referensi ke LocationManager. Ada baiknya untuk menyimpan LocationManager sebagai variabel kelas, sehingga kita dapat memanggilnya di berbagai titik dalam siklus hidup Aktivitas.

Meminta pembaruan lokasi dari LocationManager

Setelah aplikasi memiliki referensi ke LocationManager, aplikasi perlu memberi tahu LocationManager jenis informasi lokasi apa yang diperlukan, dan seberapa sering informasi tersebut akan diperbarui. Lakukan ini dengan memanggil RequestLocationUpdatesLocationManager objek, dan meneruskan beberapa kriteria untuk pembaruan dan panggilan balik yang akan menerima pembaruan lokasi. Panggilan balik ini adalah jenis yang harus mengimplementasikan ILocationListener antarmuka (dijelaskan secara lebih rinci nanti dalam panduan ini).

Metode ini RequestLocationUpdates memberi tahu Layanan lokasi sistem bahwa aplikasi Anda ingin mulai menerima pembaruan lokasi. Metode ini memungkinkan Anda menentukan penyedia, serta ambang waktu dan jarak untuk mengontrol frekuensi pembaruan. Misalnya, metode di bawah ini meminta pembaruan lokasi dari penyedia lokasi GPS setiap 2000 milidetik, dan hanya ketika lokasi berubah lebih dari 1 meter:

// For this example, this method is part of a class that implements ILocationListener, described below
locationManager.RequestLocationUpdates(LocationManager.GpsProvider, 2000, 1, this);

Aplikasi harus meminta pembaruan lokasi hanya sesering yang diperlukan agar aplikasi berkinerja baik. Ini mempertahankan masa pakai baterai dan menciptakan pengalaman yang lebih baik bagi pengguna.

Menanggapi pembaruan dari LocationManager

Setelah aplikasi meminta pembaruan dari LocationManager, aplikasi dapat menerima informasi dari Layanan dengan menerapkan ILocationListener antarmuka. Antarmuka ini menyediakan empat metode untuk mendengarkan Layanan lokasi dan penyedia lokasi, OnLocationChanged. Sistem akan memanggil OnLocationChanged ketika lokasi pengguna cukup berubah untuk memenuhi syarat sebagai perubahan lokasi sesuai dengan Kriteria yang ditetapkan saat meminta pembaruan lokasi.

Kode berikut menunjukkan metode dalam ILocationListener antarmuka:

public class MainActivity : AppCompatActivity, ILocationListener
{
    TextView latitude;
    TextView longitude;
    
    public void OnLocationChanged (Location location)
    {
        // called when the location has been updated.
    }
    
    public OnProviderDisabled(string locationProvider)
    {
        // called when the user disables the provider
    }
    
    public OnProviderEnabled(string locationProvider)
    {
        // called when the user enables the provider
    }
    
    public OnStatusChanged(string locationProvider, Availability status, Bundle extras)
    {
        // called when the status of the provider changes (there are a variety of reasons for this)
    }
}

Berhenti berlangganan pembaruan LocationManager

Untuk menghemat sumber daya sistem, aplikasi harus berhenti berlangganan pembaruan lokasi sesegera mungkin. Metode ini RemoveUpdates memberi tahu LocationManager untuk berhenti mengirim pembaruan ke aplikasi kami. Sebagai contoh, Aktivitas dapat memanggil RemoveUpdates dalam OnPause metode sehingga kami dapat menghemat daya jika aplikasi tidak memerlukan pembaruan lokasi saat Aktivitasnya tidak ada di layar:

protected override void OnPause ()
{
    base.OnPause ();
    locationManager.RemoveUpdates (this);
}

Jika aplikasi Anda perlu mendapatkan pembaruan lokasi saat berada di latar belakang, Anda harus membuat Layanan kustom yang berlangganan sistem Layanan Lokasi. Lihat panduan Latar Belakang dengan Layanan Android untuk informasi selengkapnya.

Menentukan penyedia lokasi terbaik untuk LocationManager

Aplikasi di atas menetapkan GPS sebagai penyedia lokasi. Namun, GPS mungkin tidak tersedia dalam semua kasus, seperti jika perangkat berada di dalam ruangan atau tidak memiliki penerima GPS. Jika demikian, hasilnya adalah pengembalian null untuk Penyedia.

Untuk membuat aplikasi Anda berfungsi saat GPS tidak tersedia, Anda menggunakan GetBestProvider metode untuk meminta penyedia lokasi terbaik yang tersedia (didukung perangkat dan diaktifkan pengguna) saat peluncuran aplikasi. Alih-alih meneruskan penyedia tertentu, Anda dapat memberi tahu GetBestProvider persyaratan untuk penyedia - seperti akurasi dan daya - dengan Criteria objek. GetBestProvider mengembalikan penyedia terbaik untuk Kriteria yang diberikan.

Kode berikut menunjukkan cara mendapatkan penyedia terbaik yang tersedia dan menggunakannya saat meminta pembaruan lokasi:

Criteria locationCriteria = new Criteria();   
locationCriteria.Accuracy = Accuracy.Coarse;
locationCriteria.PowerRequirement = Power.Medium;

locationProvider = locationManager.GetBestProvider(locationCriteria, true);

if(locationProvider != null)
{
    locationManager.RequestLocationUpdates (locationProvider, 2000, 1, this);
}
else
{
    Log.Info(tag, "No location providers available");
}

Catatan

Jika pengguna telah menonaktifkan semua penyedia lokasi, GetBestProvider akan mengembalikan null. Untuk melihat cara kerja kode ini pada perangkat nyata, pastikan untuk mengaktifkan GPS, Wi-Fi, dan jaringan seluler di bawah Mode Lokasi > google Pengaturan > seperti yang ditunjukkan pada cuplikan layar ini:

layar Mode Lokasi Pengaturan di ponsel Android

Cuplikan layar di bawah ini menunjukkan aplikasi lokasi yang berjalan menggunakan GetBestProvider:

Aplikasi GetBestProvider menampilkan garis lintang, bujur, dan penyedia

Perlu diingat bahwa GetBestProvider tidak mengubah penyedia secara dinamis. Sebaliknya, ini menentukan penyedia terbaik yang tersedia sekali selama siklus hidup Aktivitas. Jika status penyedia berubah setelah ditetapkan, aplikasi akan memerlukan kode tambahan dalam ILocationListener metode - OnProviderEnabled, OnProviderDisabled, dan OnStatusChanged - untuk menangani setiap kemungkinan yang terkait dengan pengalihan penyedia.

Ringkasan

Panduan ini mencakup mendapatkan lokasi pengguna menggunakan Layanan Lokasi Android dan penyedia lokasi yang menyatu dari Google Location Services API.