siempre rastrear por otro localizar impedir google encontrar dispositivo desde desactivar como celular aplicacion activo activado android gps location-services

rastrear - Active el GPS de forma programática, como la aplicación de Android Ola Cabs



rastrear celular sin aplicacion (7)

Estoy trabajando en una aplicación y necesito integrar la ubicación del GPS. Quiero activar el GPS programáticamente. La condición es: No deseo enviar al usuario al panel de Configuración para habilitarlo. Quiero habilitarlo con fuerza o un solo indicador funcionará (similar a la aplicación de Android de las cabinas de Ola). Hay muchas preguntas para esto en este sitio, pero todo el mundo está buscando una funcionalidad similar a la de la aplicación Ola Cabs. Así que comencé este hilo para que quede claro para todos nosotros.


Aquí tengo el código de usuario

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

Permisos en su archivo de manifiesto:

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


Verifica el código a continuación. En primer lugar, comprobará si la ubicación está habilitada o no y le indicará al usuario que habilite la ubicación.

private GoogleApiClient googleApiClient; final static int REQUEST_LOCATION = 199; // check whether gps is enabled public boolean noLocation() { final LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { // buildAlertMessageNoGps(); enableLoc(); return true; } return false; } private void enableLoc() { if (googleApiClient == null) { googleApiClient = new GoogleApiClient.Builder(this) .addApi(LocationServices.API) .addConnectionCallbacks(this) .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() { @Override public void onConnectionFailed(ConnectionResult connectionResult) { Timber.v("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( (Activity) context, REQUEST_LOCATION); } catch (IntentSender.SendIntentException e) { // Ignore the error. } break; } } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case REQUEST_LOCATION: switch (resultCode) { case Activity.RESULT_CANCELED: { // The user was asked to change settings, but chose not to finish(); break; } default: { break; } } break; } } }



Aquí está mi código de 100% de trabajo primero agregue esta compile ''com.google.android.gms:play-services:9.2.1'' a su build.gradle (Módulo: aplicación)

Después de eso crea una clase con el nombre StartLocationAlert.java y copia este código y pégalo en este archivo

import android.app.Activity; import android.content.IntentSender; import android.net.wifi.WifiManager; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.Log; import android.widget.Toast; import com.example.googlemappromt.MainActivity; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.common.api.PendingResult; import com.google.android.gms.common.api.ResultCallback; import com.google.android.gms.common.api.Status; import com.google.android.gms.location.LocationRequest; import com.google.android.gms.location.LocationServices; import com.google.android.gms.location.LocationSettingsRequest; import com.google.android.gms.location.LocationSettingsResult; import com.google.android.gms.location.LocationSettingsStates; import com.google.android.gms.location.LocationSettingsStatusCodes; import com.google.android.gms.vision.barcode.Barcode; /** * Created by Anirudh on 20/07/16. */ public class StartLocationAlert implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { Activity context; protected static final int REQUEST_CHECK_SETTINGS = 0x1; GoogleApiClient googleApiClient; public StartLocationAlert(Activity context) { this.context = context; googleApiClient = getInstance(); if(googleApiClient != null){ //googleApiClient.connect(); settingsrequest(); googleApiClient.connect(); } } public GoogleApiClient getInstance(){ GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(context).addConnectionCallbacks(this).addOnConnectionFailedListener(this).addApi(LocationServices.API).build(); return mGoogleApiClient; } public void settingsrequest() { Log.e("settingsrequest","Comes"); 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. // Log.e("Application","Button Clicked"); break; case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: // Location settings are not satisfied. But could be fixed by showing the user // a dialog. // Log.e("Application","Button Clicked1"); try { // Show the dialog by calling startResolutionForResult(), // and check the result in onActivityResult(). status.startResolutionForResult(context, REQUEST_CHECK_SETTINGS); } catch (IntentSender.SendIntentException e) { // Ignore the error. Log.e("Applicationsett",e.toString()); } 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. //Log.e("Application","Button Clicked2"); Toast.makeText(context, "Location is Enabled", Toast.LENGTH_SHORT).show(); break; } } }); } @Override public void onConnected(@Nullable Bundle bundle) { /* MainActivity mm = new MainActivity(); mm.requestLocationUpdates();*/ Toast.makeText(context , "Connected", Toast.LENGTH_SHORT).show(); } @Override public void onConnectionSuspended(int i) { } @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { } }

El uso de esta clase superior se muestra a continuación

@Override protected void onResume() { super.onResume(); Activity mContext = MainActivity.this //change this your activity name StartLocationAlert startLocationAlert = new StartLocationAlert(mContext); requestLocationUpdates(); }

Y no se olvide de agregar permisos debajo en el archivo AndroidManifest.xml o de lo contrario esto podría no funcionar correctamente

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

Espero que esto te ayude ...


Creé una biblioteca basada en la respuesta de Anirudh.

Breve guía de cómo usarlo:

  1. Agrégalo a tu archivo build.gradle:

    compilar ''net.alexandroid.utils: gps: 1.6''

  2. Implementar la interfaz GpsStatusDetectorCallBack.

  3. Implementar métodos de interfaz : onGpsSettingStatus y onGpsAlertCanceledByUser

  4. Crear variable de instancia:

    GpsStatusDetector privado mGpsStatusDetector;

  5. Crear una instancia en onCreate ():

    mGpsStatusDetector = new GpsStatusDetector (this);

  6. En su lugar, debe verificar el estado y mostrar un cuadro de diálogo si es necesario agregar : mGpsStatusDetector.checkLocationSettingStatus ();

  7. Anular onActivityResult y agregar allí:

    mGpsStatusDetector.checkOnActivityResult (requestCode, resultCode);

Más información sobre la biblioteca: https://github.com/Pulimet/GpsDetector-Library

Ejemplo:

public class MainActivity extends AppCompatActivity implements GpsStatusDetector.GpsStatusDetectorCallBack { private GpsStatusDetector mGpsStatusDetector; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mGpsStatusDetector = new GpsStatusDetector(this); mGpsStatusDetector.checkLocationSettingStatus(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); mGpsStatusDetector.checkOnActivityResult(requestCode, resultCode); } @Override public void onGpsSettingStatus(boolean enabled) { Log.d("TAG", "onGpsSettingStatus: " + enabled); } @Override public void onGpsAlertCanceledByUser() { Log.d("TAG", "onGpsAlertCanceledByUser"); } }


package com.example.user.myGPS; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.content.IntentSender; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.common.api.PendingResult; import com.google.android.gms.common.api.ResultCallback; import com.google.android.gms.location.LocationRequest; import com.google.android.gms.location.LocationServices; import com.google.android.gms.location.LocationSettingsRequest; import com.google.android.gms.location.LocationSettingsResult; import com.google.android.gms.location.LocationSettingsStates; import com.google.android.gms.location.LocationSettingsStatusCodes; public class MainActivity extends AppCompatActivity { private GoogleApiClient googleApiClient; final int REQUEST_CHECK_SETTINGS = 0x1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //-------Code to turn on GPS------------------ if (googleApiClient == null) { googleApiClient = new GoogleApiClient.Builder(MainActivity.this) .addApi(LocationServices.API).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); builder.setNeedBle(true); PendingResult<LocationSettingsResult> result = LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build()); result.setResultCallback(new ResultCallback<LocationSettingsResult>() { @Override public void onResult(LocationSettingsResult result) { final com.google.android.gms.common.api.Status status = result.getStatus(); final LocationSettingsStates state = result.getLocationSettingsStates(); switch (status.getStatusCode()) { case LocationSettingsStatusCodes.SUCCESS: break; case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: try { status.startResolutionForResult(MainActivity.this,REQUEST_CHECK_SETTINGS); } catch (IntentSender.SendIntentException e) {} break; case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: break; } } }); } } }


Como SettingsApi está en desuso y luego de ingresar al sitio del desarrollador aquí . Logré el mismo resultado que la aplicación Ola.

Agrega el siguiente método en tu clase de actividad

private void switchOnGPS() { LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder() .addLocationRequest(new LocationRequest().setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)); Task<LocationSettingsResponse> task = LocationServices.getSettingsClient(this).checkLocationSettings(builder.build()); task.addOnCompleteListener(new OnCompleteListener<LocationSettingsResponse>() { @Override public void onComplete(@NonNull Task<LocationSettingsResponse> task) { try { LocationSettingsResponse response = task.getResult(ApiException.class); } catch (ApiException e) { switch (e.getStatusCode()) { case LocationSettingsStatusCodes.RESOLUTION_REQUIRED : ResolvableApiException resolvableApiException = (ResolvableApiException) e; try { resolvableApiException.startResolutionForResult(MainActivity.this,REQUEST_CHECK_SETTINGS); } catch (IntentSender.SendIntentException e1) { e1.printStackTrace(); } break; case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: //open setting and switch on GPS manually break; } } } }); //Give permission to access GPS ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 11); }

Llame al método anterior en el método onResume de su actividad como a continuación

@Override protected void onResume() { super.onResume(); switchOnGPS(); }

Agregue el permiso de Ubicación respectivo en el archivo de Manifiesto.