Wie kann ich den Dialog zum Aktivieren des Standorts wie Google Maps anzeigen?


129

Ich verwende die neueste Version von Google Play Services (7.0) und habe die in der Anleitung angegebenen Schritte ausgeführt. Ich habe den Standortdialog wie unten aktiviert, der über die Schaltfläche "Nie" verfügt. Meine App benötigt zwingend einen Standort, daher möchte ich dem Benutzer nicht "nie" anzeigen, da ich, sobald der Benutzer auf "nie" klickt, überhaupt keinen Standort mehr erhalten oder keinen Standort mehr anfordern kann.

Wo, da Google Maps nur Ja- und Nein-Schaltflächen ohne Niemals-Schaltflächen hat, gibt es eine Idee, wie dies erreicht werden kann?

Das Bild meiner App Geben Sie hier die Bildbeschreibung ein

Bild von Google Map Geben Sie hier die Bildbeschreibung ein

Antworten:


149

LocationSettingsRequest.Builder verfügt über eine Methode setAlwaysShow(boolean show). Während das Dokument angibt, dass derzeit nichts unternommen wird (aktualisiert am 05.07.2015: Die aktualisierte Google-Dokumentation hat diesen Wortlaut entfernt), builder.setAlwaysShow(true);aktiviert die Einstellung das Verhalten von Google Maps: Geben Sie hier die Bildbeschreibung ein

Hier ist der Code, mit dem es funktioniert hat:

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

Aus der Android-Dokumentation

Kotlin finden Sie hier: https://stackoverflow.com/a/61868985/12478830


1
@ MarianPaździoch ziemlich sicher, dass Sie nicht müssen, da Googles eigener Beispielcode auf SettingsApi ihn nicht benötigt.
Kai

1
@Kai Ja, der Code ist auf einem Nexus 5 unverändert. Wenn ich Protokolle verwende, sehe ich, dass er immer trifft, wenn die Ortungsdienste anfänglich ausgeschaltet sind RESOLUTION_REQUIRED. Sobald ich den Standort akzeptiere und aktiviere, trifft er SUCCESSund überspringt vollständig onActivityResult(). Durch Drücken Nooder Zurück wird der Dialog für eine Sekunde ausgeblendet, dann neu geladen und RESOLUTION_REQUIREDerneut gedrückt . Die einzige Möglichkeit, den Dialog zu entfernen, besteht darin, die App entweder zu akzeptieren oder zu schließen und erneut zu öffnen.
Pez

2
@pez wurde auf dem Galaxy S4 mit den Google Play-Diensten 7.5.74 getestet und funktioniert. Durch das Abbrechen wird RESOLUTION_REQUIRED nicht aufgerufen. Mein Vorschlag wäre, die Spieldienste zu aktualisieren und es erneut zu versuchen. Wenn dies fehlgeschlagen ist, starten Sie eine neue StackOverflow-Frage, um festzustellen, ob andere auf dieses Problem gestoßen sind und es behoben haben.
Kai

2
@Kai es hat bei mir funktioniert, aber was ist, wenn ein Benutzer Nein gedrückt hat? Wie man den Dialog erneut anzeigt oder dort Code hinzufügt, wenn Nein gedrückt wird. Jede Hilfe wird sehr geschätzt.
Gurpreet singh

1
HINWEIS: Ihre Aktivitäten launchModekönnen NICHT eingestellt werden, singleInstanceda dies sonst NICHT funktioniert. Der Dialog wird nie angezeigt und onActivityResultautomatisch aufgerufen. HABEN SIE NICHT android:launchMode="singleInstance"für Ihre Aktivität in AndroidManifest. Ich habe diesen sehr harten Weg nach 3 Stunden
gelernt

55

Ich möchte einige Änderungen an Kai's Antwort für diejenigen hinzufügen, die nach Ja / Nein-Schaltflächen suchen.

Deklarieren Sie diese Konstante in Ihrer Aktivität

protected static final int REQUEST_CHECK_SETTINGS = 0x1;

Rufen Sie settingsrequest()in Ihrem 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;
        }
    }

1
Aus der offiziellen Dokumentation geht hervor: developer.google.com/android/reference/com/google/android/gms/… Wenn Sie nur Karten hinzufügen müssen, müssen Sie diese Bibliotheken hinzufügen (ohne die gesamte Bibliothek der Wiedergabedienste zu importieren) ): kompiliere 'com.google.android.gms: play-services-maps: 9.0.2' kompiliere 'com.google.android.gms: play-services-location: 9.0.2'
MatPag

Wie man mit dem
Klickereignis

Entfernen Sie die Zeile settingsrequest () aus dem Schalterfall in ActivityOnResult. Ist es das, was Sie fragen?
Veer3383

Wenn ich auf keine Schaltfläche des Dialogfelds klicke, wird dieses Dialogfeld kontinuierlich angezeigt. Ich entferne bereits die Zeile settingsrequest () aus dem Schaltergehäuse in ActivityOnResult. Warum wird es dann kontinuierlich angezeigt?
Asmi

Möglicherweise müssen Sie das Projekt sauber erstellen.
Veer3383

25

LocationServices.SettingsApi ist jetzt veraltet. Daher verwenden wir 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);

Überprüfen Sie dann, ob die aktuellen Standorteinstellungen erfüllt sind. Erstellen Sie die Aufgabe LocationSettingsResponse:

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

Fügen Sie dann Listener hinzu

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

OnActivityResult hinzugefügt

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

Siehe den Link SettingsClient


1
Überprüfen Sie stackoverflow.com/a/53277287 @BadLoser mit SettingsClient
Ketan Ramani

Wie heißt die zu importierende Abhängigkeit? Symbol Aufgabe kann nicht aufgelöst werden.
Denis

Ich fand es: Implementierung 'com.google.android.gms: Play-Services-Aufgaben: 16.0.1'
Denis

@Denis, ich könnte implementation 'com.google.android.gms:play-services-location:16.0.0'stattdessen verwenden.
CoolMind

25

Es funktioniert ähnlich wie Google Maps?
Quellcode: https://drive.google.com/open?id=0BzBKpZ4nzNzUOXM2eEhHM3hOZk0

Hinzufügen einer Abhängigkeit in der Datei build.gradle:

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

ODER

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

Geben Sie hier die Bildbeschreibung ein

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

}

Es ist mir ein Vergnügen
Keshav Gera

1
Siehe Broadcast Receiver Post Sehr nützlich und wie ich stackoverflow.com/questions/15698790/…
Keshav Gera

Perfekte Lösung.
Lalit Sharma

Vielen Dank Lalit Sharma
Keshav Gera

Kannst du bitte den Link aktualisieren, er ist jetzt kaputt,
poste

7

Ola Cabs verwendet die neu veröffentlichte Einstellungs-API, um diese Funktionalität zu erreichen. Gemäß der neuen API muss der Benutzer nicht zur Einstellungsseite navigieren, um Standortdienste zu aktivieren, die eine nahtlose Integration für dieselbe ermöglichen. Bitte lesen Sie unten für weitere Details:

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


Dies sieht genauso aus wie die Antwort von veer3383. Bitte korrigieren Sie mich, wenn ich falsch
liege

@rakeshkashyap ja es ist das gleiche
MatPag

Ich wollte wissen, ob es möglich ist, Folgendes zu tun: * Legen Sie eine Zeitüberschreitung fest, um den Standort zu ermitteln. * Überprüfen Sie in der GPS-Einstellungs-API, ob alle erforderlichen Sensoren aktiviert sind, und zeigen Sie die Meldung entsprechend an. * Wenn dies möglich ist, wie kann ein Timeout festgelegt werden? Ich konnte keine solche Einstellung finden, als ich die API
Rakesh Kashyap

Hallo, ich habe ein Problem beim zweiten Laden der Karte nach dem Einschalten des GPS aus dem Status "Aus". Bitte hilft mir jemand: stackoverflow.com/questions/44368960/… Danke.
Jaimin Modi

3
SettingsAPIwurde veraltet, jetzt verwenden Sie SettingsClient developer.google.com/android/reference/com/google/android/gms/…
Saik Caskey

7

Abhängigkeit

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) {

    }
}

4

Sie können auch mehrere LocationRequests for Builder hinzufügen, um das Dialogfeld "GPS, Wi-Fi und Mobilfunknetze als Standort verwenden" zu erhalten, anstatt nur "GPS als Standort verwenden".

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

In meinem Fall reicht es aus, PRIORITY_HIGH_ACCURACY zu verwenden, um den Satz "GPS, Wi-Fi und Mobilfunknetze als Standort verwenden" zu erhalten. Aber es ist seltsam, dass es auf einem realen Gerät funktioniert, im Simulator jedoch nicht. Im Simulator ist der Satz am Anfang immer ohne "GPS verwenden", obwohl ich sehe, dass das Simulatorgerät GPS hat.
Mikep

0

Verwenden Sie in Kotlin diesen 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")
            }
        }
    }
}

0

Bitte überprüfen Sie meine sehr einfache Lösung, um den Benutzerstandort in den Vordergrund zu stellen.

  1. GPS-Einstellungsdialog
  2. Benutzerstandort mit Live-Daten.
  3. Die LocationUtility-Klasse ist ein Aktivitätslebenszyklus, bei dem die Standortaktualisierungen angehalten / fortgesetzt werden können.
  4. Speicherort mit dem neuesten FusedLocationProviderClient

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

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.