Comment puis-je activer ou désactiver le GPS par programmation sur Android?

158

Je sais que la question sur l'activation / la désactivation du GPS par programme sur Android a été discutée à plusieurs reprises , et la réponse est toujours la même:

"Vous ne pouvez pas pour des raisons de sécurité / confidentialité, vous devez transférer à l'écran des préférences de localisation et laisser l'utilisateur l'activer / le désactiver."

Je comprends que, cependant, j'ai récemment acheté Tasker sur le marché et, parmi beaucoup d'autres choses que vous pouvez accomplir avec lui, vous pouvez définir des règles pour activer automatiquement le GPS lors de l'accès à des applications prédéterminées et le désactiver à la sortie (voir ici pour le tutoriel sur la façon de le faire, et cela fonctionne!) Et cette application ne peut pas être signée avec la clé de signature du micrologiciel car elle fonctionne sur de nombreuses versions d'Android et différents appareils et vous n'avez même pas besoin d'être rooté.

J'aimerais faire cela dans mon application. Bien sûr, je ne veux pas faire exploser la confidentialité des utilisateurs, donc je demanderais d'abord à l'utilisateur s'il veut l'activer automatiquement avec la case à cocher typique "se souvenir de ma décision" et s'il répond oui, activez-la.

Quelqu'un a-t-il une idée ou un indice sur la façon dont Tasker y parvient?

femme de chambre450
la source

Réponses:

161

le GPS peut être basculé en exploitant un bogue dans le widget du gestionnaire d'alimentation. voir ce fil xda pour discussion.

voici un exemple de code que j'utilise

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

utilisez ce qui suit pour tester si la version existante du widget de contrôle de l'alimentation est celle qui vous permettra de basculer le GPS.

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
la source
4
Au moment de ce (mon) commentaire, les liens de cette réponse semblent indiquer que le bogue exploité par cet exploit a été récemment corrigé. Je voulais juste souligner que l'exploit semble toujours fonctionner correctement dans mon propre environnement de test, vous ne devriez donc pas renoncer à essayer ceci ... assurez-vous simplement que votre code gérera toutes les erreurs si cela ne fonctionne pas !
SilithCrowe
1
Au moment de la rédaction de ce commentaire, cet exploit fonctionne toujours sur un téléphone Android 2.2.1. Belle trouvaille, Ben H.
Qix - MONICA A ÉTÉ MISTREATED
38
C'est une très mauvaise idée. Une fois le bogue corrigé, votre exploit ne fonctionnera plus. Mieux vaut simplement envoyer l'utilisateur à l'application des paramètres.
Edward Falk
1
Fonctionne bien sous Android 2.3.6 mais ne fonctionne pas sous Android 4.0.3. Toute idée d'activer ou de désactiver dans Android 4.0.3
Krishna
5
hahaha ... cet exploit est réapparu dans 4.2.2, surpris de le voir .. DIEU!
amithgc
70

Toutes ces réponses ne sont pas autorisées maintenant. Voici la bonne:

Pour tous ceux qui recherchent encore la réponse:

Voici comment OLA Cabs et d'autres applications similaires le font.

Ajoutez ceci dans votre onCreate

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

Voici les méthodes implémentées:

@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

}

Voici la documentation Android pour le même.

C'est pour aider les autres gars s'ils ont encore du mal:

Edit : Ajout du commentaire d'Irfan Raza pour plus d'aide.

@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
la source
Maintenant, cette réponse devrait être celle acceptée. Merci beaucoup Akshat !!
Gurpreet
2
Nécessite l'intégration du client API Google, donc uniquement une solution pour des cas d'utilisation spécifiques, non adaptée à une solution générique
Cik
@DilroopSingh quel problème rencontrez-vous.? J'utilise le même code et cela fonctionne parfaitement.
Akshat
1
pouvons-nous y parvenir sans montrer ce constructeur, car je dois activer le GPS sans afficher d'alertes.
Punithapriya
3
@Punithapriya Ce n'est pas possible. Le consentement de l'utilisateur est nécessaire et donc ce constructeur doit être montré.
Akshat
50

ACTIVER LE GPS:

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

DÉSACTIVER LE GPS:

Intent intent = new Intent("android.location.GPS_ENABLED_CHANGE");
intent.putExtra("enabled", false);
sendBroadcast(intent);
Débogueur
la source
1
automatiquement le GPS s'allumera / s'éteindra.
Débogueur
1
Cela aide également à activer. private void turnGPSOn () {String provider = Settings.Secure.getString (getContentResolver (), Settings.Secure.LOCATION_PROVIDERS_ALLOWED); if (! provider.contains ("gps")) {// si le gps est désactivé 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 (piquer); }}
Débogueur
dans Android 2.3.4 fonctionnant sur asamsung sII, il active l'icône gps sans activer efficacement le capteur gps. Mais, si vous choisissez d'activer le capteur GPS par programme, il est alors reconnu.
tony gil
24
Android 4.0.4 - seule la notification GPS est activée. pas le GPS lui-même. il semble que ce soit sur mais en fait ce n'est pas
alex
14
java.lang.SecurityException: Refus d'autorisation: non autorisé à envoyer une diffusion android.location.GPS_ENABLED_CHANGE
Abhi
28

Ce code fonctionne sur ROOTED téléphones si l'application est déplacé /system/aps , et ils ont les autorisations suivantes dans le manifeste :

<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
la source
5
+1 pour avoir mentionné cette méthode. Il devrait également fonctionner avec une application système sur un appareil non rooté.
AlexS
C'est le bon chemin. Fonctionne sur toutes les versions d'Android, pas besoin de truc!
BQuadra
éteindre le GPS ne fonctionne pas !! pouvez-vous s'il vous plaît me dire pourquoi et la solution possible.
Shivansh
maintenant, le GPS s'éteint et
s'allume
<uses-permission android: name = "android.permission.WRITE_SECURE_SETTINGS" /> uniquement pour le système aps
sijo jose
23

Au lieu d'utiliser les paramètres d'intention.ACTION_LOCATION_SOURCE_SETTINGS, vous pouvez directement afficher des fenêtres contextuelles dans votre application comme Google Map et sur Gps en cliquant sur le bouton OK, il n'est pas nécessaire de rediriger vers le paramètre, vous devez simplement utiliser mon code comme

Remarque: Cette ligne de code ouvre automatiquement la boîte de dialogue si l'emplacement n'est pas activé. Ce morceau de ligne est également utilisé dans Google Map

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

}
} 

Remarque: Cette ligne de code ouvre automatiquement la boîte de dialogue si l'emplacement n'est pas activé. Ce morceau de ligne est également utilisé dans Google Map

Le cheval noir
la source
1
ce code fonctionne bien mais n'oubliez pas l'autorisation de localisation et le fichier de service de jeu dans le fichier gradle ...
Akash pasupathi
22

Depuis la version Android 4.4, vous ne pouvez pas activer / désactiver le GPS par programme. Si vous essayez le code proposé sur cette réponse , une exception sera déclenchée.

java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.location.GPS_ENABLED_CHANGE
Amaury Medeiros
la source
2
Alors, est-ce un commentaire ou bien quelle est la solution?
Shylendra Madda
@Shylendra Madda Il n'y a pas de solution pour activer le GPS. Vous ne pouvez appeler que la boîte de dialogue système correspondante.
L'incroyable
6

Pour activer ou désactiver le GPS par programme, vous avez besoin d'un accès «root» et BusyBox installé. Même avec ceux-ci, la tâche n'est pas anodine.

L'échantillon est ici: Google Drive , Github , Sourceforge

Testé avec les androïdes 2.3.5 et 4.1.2.

OGP
la source
l'échantillon n'est plus disponible.
développeur android
Voici la dernière: rapidshare.com/files/1458124346/GPSToggler-20130222.7z J'ai effacé l'ancienne version par accident. BusyBox n'est plus nécessaire.
OGP
toujours pas disponible. peut-être utiliser un autre service de téléchargement de fichiers?
développeur android
J'ai rendu le dossier public et vérifié. Maintenant, il peut être téléchargé. Aussi mon FTP privé ici: StackExchange: [email protected]
OGP
5

La réponse ci-dessus est très ancienne, elle a besoin de quelque chose de nouveau, voici la réponse

Comme dans la dernière mise à jour, nous avons le support androidx, alors incluez d'abord la dépendance dans votre fichier build.gradle au niveau de l'application

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

puis ajoutez dans votre fichier manifeste:

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

n'oubliez pas de prendre le consentement de l'utilisateur pour ces autorisations si vous libérez

maintenant, voici le code, utilisez-le

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

si quelque chose ne va pas, envoyez-moi un ping

Mratyunjay Tripathi
la source
2

Une réponse a été développée dans une autre question, mais elle a été fermée, et j'aimerais que la communauté l'essaie également.

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

Voir ce commentaire

Cette solution nécessiterait les autorisations WRITE_SETTINGSet WRITE_SECURE_SETTINGS.

gobernador
la source
@milind, supposons que j'ai un appareil rooté, que dois-je faire pour utiliser ce code? J'ai essayé d'obtenir une autorisation root pour l'application, mais cela n'a pas aidé. il n'arrête pas de dire "Refus d'autorisation: l'écriture dans les paramètres sécurisés nécessite android.permission.WRITE_SECURE_SETTINGS"
développeur Android
@android Lisez la dernière phrase de cet article. L'utilisation de cette méthode nécessitera l' android.permission.WRITE_SECURE_SETTINGSautorisation dans le manifeste.
gobernador
1
je connais . je l'ai déjà ajouté. cela me dit que même si c'est déjà dans le manifeste.
développeur android
donc c'est impossible même pour les appareils rootés?!
développeur android
2

Peut-être avec des astuces de réflexion autour de la classe android.server.LocationManagerService.

Aussi, il existe une méthode (depuis l'API 8) android.provider.Settings.Secure.setLocationProviderEnabled

Damian Kołakowski
la source
3
Cette Settings.Secureclasse semble prometteuse, mais j'obtiens une exception de sécurité indiquant que j'ai besoin de android.permission.WRITE_SECURE_SETTINGS, et j'obtiens l'erreur même en ajoutant cette autorisation (et WRITE_SETTINGS également) à mon manifeste. Mais cela semble un bon moyen de continuer à chercher. Merci :)
maid450
WRITE_SECURE_SETTINGSa un niveau de protection dontsystemOrSignature vous avez besoin pour faire de cette application une application système pour qu'elle fonctionne, ce qui est également mentionné dans cette réponse .
Débit le
2

C'est la meilleure solution fournie par Google Developers. Appelez simplement cette méthode dans onResume de onCreate après l'initialisation 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)));
    }
}

Remarque: Cette ligne de code ouvre automatiquement la boîte de dialogue si elle Locationn'est pas activée. Ce morceau de ligne est également utilisé dans Google Map

 status.startResolutionForResult(
 MainActivity.this,
 PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
AMAN SINGH
la source
Qu'est-ce que mLocationPermissionGranted ?
b devloper
c'est pour vérifier si l'autorisation est accordée ou non pour la localisation. c'est la run timepermission accordée.
AMAN SINGH
vous pouvez également consulter simplement en réglant la valeur true, si vous avez déjà reçu l'autorisation de pré-lollipop appareil
AMAN SINGH
2

Ce code fonctionne sur les téléphones ROOTED:

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

Pour désactiver le GPS, vous pouvez utiliser cette commande à la place

settings put secure location_providers_allowed -gps

Vous pouvez également basculer la précision du réseau à l'aide des commandes suivantes: pour activer l'utilisation:

settings put secure location_providers_allowed +network

et pour éteindre, vous pouvez utiliser:

settings put secure location_providers_allowed -network
DarwinFernandez
la source
1

Les choses ont changé depuis la publication de cette question, maintenant avec la nouvelle API Google Services, vous pouvez inviter les utilisateurs à activer le GPS:

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

Vous devrez demander l'autorisation ACCESS_FINE_LOCATION dans votre manifeste:

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

Regardez également cette vidéo:

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

Hooman
la source
Merci. Mais les services Google Play 7 peuvent être utilisés avec les anciennes versions d'Android? (API
14-23
1

Celui-ci fonctionne pour moi.

C'est plus simple que la réponse de Rj0078 à cette question ( https://stackoverflow.com/a/42556648/11211963 ), mais celle-ci fonctionne également.

Il montre une boîte de dialogue comme celle-ci:

entrez la description de l'image ici

(Écrit en 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
la source
0

Il vous suffit de supprimer le LocationListenerdeLocationManager

manager.removeUpdates(listener);
toupet
la source
-1

Utilisez ce code simple et facile d'accès:

Autorisations:

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

Suivez ce code pour accéder au GPS par programmation:

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