Comment afficher la boîte de dialogue d'activation de l'emplacement comme Google Maps?

129

J'utilise la dernière version des services Google Play (7.0) et ai suivi les étapes données dans leur guide et j'ai activé la boîte de dialogue de localisation comme ci-dessous, qui a un bouton "jamais". Mon application a obligatoirement besoin d'un emplacement, donc je ne veux pas montrer «jamais» à l'utilisateur, car une fois que l'utilisateur clique sur «jamais», je ne parviens plus du tout à obtenir l'emplacement ou à demander l'emplacement.

Où, comme Google Maps n'a que des boutons oui et non sans bouton jamais, une idée de comment y parvenir?

L'image de mon application entrez la description de l'image ici

Image de Google Map entrez la description de l'image ici

Mufri A
la source

Réponses:

149

LocationSettingsRequest.Builder a une méthode setAlwaysShow(boolean show). Bien que le document indique qu'il ne fait actuellement rien (mise à jour 05/07/2015: la documentation Google mise à jour a supprimé ce libellé), le paramètre activera le builder.setAlwaysShow(true);comportement de Google Maps: entrez la description de l'image ici

Voici le code qui l'a fait fonctionner:

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;
            }
        }
    });
}

À partir de la documentation Android

Pour Kotlin voir ici: https://stackoverflow.com/a/61868985/12478830

Kai
la source
1
@ MarianPaździoch à peu près sûr que vous n'en avez pas besoin, puisque le propre exemple de code de Google sur SettingsApi ne l'exige pas.
Kai
1
@Kai Oui, le code n'est pas modifié sur un Nexus 5. En utilisant les journaux, je vois que lorsque les services de localisation sont initialement désactivés, il frappe toujours RESOLUTION_REQUIRED. Ensuite, une fois que j'accepte et active l'emplacement, il frappe SUCCESSet saute complètement onActivityResult(). Appuyer Noou reculer fait disparaître la boîte de dialogue pendant une seconde, puis recharger et frapper à RESOLUTION_REQUIREDnouveau. Le seul moyen de se débarrasser de la boîte de dialogue est d'accepter ou de fermer et de rouvrir l'application.
pez
2
@pez testé sur Galaxy S4 avec les services Google Play 7.5.74 et cela fonctionne, l'annulation ne provoque pas l'appel de RESOLUTION_REQUIRED. Ma suggestion serait de mettre à jour les services de lecture et de réessayer. En cas d'échec, lancez une nouvelle question StackOverflow pour voir si d'autres personnes ont rencontré et résolu ce problème.
Kai
2
@Kai, cela a fonctionné pour moi, mais que se passe-t-il si un utilisateur appuie sur Non Comment afficher à nouveau la boîte de dialogue ou ajouter du code si vous appuyez sur Non Toute aide sera très appréciée.
Gurpreet singh
1
REMARQUE: votre activité ne launchModepeut PAS être réglée sur, singleInstancesinon cela ne fonctionnera PAS. La boîte de dialogue n'apparaîtra jamais et onActivityResultsera appelée automatiquement. NE PAS AVOIR android:launchMode="singleInstance"pour votre activité en AndroidManifest. J'ai appris cela très dur après 3 heures
ᴛʜᴇᴘᴀᴛᴇʟ
55

Je voudrais ajouter quelques changements à la réponse de kai pour ceux qui cherchent à gérer les boutons Oui / Non.

Déclarez cette constante dans votre activité

protected static final int REQUEST_CHECK_SETTINGS = 0x1;

appelez settingsrequest()votre onStart ()

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
la source
1
obtenu à partir de la documentation officielle: développeurs.google.com /android/reference/com/google/android/ gms/… si vous devez ajouter uniquement des cartes, pour l'utiliser, vous devez ajouter ces bibliothèques (sans importer la bibliothèque complète des services de lecture ): compile 'com.google.android.gms: play-services-maps: 9.0.2' compile 'com.google.android.gms: play-services-location: 9.0.2'
MatPag
comment gérer l'événement de clic de cette boîte de dialogue et je ne dois jamais afficher le bouton jamais dans la boîte de dialogue
M.Yogeshwaran
supprimer la ligne settingsrequest () de la casse de commutation dans ActivityOnResult .. Est-ce ce que vous demandez ???
Veer3383
Si je ne clique sur aucun bouton de la boîte de dialogue, cette boîte de dialogue s'affiche en continu .. Je supprime déjà la ligne settingsrequest () de la casse de commutation dans ActivityOnResult .. alors pourquoi elle s'affiche en continu?
Asmi
Vous devrez peut-être nettoyer le projet.
Veer3383
25

LocationServices.SettingsApi est désormais obsolète, nous utilisons donc 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);

Vérifiez ensuite si les paramètres de localisation actuels sont satisfaits. Créez la tâche LocationSettingsResponse:

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

Puis ajoutez 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;
                            }
                        }
                    }
                });

Ajouté onActivityResult

@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;
        }
    }

Reportez-vous au lien SettingsClient

Arul Pandian
la source
1
Vérifiez stackoverflow.com/a/53277287 @BadLoser en utilisant SettingsClient
Ketan Ramani
Quel est le nom de la dépendance à importer? Impossible de résoudre la tâche de symbole.
Denis
Je l'ai trouvé: implémentation 'com.google.android.gms: play-services-tasks: 16.0.1'
Denis
@Denis, je pourrais utiliser à la implementation 'com.google.android.gms:play-services-location:16.0.0'place.
CoolMind
25

Son fonctionnement similaire à Google Maps?
Code source: https://drive.google.com/open?id=0BzBKpZ4nzNzUOXM2eEhHM3hOZk0

Ajouter une dépendance dans le fichier build.gradle:

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

OU

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

entrez la description de l'image ici

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
la source
c'est mon plaisir
Keshav Gera
1
Voir le message du récepteur de diffusion très utile et comme moi stackoverflow.com/questions/15698790/…
Keshav Gera
Solution parfaite.
Lalit Sharma
Merci Lalit Sharma
Keshav Gera
Pouvez-vous s'il vous plaît mettre à jour le lien, il est maintenant cassé, publiez le code dans GitHub à la place
Manoj Perumarath
7

Ola Cabs utilise la nouvelle API Settings pour atteindre cette fonctionnalité. Selon la nouvelle API, l'utilisateur n'est pas obligé de naviguer vers la page des paramètres pour activer les services de localisation donnant une intégration transparente pour la même chose. Veuillez lire ci-dessous pour plus de détails:

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

Abhi
la source
cela ressemble à la réponse veer3383. s'il vous plaît corrigez-moi si je me trompe
rakesh kashyap
@rakeshkashyap oui c'est pareil
MatPag
Je voulais savoir s'il était possible de faire ce qui suit: * définir un délai pour obtenir l'emplacement. * Vérifiez dans l'API des paramètres GPS, si tous les capteurs requis sont activés et affichez le message en conséquence. * Si cela est possible, comment définir un délai.? Je n'ai pas pu trouver un tel paramètre lors de la construction de l'API
rakesh kashyap
Bonjour, j'ai un problème avec le chargement de la carte une deuxième fois après avoir activé le GPS à partir de l'état Off, s'il vous plaît, aidez-moi: stackoverflow.com/questions/44368960/ ... Merci.
Jaimin Modi
3
SettingsAPIest obsolète, vous utilisez maintenant SettingsClient développeurs.google.com
android
7

Dépendance

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

Code

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
la source
4

Vous pouvez également ajouter plusieurs demandes de localisation pour Builder pour obtenir la boîte de dialogue "Utiliser le GPS, le Wi-Fi et les réseaux mobiles pour la localisation" au lieu de simplement "Utiliser le GPS pour la localisation"

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
la source
Dans mon cas, il suffit d'utiliser PRIORITY_HIGH_ACCURACY pour obtenir la phrase "Utiliser le GPS, le Wi-Fi et les réseaux mobiles pour la localisation". Mais il est étrange que cela fonctionne sur un appareil réel, mais pas dans le simulateur. Dans le simulateur, la phrase est toujours sans "Utiliser le GPS" au début bien que je vois que le simulateur dispose d'un GPS.
mikep le
0

Dans Kotlin, utilisez ce code:

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
la source
0

Veuillez vérifier ma solution très simple pour obtenir l'emplacement de l'utilisateur au premier plan.

  1. Boîte de dialogue Paramètres GPS
  2. Localisation de l'utilisateur avec des données en direct.
  3. La classe LocationUtility est consciente du cycle de vie de l'activité pour suspendre / reprendre les mises à jour de l'emplacement.
  4. Emplacement avec le dernier FusedLocationProviderClient

https://github.com/Maqsood007/UserLocation-Android/blob/master/app/src/main/java/jetpack/skill/userlocation_android/utils/LocationUtility.kt

entrez la description de l'image ici

entrez la description de l'image ici

Muhammad Maqsood
la source