web-dev-qa-db-fra.com

Comment allumer le GPS Android

Je développe une application Android qui doit activer le GPS.

J'ai lu beaucoup de sujets dans de nombreux forums et la réponse que j'ai trouvée est:

ce n'est pas possible

Mais ... l'APP "Cerberus" allume mon GPS ... alors ... c'est possible!

Est-ce que quelqu'un peut m'aider avec ça?

14
Elvis Oliveira

Non, ce n'est pas impossible et inapproprié. Vous ne pouvez pas simplement gérer le téléphone des utilisateurs sans son autorisation.

Depuis Play Store:

"Cerberus active automatiquement le GPS s'il est éteint lorsque vous essayez de localiser votre appareil (uniquement sur Android <2.3.3) et vous pouvez le protéger d'une désinstallation non autorisée - plus d'informations dans la configuration de l'application. "

Vous pouvez faire quelque chose comme ça:

startActivity(new Intent(Android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
18
goodm

Il y avait un exploit qui permettait au GPS d'être activé par une application sans autorisations spéciales. Cet exploit n'existe plus à partir de la version 2.3 (dans la plupart des ROM). Voici un autre article qui en parle,

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

"GPS activé" est un paramètre sécurisé, vous devez donc disposer de l'autorisation WRITE_SECURE_SETTINGS. Cependant, il s'agit d'une autorisation protégée par signature, de sorte que votre application ne sera pas accordée à moins qu'elle ne soit signée avec le certificat de plate-forme du fabricant.

La bonne chose est d'envoyer l'utilisateur à la page des paramètres de localisation et de le laisser activer le GPS s'il le souhaite. par exemple.,

Intent i = new
Intent(Android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(i);
11
Jeffrey Blattman

Je pense que nous avons une meilleure version pour activer l'emplacement sans ouvrir les paramètres, tout comme Google Maps fonctionne.

Cela ressemblera à ceci -

enter image description here

Ajouter une dépendance dans gradle - compiler 'com.google.Android.gms: play-services-location: 10.0.1'

public class MapActivity 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) MapActivity.this.getSystemService(Context.LOCATION_SERVICE);
        if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER) && hasGPSDevice(MapActivity.this)) {
            Toast.makeText(MapActivity.this,"Gps already enabled",Toast.LENGTH_SHORT).show();
            finish();
        }
        // Todo Location Already on  ... end

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

        if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER) && hasGPSDevice(MapActivity.this)) {
            Log.e("TAG","Gps already enabled");
            Toast.makeText(MapActivity.this,"Gps not enabled",Toast.LENGTH_SHORT).show();
            enableLoc();
        }else{
            Log.e("TAG","Gps already enabled");
            Toast.makeText(MapActivity.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(MapActivity.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(MapActivity.this, REQUEST_LOCATION);

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

}
7
Anirban
    if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage(R.string.gps_disabled_message)
        .setCancelable(false)
        .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                    Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                    startActivity(intent);                  
            }
        })
        .setNegativeButton("No", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();
            }
        });
        AlertDialog alert = builder.create();
        alert.show();
    }

Cela crée une alerte et permet à l'utilisateur d'accéder à l'écran des paramètres et d'appuyer sur le bouton de retour pour revenir directement à votre application. L'exploit de widget de puissance ne fonctionne pas au-delà de 2.3 à ma connaissance.

5
Kevin

Utilisez ce code // turnGPSON appelé After setcontentView (xml)

 private void turnGPSOn() {

    String provider = Android.provider.Settings.Secure.getString(
            getContentResolver(),
            Android.provider.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);
    }
}**
2
Sanket

vous voudrez peut-être consulter ce fil

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

voici les codes copiés à partir de ce fil

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


   }
}

mais la solution n'est pas recommandée car elle ne sera pas disponible pour Android version> 2.3 en supposant .. vérifiez les commentaires

1
Rejinderi