¿Cómo puedo habilitar o deshabilitar el GPS mediante programación en Android?


158

Sé que la pregunta sobre activar / desactivar GPS mediante programación en Android se ha discutido muchas veces , y la respuesta es siempre la misma:

"No puede por razones de seguridad / privacidad, debe reenviar a la pantalla de preferencias de ubicación y dejar que el usuario lo habilite / deshabilite".

Entiendo que, sin embargo, recientemente compré Tasker en el mercado y, entre muchas otras cosas que puede lograr con él, puede establecer reglas para habilitar automáticamente el GPS al ingresar a aplicaciones predeterminadas y deshabilitarlo a la salida (consulte aquí para ver el tutorial sobre cómo hacerlo, ¡y simplemente funciona!) y esta aplicación no se puede firmar con la clave de firma de firmware, ya que funciona en muchas versiones de Android y dispositivos diferentes, y ni siquiera necesita ser rooteado.

Me gustaría hacer esto en mi aplicación. Por supuesto, no quiero volar la privacidad de los usuarios, por lo que primero le preguntaría al usuario si quiere activarlo automáticamente con la típica casilla de verificación "recordar mi decisión" y si responde que sí, habilítelo.

¿Alguien tiene alguna idea o idea de cómo Tasker logra esto?

Respuestas:


161

el GPS se puede activar explotando un error en el widget del administrador de energía. vea este hilo xda para discusión.

Aquí hay un código de ejemplo que uso

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

use lo siguiente para probar si la versión existente del widget de control de potencia es una que le permitirá alternar los 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
}

44
En el momento de este (mi) comentario, los enlaces en esta respuesta parecen indicar que el error que explota se ha solucionado recientemente. Solo quería señalar que el exploit todavía parece funcionar bien en mi propio entorno de prueba, por lo que no debería renunciar a intentar esto ... solo asegúrese de que su código manejará cualquier error si no funciona !
SilithCrowe

1
Al momento de escribir este comentario, este exploit todavía funciona en un teléfono Android 2.2.1. Bonito hallazgo, Ben H.
Qix - MONICA FUE MAL

38
Esta es una muy mala idea. Una vez que se solucione el error, su exploit ya no funcionará. Es mejor enviar al usuario a la aplicación de configuración.
Edward Falk

1
Funciona bien en Android 2.3.6 pero no funciona en Android 4.0.3. Cualquier idea para habilitar o deshabilitar en Android 4.0.3
Krishna

55
jajaja ... esta hazaña resurgió en 4.2.2, sorprendida de verla ... DIOS!
amithgc

70

Todas estas respuestas no están permitidas ahora. Aquí está la correcta:

Para todos aquellos que todavía buscan la respuesta:

Así es como lo están haciendo OLA Cabs y otras aplicaciones similares.

Agregue esto en su 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;
            }
        }
    });
}

Estos son los métodos implícitos:

@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

}

Aquí está la documentación de Android para el mismo.

Esto es para ayudar a otros hombres si todavía están luchando:

Editar : Agregar el comentario de Irfan Raza para obtener más ayuda.

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

Ahora esta respuesta debería ser la aceptada. Muchas gracias Akshat !!
Gurpreet

2
Necesita la integración del cliente API de Google, por lo tanto, solo es una solución para casos de uso específicos, no adecuada para una solución genérica.
Cik

@DilroopSingh, ¿qué problema estás enfrentando? Estoy usando el mismo código y funciona perfectamente.
Akshat

1
¿Podemos lograr esto sin mostrar ese generador? Porque necesito activar el GPS sin mostrar ninguna alerta.
Punithapriya

3
@Punithapriya Eso no es posible. El consentimiento del usuario es obligatorio y, por lo tanto, debe mostrarse ese generador.
Akshat

50

ACTIVAR GPS:

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

DESACTIVAR GPS:

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

1
GPS automáticamente se encenderá / apagará.
Depurador

1
Esto también ayuda a habilitar. private void turnGPSOn () {Proveedor de cadenas = Settings.Secure.getString (getContentResolver (), Settings.Secure.LOCATION_PROVIDERS_ALLOWED); if (! provider.contains ("gps")) {// si gps está desactivado Intent final poke = new Intent (); poke.setClassName ("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider"); poke.addCategory (Intención.CATEGORY_ALTERNATIVE); poke.setData (Uri.parse ("3")); sendBroadcast (poke); }}
Depurador

en Android 2.3.4 que se ejecuta en Samsung sII, activa el icono gps sin activar efectivamente el sensor gps. Pero, si elige activar el sensor GPS mediante programación, entonces se reconoce.
Tony Gil

24
Android 4.0.4: solo se habilita la notificación GPS . No el GPS en sí. así que parece que está encendido pero de hecho no lo está
alex

14
java.lang.SecurityException: Denegación de permiso: no se permite enviar difusión android.location.GPS_ENABLED_CHANGE
Abhi

28

Este código funciona en teléfonos ROOTED si la aplicación se mueve a /system/aps , y tienen los siguientes permisos en el manifiesto :

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

Código

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

55
+1 por mencionar este método. También debería funcionar con una aplicación del sistema en un dispositivo no enraizado.
AlexS

Esta es la manera correcta. Funciona en todas las versiones de Android, ¡no necesitas ningún truco!
BQuadra

¡apagar GPS no funciona! ¿podría decirme por qué y la posible solución?
Shivansh

ahora el GPS se apaga y se enciende perfectamente, pero el GPS no funciona, es decir, la ubicación es larga 0.0
Shivansh

<usos-permiso android: name = "android.permission.WRITE_SECURE_SETTINGS" /> solo para el sistema aps
sijo jose

23

En lugar de usar la configuración de intención.ACTION_LOCATION_SOURCE_SETTINGS, puede mostrar directamente una ventana emergente en su aplicación como Google Map y en Gps al hacer clic en el botón Aceptar, no es necesario redirigir a la configuración, simplemente necesita usar mi código como

Nota: Esta línea de código abre automáticamente el cuadro de diálogo si Ubicación no está activada. Este fragmento de línea también se usa en 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) {

}
} 

Nota: Esta línea de código abre automáticamente el cuadro de diálogo si Ubicación no está activada. Este fragmento de línea también se usa en Google Map


1
este código funciona bien pero no olvide el permiso de ubicación y el jar de servicio de reproducción en el archivo gradle ...
Akash pasupathi

22

Desde la versión 4.4 de Android, no puede habilitar / deshabilitar gps mediante programación. Si prueba el código propuesto en esta respuesta , se activará una excepción.

java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.location.GPS_ENABLED_CHANGE

2
Entonces, ¿es un comentario o cuál es la solución?
Shylendra Madda

@Shylendra Madda No hay solución para habilitar el GPS. Solo puede invocar el cuadro de diálogo del sistema correspondiente.
El increíble Jan

6

Para activar o desactivar el GPS mediante programación, necesita acceso 'root' y BusyBox instalado. Incluso con esos, la tarea no es trivial.

La muestra está aquí: Google Drive , Github , Sourceforge

Probado con los androides 2.3.5 y 4.1.2.


La muestra ya no está disponible.
Desarrollador de Android

Aquí está lo último: rapidshare.com/files/1458124346/GPSToggler-20130222.7z Borré la versión anterior por accidente. BusyBox ya no es necesario.
OGP

Todavía no disponible. tal vez use un servicio de carga de archivos diferente?
Desarrollador de Android

Hice la carpeta pública y verificada. Ahora se puede descargar. También mi FTP privado aquí: StackExchange: se@oldgopher.gotdns.com
OGP


5

La respuesta correcta anterior es muy antigua, necesita algo nuevo, así que aquí está la respuesta

Como en la última actualización, tenemos soporte para Androidx, así que primero incluya la dependencia en el archivo build.gradle de su nivel de aplicación

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

luego agregue en su archivo de manifiesto:

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

no olvides pedir el consentimiento del usuario para estos permisos si estás liberando

ahora aquí está el código solo úsalo

 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 algo sale mal por favor envíame un ping


2

Se desarrolló una respuesta en otra pregunta, pero estaba cerrada, y me gustaría que la comunidad también la probara.

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

Ver este comentario

Esta solución requeriría los permisos WRITE_SETTINGSy WRITE_SECURE_SETTINGS.


@milind, supongamos que tengo un dispositivo rooteado, ¿qué debo hacer para usar este código? Intenté obtener un permiso de root para la aplicación, pero no me ayudó. sigue diciendo "Denegación de permisos: escribir en configuraciones seguras requiere android.permission.WRITE_SECURE_SETTINGS"
desarrollador de Android

@android Lea la última oración de esta publicación. El uso de este método requerirá el android.permission.WRITE_SECURE_SETTINGSpermiso en el Manifiesto.
gobernador

1
Lo sé . Ya lo agregué. me dice que a pesar de que ya está en el manifiesto.
Desarrollador de Android


¿Es imposible incluso para dispositivos rooteados?
Desarrollador de Android

2

Tal vez con trucos de reflexión alrededor de la clase. android.server.LocationManagerService .

Además, hay un método (desde API 8) android.provider.Settings.Secure.setLocationProviderEnabled


3
Esta Settings.Secureclase parece prometedora, sin embargo, recibo una excepción de seguridad que dice que necesito android.permission.WRITE_SECURE_SETTINGS, y sigo recibiendo el error incluso agregando este permiso (y WRITE_SETTINGS también) a mi manifiesto. Pero parece una buena manera de seguir buscando. Gracias :)
maid450

WRITE_SECURE_SETTINGStiene un nivel de protecciónsystemOrSignature que necesita para que esa aplicación sea una aplicación del sistema para que funcione, lo que también se menciona en esta respuesta .
Flujo

2

Esta es la mejor solución proporcionada por Google Developers. Simplemente llame a este método en onResume of onCreate después de inicializar 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)));
    }
}

Nota: Esta línea de código abre automáticamente el cuadro de diálogo siLocation no está activado. Este fragmento de línea también se usa en Google Map

 status.startResolutionForResult(
 MainActivity.this,
 PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);

¿Qué es mLocationPermissionGranted ?
b devloper

eso es para verificar si el permiso se otorga o no para la ubicación. Este es un run timepermiso otorgado.
AMAN SINGH

también puede hacerlo simplemente estableciendo el valor verdadero, si ya otorgó el permiso en un dispositivo previo a la piruleta
AMAN SINGH

2

Este código funciona en teléfonos 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();
        }
    }
}

Para apagar el GPS, puedes usar este comando

settings put secure location_providers_allowed -gps

También puede alternar la precisión de la red con los siguientes comandos: para activar el uso:

settings put secure location_providers_allowed +network

y para apagar puedes usar:

settings put secure location_providers_allowed -network

1

Las cosas han cambiado desde que se publicó esta pregunta, ahora con la nueva API de servicios de Google, puede solicitar a los usuarios que habiliten el GPS:

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

Deberá solicitar el permiso ACCESS_FINE_LOCATION en su manifiesto:

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

Mira también este video:

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


Gracias. ¿Pero Google Play Services 7 se puede usar con versiones antiguas de Android? (API 14 - 23)
JCarlosR

1

Esta funciona para mí.

Es más simple que la respuesta de Rj0078 en esta pregunta ( https://stackoverflow.com/a/42556648/11211963 ), pero esa también funciona.

Muestra un diálogo como este:

ingrese la descripción de la imagen aquí

(Escrito 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
            }
        }
    }


-1

Utilice este código simple y fácil de acceder:

Permisos:

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

Siga este código para acceder al GPS mediante programación:

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);
} 
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.