Wie kann ich das GPS unter Android programmgesteuert aktivieren oder deaktivieren?

158

Ich weiß , dass die Frage , Ein / Aus - GPS über das Einschalten programmatisch Android hat bereits diskutiert viele Male , und die Antwort ist immer die gleiche:

"Aus Sicherheits- / Datenschutzgründen können Sie dies nicht tun. Sie müssen zum Bildschirm mit den Standorteinstellungen weiterleiten und ihn vom Benutzer aktivieren / deaktivieren lassen."

Ich verstehe, dass ich Tasker jedoch kürzlich vom Markt gekauft habe. Neben vielen anderen Dingen, die Sie damit erreichen können, können Sie Regeln festlegen, um GPS beim Eingeben vordefinierter Anwendungen automatisch zu aktivieren und beim Beenden zu deaktivieren (siehe hier für Tutorial, wie es geht, und es funktioniert einfach!) und diese App kann nicht mit dem Firmware-Signaturschlüssel signiert werden, da sie auf vielen Android-Versionen und verschiedenen Geräten funktioniert und Sie nicht einmal gerootet werden müssen.

Ich möchte dies in meiner App tun. Natürlich möchte ich die Privatsphäre des Benutzers nicht in die Luft jagen, daher würde ich den Benutzer zuerst fragen, ob er sie automatisch mit dem typischen Kontrollkästchen "Meine Entscheidung merken" aktivieren möchte, und wenn er mit "Ja" antwortet, aktivieren Sie sie.

Hat jemand eine Idee oder eine Ahnung, wie Tasker dies erreicht?

maid450
quelle

Antworten:

161

Das GPS kann umgeschaltet werden, indem ein Fehler im Power Manager-Widget ausgenutzt wird . Weitere Informationen finden Sie in diesem xda-Thread .

Hier ist ein Beispielcode, den ich benutze

private void turnGPSOn(){
    String provider = Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);

    if(!provider.contains("gps")){ //if gps is disabled
        final Intent poke = new Intent();
        poke.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider"); 
        poke.addCategory(Intent.CATEGORY_ALTERNATIVE);
        poke.setData(Uri.parse("3")); 
        sendBroadcast(poke);
    }
}

private void turnGPSOff(){
    String provider = Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);

    if(provider.contains("gps")){ //if gps is enabled
        final Intent poke = new Intent();
        poke.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider");
        poke.addCategory(Intent.CATEGORY_ALTERNATIVE);
        poke.setData(Uri.parse("3")); 
        sendBroadcast(poke);
    }
}

Verwenden Sie Folgendes, um zu testen, ob es sich bei der vorhandenen Version des Power Control-Widgets um eine Version handelt, mit der Sie das GPS umschalten können.

private boolean canToggleGPS() {
    PackageManager pacman = getPackageManager();
    PackageInfo pacInfo = null;

    try {
        pacInfo = pacman.getPackageInfo("com.android.settings", PackageManager.GET_RECEIVERS);
    } catch (NameNotFoundException e) {
        return false; //package not found
    }

    if(pacInfo != null){
        for(ActivityInfo actInfo : pacInfo.receivers){
            //test if recevier is exported. if so, we can toggle GPS.
            if(actInfo.name.equals("com.android.settings.widget.SettingsAppWidgetProvider") && actInfo.exported){
                return true;
            }
        }
    }

    return false; //default
}
Ben H.
quelle
4
Zum Zeitpunkt dieses (meines) Kommentars scheinen die Links in dieser Antwort darauf hinzudeuten, dass der Fehler, den dieser Exploit ausnutzt, kürzlich behoben wurde. Ich wollte nur darauf hinweisen, dass der Exploit in meiner eigenen Testumgebung immer noch einwandfrei zu funktionieren scheint. Sie sollten also nicht aufgeben, dies zu versuchen. Stellen Sie nur sicher, dass Ihr Code alle Fehler behandelt, wenn er nicht funktioniert !
SilithCrowe
1
Zum Zeitpunkt des Schreibens dieses Kommentars funktioniert dieser Exploit noch auf einem 2.2.1-Android-Telefon. Schöner Fund, Ben H.
Qix - MONICA wurde
38
Das ist eine wirklich schlechte Idee. Sobald der Fehler behoben ist, funktioniert Ihr Exploit nicht mehr. Senden Sie den Benutzer besser einfach an die Einstellungs-App.
Edward Falk
1
Funktioniert gut in Android 2.3.6, aber nicht in Android 4.0.3. Jede Idee zum Aktivieren oder Deaktivieren in Android 4.0.3
Krishna
5
hahaha ... dieser Exploit tauchte in 4.2.2 wieder auf, überrascht, ihn zu sehen .. GOTT!
Amithgc
69

Alle diese Antworten sind jetzt nicht erlaubt. Hier ist der richtige:

Für alle, die noch nach der Antwort suchen:

So machen es OLA Cabs und andere solche Apps.

Fügen Sie dies in Ihrem onCreate hinzu

if (googleApiClient == null) {
    googleApiClient = new GoogleApiClient.Builder(this)
            .addApi(LocationServices.API).addConnectionCallbacks(this)
            .addOnConnectionFailedListener(Login.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(Login.this, 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;
            }
        }
    });
}

Dies sind die implementierten Methoden:

@Override
public void onConnected(Bundle arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onConnectionSuspended(int arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onConnectionFailed(ConnectionResult arg0) {
    // TODO Auto-generated method stub

}

Hier ist die Android-Dokumentation dafür.

Dies soll anderen helfen, wenn sie immer noch Probleme haben:

Bearbeiten : Hinzufügen von Irfan Razas Kommentar für weitere Hilfe.

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     if (requestCode == 1000) {
         if(resultCode == Activity.RESULT_OK){
             String result=data.getStringExtra("result"); 
         } if (resultCode == Activity.RESULT_CANCELED) {
             //Write your code if there's no result 
         } 
    } 
} 
Akshat
quelle
Nun sollte diese Antwort die akzeptierte sein. Vielen Dank Akshat !!
Gurpreet
2
Benötigt die Integration des Google API-Clients, daher nur eine Lösung für bestimmte Anwendungsfälle, die nicht für eine generische Lösung geeignet ist.
Cik
@ DilroopSingh mit welchem ​​Problem stehen Sie vor? Ich benutze den gleichen Code und es funktioniert perfekt.
Akshat
1
Können wir dies erreichen, ohne diesen Builder zu zeigen? Weil ich GPS einschalten muss, ohne irgendwelche Warnungen anzuzeigen.
Punithapriya
3
@ Punithapriya Das ist nicht möglich. Die Zustimmung des Benutzers ist erforderlich und daher muss der Builder angezeigt werden.
Akshat
50

GPS AKTIVIEREN:

Intent intent=new Intent("android.location.GPS_ENABLED_CHANGE");
intent.putExtra("enabled", true);
sendBroadcast(intent);

GPS deaktivieren:

Intent intent = new Intent("android.location.GPS_ENABLED_CHANGE");
intent.putExtra("enabled", false);
sendBroadcast(intent);
Debugger
quelle
1
automatisch schaltet sich GPS ein / aus.
Debugger
1
Dies hilft auch zu aktivieren. private void turnGPSOn () {String provider = Settings.Secure.getString (getContentResolver (), Settings.Secure.LOCATION_PROVIDERS_ALLOWED); if (! provider.contains ("gps")) {// wenn gps deaktiviert ist final Intent poke = new Intent (); poke.setClassName ("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider"); poke.addCategory (Intent.CATEGORY_ALTERNATIVE); poke.setData (Uri.parse ("3")); sendBroadcast (stupsen); }}
Debugger
In Android 2.3.4, das auf asamsung sII ausgeführt wird, wird das GPS-Symbol aktiviert, ohne dass der GPS-Sensor effektiv aktiviert wird. Wenn Sie den GPS-Sensor jedoch programmgesteuert einschalten, wird er erkannt.
Tony Gil
24
android 4.0.4 - nur GPS- Benachrichtigung ist aktiviert. nicht das GPS selbst. so sieht es aus wie es ist, aber in der Tat ist es nicht
Alex
14
java.lang.SecurityException: Verweigerung der Berechtigung: Sende nicht gesendet android.location.GPS_ENABLED_CHANGE
Abhi
28

Dieser Code funktioniert auf ROOTED- Telefonen, wenn die App verschoben wurde /system/aps , und sie haben die folgenden Berechtigungen im Manifest :

<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>

Code

private void turnGpsOn (Context context) {
    beforeEnable = Settings.Secure.getString (context.getContentResolver(),
                                              Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
    String newSet = String.format ("%s,%s",
                                   beforeEnable,
                                   LocationManager.GPS_PROVIDER);
    try {
        Settings.Secure.putString (context.getContentResolver(),
                                   Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
                                   newSet); 
    } catch(Exception e) {}
}


private void turnGpsOff (Context context) {
    if (null == beforeEnable) {
        String str = Settings.Secure.getString (context.getContentResolver(),
                                                Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
        if (null == str) {
            str = "";
        } else {                
            String[] list = str.split (",");
            str = "";
            int j = 0;
            for (int i = 0; i < list.length; i++) {
                if (!list[i].equals (LocationManager.GPS_PROVIDER)) {
                    if (j > 0) {
                        str += ",";
                    }
                    str += list[i];
                    j++;
                }
            }
            beforeEnable = str;
        }
    }
    try {
        Settings.Secure.putString (context.getContentResolver(),
                                   Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
                                   beforeEnable);
    } catch(Exception e) {}
}
Nate Zaugg
quelle
5
+1 für die Erwähnung dieser Methode. Es sollte auch mit einer System-App auf einem nicht gerooteten Gerät funktionieren.
AlexS
Das ist der richtige Weg. Funktioniert auf jeder Android-Version, kein Trick nötig!
BQuadra
GPS ausschalten funktioniert nicht !! Kannst du mir bitte sagen warum und die mögliche Lösung?
Shivansh
Jetzt schaltet sich das GPS perfekt aus und wieder ein, aber GPS funktioniert nicht, dh es wird der Standort lat long 0.0 angegeben
Shivansh
<Verwendet-Erlaubnis android: name = "android.permission.WRITE_SECURE_SETTINGS" /> nur für das System aps
sijo jose
22

Seit Android Version 4.4 können Sie GPS nicht mehr programmgesteuert aktivieren / deaktivieren. Wenn Sie den in dieser Antwort vorgeschlagenen Code ausprobieren , wird eine Ausnahme ausgelöst.

java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.location.GPS_ENABLED_CHANGE
Amaury Medeiros
quelle
2
Also ist es ein Kommentar oder was ist die Lösung?
Shylendra Madda
@ Shylendra Madda Es gibt keine Lösung zum Aktivieren von GPS. Sie können nur den entsprechenden Systemdialog aufrufen.
Der unglaubliche
22

Anstatt die Absicht Settings.ACTION_LOCATION_SOURCE_SETTINGS zu verwenden, können Sie Popups in Ihrer App wie Google Map und auf GPS direkt anzeigen, indem Sie auf die Schaltfläche OK klicken. Sie müssen nicht zur Einstellung umleiten, sondern müssen lediglich meinen Code als verwenden

Hinweis: Diese Codezeile öffnet automatisch das Dialogfeld, wenn Standort nicht aktiviert ist. Diese Linie wird auch in Google Map verwendet

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


LocationRequest mLocationRequest;
GoogleApiClient mGoogleApiClient;
PendingResult<LocationSettingsResult> result;
final static int REQUEST_LOCATION = 199;

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

    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addApi(LocationServices.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this).build();
    mGoogleApiClient.connect();

}

@Override
public void onConnected(Bundle bundle) {

    mLocationRequest = LocationRequest.create();
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    mLocationRequest.setInterval(30 * 1000);
    mLocationRequest.setFastestInterval(5 * 1000);

    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
            .addLocationRequest(mLocationRequest);
    builder.setAlwaysShow(true);

    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_LOCATION);
                    } catch (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
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    Log.d("onActivityResult()", Integer.toString(resultCode));

    //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(MainActivity.this, "Location enabled by user!", Toast.LENGTH_LONG).show();
                    break;
                }
                case Activity.RESULT_CANCELED:
                {
                    // The user was asked to change settings, but chose not to
                    Toast.makeText(MainActivity.this, "Location not enabled, user cancelled.", Toast.LENGTH_LONG).show();
                    break;
                }
                default:
                {
                    break;
                }
            }
            break;
    }
}

@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {

}
} 

Hinweis: Diese Codezeile öffnet automatisch das Dialogfeld, wenn Standort nicht aktiviert ist. Diese Linie wird auch in Google Map verwendet

Das schwarze Pferd
quelle
1
Dieser Code funktioniert einwandfrei, aber vergessen Sie nicht die Standortberechtigung und das Jayservice-Glas in der Gradle-Datei ...
Akash pasupathi
6

Um GPS programmgesteuert ein- oder auszuschalten, müssen Sie den Root-Zugriff und die BusyBox installiert haben. Selbst mit diesen ist die Aufgabe nicht trivial.

Beispiele hier: Google Drive , Github , Sourceforge

Getestet mit 2.3.5 und 4.1.2 Androiden.

OGP
quelle
Probe ist nicht mehr verfügbar.
Android-Entwickler
Hier ist das Neueste: rapidshare.com/files/1458124346/GPSToggler-20130222.7z Ich habe die alte Version versehentlich gelöscht. BusyBox wird nicht mehr benötigt.
OGP
immer noch nicht verfügbar. Vielleicht einen anderen Dienst zum Hochladen von Dateien verwenden?
Android-Entwickler
Ich habe den Ordner veröffentlicht und überprüft. Jetzt kann es heruntergeladen werden. Auch mein privates FTP hier: StackExchange: [email protected]
OGP
5

Die obige richtige Antwort ist sehr alt, sie braucht etwas Neues. Hier ist die Antwort

Wie im letzten Update haben wir Androidx-Unterstützung, also fügen Sie zuerst die Abhängigkeit in Ihre build.gradle-Datei auf App-Ebene ein

implementation 'com.google.android.gms:play-services-location:17.0.0'

Fügen Sie dann Ihre Manifestdatei hinzu:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

Vergessen Sie nicht, die Zustimmung des Benutzers für diese Berechtigungen einzuholen, wenn Sie diese freigeben

Jetzt hier ist Code, benutze ihn einfach

 protected void createLocationRequest() {
    LocationRequest locationRequest = LocationRequest.create();
    locationRequest.setInterval(10000);
    locationRequest.setFastestInterval(5000);
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

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

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



    task.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
        @Override
        public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
            // All location settings are satisfied. The client can initialize
            // location requests here.
            // ...

            Toast.makeText(MainActivity.this, "Gps already open", 
                                          Toast.LENGTH_LONG).show();
            Log.d("location settings",locationSettingsResponse.toString());
        }
    });

    task.addOnFailureListener(this, new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            if (e instanceof ResolvableApiException) {
                // Location settings are not satisfied, but this can be fixed
                // by showing the user a dialog.
                try {
                    // Show the dialog by calling startResolutionForResult(),
                    // and check the result in onActivityResult().
                    ResolvableApiException resolvable = (ResolvableApiException) e;
                    resolvable.startResolutionForResult(MainActivity.this,
                            REQUEST_CHECK_SETTINGS);
                } catch (IntentSender.SendIntentException sendEx) {
                    // Ignore the error.
                }
            }
        }
    });
}


@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(requestCode==REQUEST_CHECK_SETTINGS){

        if(resultCode==RESULT_OK){

            Toast.makeText(this, "Gps opened", Toast.LENGTH_SHORT).show();
            //if user allows to open gps
            Log.d("result ok",data.toString());

        }else if(resultCode==RESULT_CANCELED){

            Toast.makeText(this, "refused to open gps", 
                                         Toast.LENGTH_SHORT).show();
            // in case user back press or refuses to open gps
            Log.d("result cancelled",data.toString());
        }
    }
}

Wenn etwas schief geht, pingen Sie mich bitte an

Mratyunjay Tripathi
quelle
2

Eine Antwort wurde in einer anderen Frage entwickelt, aber sie wurde geschlossen, und ich möchte, dass die Community sie auch ausprobiert.

boolean gpsStatus = locmanager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if (!gpsStatus) {
    Settings.Secure.putString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED, "network,gps");
}

Siehe diesen Kommentar

Diese Lösung würde die Berechtigungen WRITE_SETTINGSund erfordern WRITE_SECURE_SETTINGS.

Gobernador
quelle
@milind, nehme an, ich habe ein gerootetes Gerät. Was soll ich tun, um diesen Code zu verwenden? Ich habe versucht, eine Root-Berechtigung für die App zu erhalten, aber es hat nicht geholfen. Es heißt immer wieder "Verweigerung der Berechtigung: Für das Schreiben in sichere Einstellungen ist android.permission.WRITE_SECURE_SETTINGS erforderlich"
Android-Entwickler
@android Lies den letzten Satz dieses Beitrags. Für die Verwendung dieser Methode ist die android.permission.WRITE_SECURE_SETTINGSBerechtigung im Manifest erforderlich .
Gobernador
1
ich weiß . Ich habe es bereits hinzugefügt. es sagt mir das, obwohl es bereits im Manifest ist.
Android-Entwickler
Also ist es selbst für gerootete Geräte unmöglich?!
Android-Entwickler
2

Vielleicht mit Reflexionstricks in der Klasse android.server.LocationManagerService.

Es gibt auch eine Methode (seit API 8) android.provider.Settings.Secure.setLocationProviderEnabled

Damian Kołakowski
quelle
3
Diese Settings.SecureKlasse scheint vielversprechend, aber ich erhalte eine Sicherheitsausnahme, die besagt, dass ich android.permission.WRITE_SECURE_SETTINGS benötige, und ich erhalte immer wieder den Fehler, wenn ich diese Berechtigung (und auch WRITE_SETTINGS) zu meinem Manifest hinzufüge. Aber es scheint ein guter Weg zu sein, weiter zu suchen. Danke :)
maid450
WRITE_SECURE_SETTINGShat eine Schutzstufe, diesystemOrSignature Sie benötigen, um diese App zu einer System-App zu machen, damit sie funktioniert, was auch in dieser Antwort erwähnt wird .
Fluss
2

Dies ist die beste Lösung von Google Developers. Rufen Sie diese Methode nach der Initialisierung einfach in onResume von onCreate auf GoogleApiClient.

private void updateMarkers() {
    if (mMap == null) {
        return;
    }

    if (mLocationPermissionGranted) {
        // Get the businesses and other points of interest located
        // nearest to the device's current location.
         mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(LocationServices.API).build();
        mGoogleApiClient.connect();
        LocationRequest locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationRequest.setInterval(10000);
        locationRequest.setFastestInterval(10000 / 2);

        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder().addLocationRequest(locationRequest);
        builder.setAlwaysShow(true);


        LocationSettingsRequest.Builder builder = new LocationSettingsRequest
                .Builder()
                .addLocationRequest(mLocationRequest);
        PendingResult<LocationSettingsResult> resultPendingResult = LocationServices
                .SettingsApi
                .checkLocationSettings(mGoogleApiClient, builder.build());

        resultPendingResult.setResultCallback(new ResultCallback<LocationSettingsResult>() {
            @Override
            public void onResult(@NonNull LocationSettingsResult locationSettingsResult) {
                final Status status = locationSettingsResult.getStatus();
                final LocationSettingsStates locationSettingsStates = locationSettingsResult.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 this can 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,
                                    PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
                        } 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;
                }

            }
        });


        @SuppressWarnings("MissingPermission")
        PendingResult<PlaceLikelihoodBuffer> result = Places.PlaceDetectionApi
                .getCurrentPlace(mGoogleApiClient, null);
        result.setResultCallback(new ResultCallback<PlaceLikelihoodBuffer>() {
            @Override
            public void onResult(@NonNull PlaceLikelihoodBuffer likelyPlaces) {
                for (PlaceLikelihood placeLikelihood : likelyPlaces) {
                    // Add a marker for each place near the device's current location, with an
                    // info window showing place information.
                    String attributions = (String) placeLikelihood.getPlace().getAttributions();
                    String snippet = (String) placeLikelihood.getPlace().getAddress();
                    if (attributions != null) {
                        snippet = snippet + "\n" + attributions;
                    }

                    mMap.addMarker(new MarkerOptions()
                            .position(placeLikelihood.getPlace().getLatLng())
                            .title((String) placeLikelihood.getPlace().getName())
                            .snippet(snippet));
                }
                // Release the place likelihood buffer.
                likelyPlaces.release();
            }
        });
    } else {
        mMap.addMarker(new MarkerOptions()
                .position(mDefaultLocation)
                .title(getString(R.string.default_info_title))
                .snippet(getString(R.string.default_info_snippet)));
    }
}

Hinweis: Diese Codezeile öffnet automatisch das Dialogfeld, wenn sie Locationnicht aktiviert ist.Diese Linie wird auch in Google Map verwendet

 status.startResolutionForResult(
 MainActivity.this,
 PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
AMAN SINGH
quelle
Was ist mLocationPermissionGranted ?
B Devloper
Dies dient zur Überprüfung, ob die Berechtigung für den Standort erteilt wurde oder nicht. Dies ist die run timeerteilte Erlaubnis.
AMAN SINGH
Sie können dies auch durch einfaches Setzen des Werts true
ausführen
2

Dieser Code funktioniert auf ROOTED-Telefonen:

public class MainActivity extends AppCompatActivity {

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

        String[] cmds = {"cd /system/bin" ,"settings put secure location_providers_allowed +gps"};
        try {
            Process p = Runtime.getRuntime().exec("su");
            DataOutputStream os = new DataOutputStream(p.getOutputStream());
            for (String tmpCmd : cmds) {
                os.writeBytes(tmpCmd + "\n");
            }
            os.writeBytes("exit\n");
            os.flush();
        }
        catch (IOException e){
            e.printStackTrace();
        }
    }
}

Zum Ausschalten von GPS können Sie stattdessen diesen Befehl verwenden

settings put secure location_providers_allowed -gps

Sie können die Netzwerkgenauigkeit auch mit den folgenden Befehlen umschalten: Zum Einschalten der Verwendung:

settings put secure location_providers_allowed +network

und zum Ausschalten können Sie verwenden:

settings put secure location_providers_allowed -network
DarwinFernandez
quelle
1

Seit diese Frage gestellt wurde, haben sich die Dinge geändert. Mit der neuen Google Services-API können Sie Benutzer auffordern, GPS zu aktivieren:

https://developers.google.com/places/android-api/current-place

Sie müssen die Berechtigung ACCESS_FINE_LOCATION in Ihrem Manifest anfordern:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Sehen Sie sich auch dieses Video an:

https://www.youtube.com/watch?v=F0Kh_RnSM0w

Hooman
quelle
Vielen Dank. Aber die Google Play Services 7 können mit alten Android-Versionen verwendet werden? (API 14 - 23)
JCarlosR
1

Dieser arbeitet für mich.

Es ist einfacher als die Antwort von Rj0078 in dieser Frage ( https://stackoverflow.com/a/42556648/11211963 ), aber diese Frage funktioniert auch.

Es zeigt einen Dialog wie diesen:

Geben Sie hier die Bildbeschreibung ein

(Geschrieben in Kotlin)

    googleApiClient = GoogleApiClient.Builder(context!!)
        .addApi(LocationServices.API).build()
    googleApiClient!!.connect()
    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)

    result =
       LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build())
    result!!.setResultCallback { result ->
        val status: Status = result.status
        when (status.statusCode) {
            LocationSettingsStatusCodes.SUCCESS -> {
               // Do something
            }
            LocationSettingsStatusCodes.RESOLUTION_REQUIRED ->
                try {
                    startResolutionForResult(),
                    status.startResolutionForResult(
                        activity,
                        REQUEST_LOCATION
                    )
                } catch (e: SendIntentException) {
                }
            LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE -> {
                // Do something
            }
        }
    }
Marci
quelle
0

Sie müssen nur die entfernen LocationListenerausLocationManager

manager.removeUpdates(listener);
Sass
quelle
-1

Verwenden Sie diesen Code Einfach und leicht zugänglich:

Berechtigungen:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

Befolgen Sie diesen Code, um programmgesteuert auf das GPS zuzugreifen:

LocationManager locationManager ;
 boolean GpsStatus ;


            GPSStatus();

            if(GpsStatus == true)
            {
                textview.setText("Your Location Services Is Enabled");
            }else
                {textview.setText("Your Location Services Is Disabled");}

            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(intent);


    public void GPSStatus(){
    locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
    GpsStatus = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
} 
Gaurav Lambole
quelle