Bagaimana cara menampilkan dialog mengaktifkan lokasi seperti Google maps?

129

Saya menggunakan versi terbaru Google Play Services (7.0) dan mengikuti langkah-langkah yang diberikan dalam panduan mereka dan saya mengaktifkan dialog lokasi seperti di bawah ini, yang memiliki tombol "tidak pernah". Aplikasi saya membutuhkan lokasi dengan wajib, jadi saya tidak ingin menunjukkan "tidak pernah" kepada pengguna, karena begitu pengguna mengklik "tidak pernah", saya sama sekali tidak bisa mendapatkan lokasi atau meminta lokasi lagi.

Dimana Google Maps hanya memiliki tombol ya dan tidak tanpa tombol, tahu bagaimana cara mencapai yang sama?

Gambar aplikasi saya masukkan deskripsi gambar di sini

Gambar Google Map masukkan deskripsi gambar di sini

Mufri A
sumber

Jawaban:

149

LocationSettingsRequest.Builder memiliki metode setAlwaysShow(boolean show). Sementara dokumen menunjukkan saat ini tidak melakukan apa-apa (diperbarui 2015-07-05: dokumentasi Google yang diperbarui telah menghapus kata-kata ini), pengaturan builder.setAlwaysShow(true);akan memungkinkan perilaku Google Maps: masukkan deskripsi gambar di sini

Berikut kode yang membuatnya berfungsi:

if (googleApiClient == null) {
    googleApiClient = new GoogleApiClient.Builder(getActivity())
            .addApi(LocationServices.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this).build();
    googleApiClient.connect();

    LocationRequest locationRequest = LocationRequest.create();
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationRequest.setInterval(30 * 1000);
    locationRequest.setFastestInterval(5 * 1000);
    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
            .addLocationRequest(locationRequest);

    //**************************
    builder.setAlwaysShow(true); //this is the key ingredient
    //**************************

    PendingResult<LocationSettingsResult> result =
            LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build());
    result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
        @Override
        public void onResult(LocationSettingsResult result) {
            final Status status = result.getStatus();
            final LocationSettingsStates state = result.getLocationSettingsStates();
            switch (status.getStatusCode()) {
                case LocationSettingsStatusCodes.SUCCESS:
                    // All location settings are satisfied. The client can initialize location
                    // requests here.
                    break;
                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                    // Location settings are not satisfied. But could be fixed by showing the user
                    // a dialog.
                    try {
                        // Show the dialog by calling startResolutionForResult(),
                        // and check the result in onActivityResult().
                        status.startResolutionForResult(
                                getActivity(), 1000);
                    } catch (IntentSender.SendIntentException e) {
                        // Ignore the error.
                    }
                    break;
                case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                    // Location settings are not satisfied. However, we have no way to fix the
                    // settings so we won't show the dialog.
                    break;
            }
        }
    });
}

Dari Dokumentasi Android

Untuk Kotlin lihat di sini: https://stackoverflow.com/a/61868985/12478830

Kai
sumber
1
@ MarianPaździoch cukup yakin Anda tidak perlu, karena kode sampel Google sendiri di SettingsApi tidak memerlukannya.
Kai
1
@ Kai Ya, kode ini tidak dimodifikasi pada Nexus 5. Menggunakan Log, saya melihat bahwa ketika layanan lokasi pada awalnya mati, selalu mengenai RESOLUTION_REQUIRED. Kemudian, setelah saya menerima dan mengaktifkan lokasi, itu hits SUCCESS, dan sepenuhnya melompat onActivityResult(). Menekan Noatau kembali membuat dialog menghilang sebentar, lalu muat ulang dan tekan RESOLUTION_REQUIREDlagi. Satu-satunya cara untuk menyingkirkan dialog adalah dengan menerima, atau menutup dan membuka kembali aplikasi.
pez
2
@ pez diuji pada Galaxy S4 dengan layanan Google Play 7.5.74 dan berfungsi, pembatalan tidak menyebabkan RESOLUTION_REQUIRED dipanggil. Saran saya adalah memperbarui layanan bermain dan coba lagi. Jika itu gagal, mulailah pertanyaan StackOverflow baru untuk melihat apakah orang lain telah menemukan dan menyelesaikan masalah ini.
Kai
2
@ Kai itu bekerja untuk saya tetapi bagaimana jika pengguna menekan no. Bagaimana menampilkan dialog lagi atau menambahkan beberapa kode di sana jika ditekan no. Setiap bantuan akan sangat dihargai.
Gurpreet singh
1
CATATAN: Aktivitas Anda launchModeTIDAK dapat diatur ke singleInstancesebaliknya ini TIDAK akan bekerja. Dialog tidak akan pernah muncul dan onActivityResultakan dipanggil secara otomatis. JANGAN PUNYA android:launchMode="singleInstance"aktivitas Anda di AndroidManifest. Saya belajar cara yang sangat sulit ini setelah 3 jam
ᴛʜᴇᴘᴀᴛᴇʟ
55

Saya ingin menambahkan beberapa perubahan pada jawaban kai bagi mereka yang mencari penanganan tombol Ya / Tidak.

Nyatakan konstanta ini dalam aktivitas Anda

protected static final int REQUEST_CHECK_SETTINGS = 0x1;

panggil settingsrequest()di onStart Anda ()

public void settingsrequest()
    {
        LocationRequest locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationRequest.setInterval(30 * 1000);
        locationRequest.setFastestInterval(5 * 1000);
        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                .addLocationRequest(locationRequest);
        builder.setAlwaysShow(true); //this is the key ingredient

        PendingResult<LocationSettingsResult> result =
                LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build());
        result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
            @Override
            public void onResult(LocationSettingsResult result) {
                final Status status = result.getStatus();
                final LocationSettingsStates state = result.getLocationSettingsStates();
                switch (status.getStatusCode()) {
                    case LocationSettingsStatusCodes.SUCCESS:
                        // All location settings are satisfied. The client can initialize location
                        // requests here.
                        break;
                    case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                        // Location settings are not satisfied. But could be fixed by showing the user
                        // a dialog.
                        try {
                            // Show the dialog by calling startResolutionForResult(),
                            // and check the result in onActivityResult().
                            status.startResolutionForResult(MainActivity.this, REQUEST_CHECK_SETTINGS);
                        } catch (IntentSender.SendIntentException e) {
                            // Ignore the error.
                        }
                        break;
                    case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                        // Location settings are not satisfied. However, we have no way to fix the
                        // settings so we won't show the dialog.
                        break;
                }
            }
        });
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
// Check for the integer request code originally supplied to startResolutionForResult().
            case REQUEST_CHECK_SETTINGS:
                switch (resultCode) {
                    case Activity.RESULT_OK:
                        startLocationUpdates();
                        break;
                    case Activity.RESULT_CANCELED:
                        settingsrequest();//keep asking if imp or do whatever
                        break;
                }
                break;
        }
    }
Veer3383
sumber
1
dapatkan dari dokumentasi resmi: developers.google.com/android/reference/com/google/android/gms/… jika Anda perlu menambahkan peta saja, untuk menggunakan ini, Anda harus menambahkan perpustakaan tersebut (tanpa mengimpor seluruh perpustakaan layanan bermain) ): compile 'com.google.android.gms: play-services-maps: 9.0.2' compile 'com.google.android.gms: play-services-location: 9.0.2'
MatPag
bagaimana menangani acara klik dari dialog ini dan saya tidak boleh memperlihatkan tombol tidak pernah dalam dialog
M.Yogeshwaran
hapus baris settingsrequest () dari sakelar pada ActivityOnResult .. Itukah yang Anda tanyakan ???
Veer3383
Jika saya mengklik tidak ada tombol dialog masih dialog itu datang terus menerus .. Saya sudah menghapus barisrequestre () dari switch case di ActivityOnResult .. lalu mengapa itu ditampilkan terus menerus?
Asmi
Mungkin Anda perlu membersihkan membangun proyek.
Veer3383
25

LocationServices.SettingsApi sudah ditinggalkan sekarang, Jadi Kami menggunakan SettingsClient

    LocationRequest mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(10);
        mLocationRequest.setSmallestDisplacement(10);
        mLocationRequest.setFastestInterval(10);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        LocationSettingsRequest.Builder builder = new 
        LocationSettingsRequest.Builder();
        builder.addLocationRequest(mLocationRequest);

Kemudian periksa apakah pengaturan lokasi saat ini puas. Buat tugas LocationSettingsResponse:

        Task<LocationSettingsResponse> task=LocationServices.getSettingsClient(this).checkLocationSettings(builder.build());

Kemudian tambahkan Listener

task.addOnCompleteListener(new OnCompleteListener<LocationSettingsResponse>() {
            @Override
                    public void onComplete(Task<LocationSettingsResponse> task) {
                        try {
                            LocationSettingsResponse response = task.getResult(ApiException.class);
                            // All location settings are satisfied. The client can initialize location
                            // requests here.

                        } catch (ApiException exception) {
                            switch (exception.getStatusCode()) {
                                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                                    // Location settings are not satisfied. But could be fixed by showing the
                                    // user a dialog.
                                    try {
                                        // Cast to a resolvable exception.
                                        ResolvableApiException resolvable = (ResolvableApiException) exception;
                                        // Show the dialog by calling startResolutionForResult(),
                                        // and check the result in onActivityResult().
                                        resolvable.startResolutionForResult(
                                                HomeActivity.this,
                                                101);
                                    } catch (IntentSender.SendIntentException e) {
                                        // Ignore the error.
                                    } catch (ClassCastException e) {
                                        // Ignore, should be an impossible error.
                                    }
                                    break;
                                case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                                    // Location settings are not satisfied. However, we have no way to fix the
                                    // settings so we won't show the dialog.
                                    break;
                            }
                        }
                    }
                });

Ditambahkan padaActivityResult

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        final LocationSettingsStates states = LocationSettingsStates.fromIntent(data);
        switch (requestCode) {
            case 101:
                switch (resultCode) {
                    case Activity.RESULT_OK:
                        // All required changes were successfully made
                        Toast.makeText(HomeActivity.this,states.isLocationPresent()+"",Toast.LENGTH_SHORT).show();
                        break;
                    case Activity.RESULT_CANCELED:
                        // The user was asked to change settings, but chose not to
                        Toast.makeText(HomeActivity.this,"Canceled",Toast.LENGTH_SHORT).show();
                        break;
                    default:
                        break;
                }
                break;
        }
    }

Lihat tautan SettingsClient

Arul Pandian
sumber
1
Periksa stackoverflow.com/a/53277287 @BadLoser Menggunakan SettingsClient
Ketan Ramani
Apa nama ketergantungan yang akan diimpor? Tidak dapat menyelesaikan simbol Tugas.
Denis
Saya menemukannya: implementasi 'com.google.android.gms: bermain-layanan-tugas: 16.0.1'
Denis
@Denis, saya bisa menggunakannya implementation 'com.google.android.gms:play-services-location:16.0.0'.
CoolMind
25

Kerjanya mirip dengan google maps?
Kode Sumber: https://drive.google.com/open?id=0BzBKpZ4nzNzUOXM2eEhHM3hOZk0

Tambahkan Ketergantungan dalam file build.gradle:

compile 'com.google.android.gms:play-services:8.3.0'

ATAU

compile 'com.google.android.gms:play-services-location:10.0.1'

masukkan deskripsi gambar di sini

public class LocationOnOff_Similar_To_Google_Maps extends AppCompatActivity {

    protected static final String TAG = "LocationOnOff";


    private GoogleApiClient googleApiClient;
    final static int REQUEST_LOCATION = 199;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        this.setFinishOnTouchOutside(true);

        // Todo Location Already on  ... start
        final LocationManager manager = (LocationManager) LocationOnOff_Similar_To_Google_Maps.this.getSystemService(Context.LOCATION_SERVICE);
        if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER) && hasGPSDevice(LocationOnOff_Similar_To_Google_Maps.this)) {
            Toast.makeText(LocationOnOff_Similar_To_Google_Maps.this,"Gps already enabled",Toast.LENGTH_SHORT).show();
            finish();
        }
        // Todo Location Already on  ... end

        if(!hasGPSDevice(LocationOnOff_Similar_To_Google_Maps.this)){
            Toast.makeText(LocationOnOff_Similar_To_Google_Maps.this,"Gps not Supported",Toast.LENGTH_SHORT).show();
        }

        if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER) && hasGPSDevice(LocationOnOff_Similar_To_Google_Maps.this)) {
            Log.e("keshav","Gps already enabled");
            Toast.makeText(LocationOnOff_Similar_To_Google_Maps.this,"Gps not enabled",Toast.LENGTH_SHORT).show();
            enableLoc();
        }else{
            Log.e("keshav","Gps already enabled");
            Toast.makeText(LocationOnOff_Similar_To_Google_Maps.this,"Gps already enabled",Toast.LENGTH_SHORT).show();
        }
    }


    private boolean hasGPSDevice(Context context) {
        final LocationManager mgr = (LocationManager) context
                .getSystemService(Context.LOCATION_SERVICE);
        if (mgr == null)
            return false;
        final List<String> providers = mgr.getAllProviders();
        if (providers == null)
            return false;
        return providers.contains(LocationManager.GPS_PROVIDER);
    }

    private void enableLoc() {

        if (googleApiClient == null) {
            googleApiClient = new GoogleApiClient.Builder(LocationOnOff_Similar_To_Google_Maps.this)
                    .addApi(LocationServices.API)
                    .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
                        @Override
                        public void onConnected(Bundle bundle) {

                        }

                        @Override
                        public void onConnectionSuspended(int i) {
                            googleApiClient.connect();
                        }
                    })
                    .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
                        @Override
                        public void onConnectionFailed(ConnectionResult connectionResult) {

                            Log.d("Location error","Location error " + connectionResult.getErrorCode());
                        }
                    }).build();
            googleApiClient.connect();

            LocationRequest locationRequest = LocationRequest.create();
            locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
            locationRequest.setInterval(30 * 1000);
            locationRequest.setFastestInterval(5 * 1000);
            LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                    .addLocationRequest(locationRequest);

            builder.setAlwaysShow(true);

            PendingResult<LocationSettingsResult> result =
                    LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build());
            result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
                @Override
                public void onResult(LocationSettingsResult result) {
                    final Status status = result.getStatus();
                    switch (status.getStatusCode()) {
                        case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                            try {
                                // Show the dialog by calling startResolutionForResult(),
                                // and check the result in onActivityResult().
                                status.startResolutionForResult(LocationOnOff_Similar_To_Google_Maps.this, REQUEST_LOCATION);

                                finish();
                            } catch (IntentSender.SendIntentException e) {
                                // Ignore the error.
                            }
                            break;
                    }
                }
            });
        }
    }

}
Keshav Gera
sumber
ini kesenangan saya
Keshav Gera
1
Lihat Posting Penerima Siaran Sangat Berguna dan
Sukai
Solusi sempurna.
Lalit Sharma
Terima kasih Lalit Sharma
Keshav Gera
Tolong perbarui tautannya, rusak sekarang,
kirimkan
7

Ola Cabs menggunakan Pengaturan API yang baru dirilis untuk mencapai fungsi ini. Sesuai API baru, pengguna tidak perlu menavigasi ke halaman pengaturan untuk mengaktifkan layanan lokasi yang memberikan integrasi tanpa batas untuk hal yang sama. Silakan baca di bawah untuk detail lebih lanjut:

https://developers.google.com/android/reference/com/google/android/gms/location/SettingsApi

Abhi
sumber
ini terlihat sama dengan jawaban veer3383. tolong perbaiki saya jika saya salah
rakesh kashyap
@rakeshkashyap ya itu sama
MatPag
Saya ingin tahu apakah mungkin untuk melakukan hal berikut: * mengatur batas waktu untuk mendapatkan lokasi. * periksa API pengaturan GPS, jika semua sensor yang diperlukan diaktifkan dan tampilkan pesan yang sesuai. * Jika ini memungkinkan, bagaimana cara mengatur batas waktu.? Saya tidak dapat menemukan pengaturan seperti itu ketika membangun API
rakesh kashyap
Halo, saya punya masalah dengan memuat peta untuk kedua kalinya setelah mengaktifkan GPS dari keadaan Mati, Tolong, ada yang bantu saya: stackoverflow.com/questions/44368960/… Terima kasih.
Jaimin Modi
3
SettingsAPItelah ditinggalkan, sekarang Anda menggunakan SettingsClient developers.google.com/android/reference/com/google/android/gms/…
Saik Caskey
7

Ketergantungan

compile 'com.google.android.gms:play-services-location:10.0.1'

Kode

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.IntentSender;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.PendingResult;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.location.LocationSettingsRequest;
import com.google.android.gms.location.LocationSettingsResult;
import com.google.android.gms.location.LocationSettingsStates;
import com.google.android.gms.location.LocationSettingsStatusCodes;

public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

    public static final int REQUEST_LOCATION=001;

    GoogleApiClient googleApiClient;

    LocationManager locationManager;
    LocationRequest locationRequest;
    LocationSettingsRequest.Builder locationSettingsRequest;
    Context context;


    PendingResult<LocationSettingsResult> pendingResult;


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

        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            Toast.makeText(this, "Gps is Enabled", Toast.LENGTH_SHORT).show();

        } else {
            mEnableGps();
        }

    }

    public void mEnableGps() {
        googleApiClient = new GoogleApiClient.Builder(context)
                .addApi(LocationServices.API).addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();
        googleApiClient.connect();
        mLocationSetting();
    }

    public void mLocationSetting() {
        locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationRequest.setInterval(1 * 1000);
        locationRequest.setFastestInterval(1 * 1000);

        locationSettingsRequest = new LocationSettingsRequest.Builder().addLocationRequest(locationRequest);

        mResult();

    }

    public void mResult() {
        pendingResult = LocationServices.SettingsApi.checkLocationSettings(googleApiClient, locationSettingsRequest.build());
        pendingResult.setResultCallback(new ResultCallback<LocationSettingsResult>() {
            @Override
            public void onResult(@NonNull LocationSettingsResult locationSettingsResult) {
                Status status = locationSettingsResult.getStatus();


                switch (status.getStatusCode()) {
                    case LocationSettingsStatusCodes.SUCCESS:
                        // All location settings are satisfied. The client can initialize location
                        // requests here.

                        break;
                    case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:

                        try {

                            status.startResolutionForResult(MainActivity.this, REQUEST_LOCATION);
                        } catch (IntentSender.SendIntentException e) {

                        }
                        break;
                    case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                        // Location settings are not satisfied. However, we have no way to fix the
                        // settings so we won't show the dialog.


                        break;
                }
            }

        });
    }


    //callback method
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        final LocationSettingsStates states = LocationSettingsStates.fromIntent(data);
        switch (requestCode) {
            case REQUEST_LOCATION:
                switch (resultCode) {
                    case Activity.RESULT_OK:
                        // All required changes were successfully made
                        Toast.makeText(context, "Gps enabled", Toast.LENGTH_SHORT).show();
                        break;
                    case Activity.RESULT_CANCELED:
                        // The user was asked to change settings, but chose not to
                        Toast.makeText(context, "Gps Canceled", Toast.LENGTH_SHORT).show();
                        break;
                    default:
                        break;
                }
                break;
        }
    }


    @Override
    public void onConnected(@Nullable Bundle bundle) {

    }

    @Override
    public void onConnectionSuspended(int i) {

    }

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

    }
}
Francis
sumber
4

Anda juga dapat menambahkan beberapa LocationRequests for Builder untuk mencapai dialog "Gunakan GPS, Wi-Fi, dan seluler untuk lokasi" alih-alih hanya "Gunakan GPS untuk lokasi"

LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                .addLocationRequest(createLocationRequest(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY))
                .addLocationRequest(createLocationRequest(LocationRequest.PRIORITY_HIGH_ACCURACY))
                .setAlwaysShow(true);

PendingResult<LocationSettingsResult> result =
                LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build());
Andrey Busik
sumber
Dalam kasus saya, cukup menggunakan PRIORITY_HIGH_ACCURACY untuk mendapatkan kalimat "Gunakan GPS, Wi-Fi, dan jaringan seluler untuk lokasi". Tetapi aneh bahwa itu bekerja pada perangkat nyata tetapi dalam simulator tidak. Dalam kalimat simulator selalu tanpa "Gunakan GPS" di awal meskipun saya melihat bahwa perangkat simulator memiliki GPS.
mikep
0

Di Kotlin, gunakan kode ini:

import android.app.Activity
import android.content.Intent
import android.content.IntentSender
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import com.google.android.gms.common.api.GoogleApiClient
import com.google.android.gms.common.api.PendingResult
import com.google.android.gms.common.api.Status
import com.google.android.gms.location.*

class MainActivity : AppCompatActivity() {
    private var googleApiClient: GoogleApiClient? = null
    private val REQUESTLOCATION = 199
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableLoc()
    }
    private fun enableLoc() {
        googleApiClient = GoogleApiClient.Builder(this)
            .addApi(LocationServices.API)
            .addConnectionCallbacks(object : GoogleApiClient.ConnectionCallbacks {
                override fun onConnected(bundle: Bundle?) {}
                override fun onConnectionSuspended(i: Int) {
                    googleApiClient?.connect()
                }
            })
            .addOnConnectionFailedListener {
            }.build()
        googleApiClient?.connect()
        val locationRequest = LocationRequest.create()
        locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
        locationRequest.interval = 30 * 1000.toLong()
        locationRequest.fastestInterval = 5 * 1000.toLong()
        val builder = LocationSettingsRequest.Builder()
            .addLocationRequest(locationRequest)
        builder.setAlwaysShow(true)
        val result: PendingResult<LocationSettingsResult> =
            LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build())
        result.setResultCallback { result ->
            val status: Status = result.status
            when (status.statusCode) {
                LocationSettingsStatusCodes.RESOLUTION_REQUIRED -> try {
                    status.startResolutionForResult(
                        this@MainActivity,
                        REQUESTLOCATION
                    )
                } catch (e: IntentSender.SendIntentException) {
                }
            }
        }
    }
    override fun onActivityResult(
        requestCode: Int,
        resultCode: Int,
        data: Intent?
    ) {
        super.onActivityResult(requestCode, resultCode, data)
        when (requestCode) {
            REQUESTLOCATION -> when (resultCode) {
                Activity.RESULT_OK -> Log.d("abc","OK")
                Activity.RESULT_CANCELED -> Log.d("abc","CANCEL")
            }
        }
    }
}
MMG
sumber