Activar los proveedores de ubicación mediante programación en Android

¿Es posible activar LocationProviders (Proveedor de GPS / Proveedores de red) en el dispositivo de forma programática, si está desactivado?

No, no lo es, pero puede abrir la ventana Configuración de servicios de ubicación:

context.startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)); 

Habilitación de la ubicación con el modo Alta precisión o ahorro de la batería sin que el usuario necesite visitar Configuración

http://android-developers.blogspot.in/2015/03/google-play-services-70-places-everyone.html

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

Pero este código sólo admite hasta APK 8.

Sí, pero tienes que ser un Super User (sudo), Tu dispositivo debe estar enraizado.

Utilice el siguiente código para iniciar GPS

 locationManager = ( LocationManager ) getSystemService ( Context.LOCATION_SERVICE ); locationListener = new LocationListener(); locationManager.requestLocationUpdates ( LocationManager.GPS_PROVIDER, 0, 0, locationListener ); 

Y el siguiente código para detener GPS

 locationManager.removeUpdates( locationListener ); 

Para obtener más información, consulte las documentaciones de LocationManager y de LocationListener .

Con la reciente actualización de Marshmallow, incluso cuando la configuración de Ubicación esté activada, su aplicación requerirá pedir permiso explícitamente. La forma recomendada de hacerlo es mostrar la sección de permisos de su aplicación en la que el usuario puede alternar el permiso según sea necesario. El fragmento de código para hacer esto es el siguiente:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { final AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Location Permission"); builder.setMessage("The app needs location permissions. Please grant this permission to continue using the features of the app."); builder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION); } }); builder.setNegativeButton(android.R.string.no, null); builder.show(); } } else { LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); boolean isGpsProviderEnabled, isNetworkProviderEnabled; isGpsProviderEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); isNetworkProviderEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); if(!isGpsProviderEnabled && !isNetworkProviderEnabled) { final AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Location Permission"); builder.setMessage("The app needs location permissions. Please grant this permission to continue using the features of the app."); builder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(intent); } }); builder.setNegativeButton(android.R.string.no, null); builder.show(); } } 

Y reemplaza el método onRequestPermissionsResult como se muestra a continuación:

 @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case PERMISSION_REQUEST_COARSE_LOCATION: { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { Log.d(TAG, "coarse location permission granted"); } else { Intent intent = new Intent(); intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", getPackageName(), null); intent.setData(uri); startActivity(intent); } } } } 

Otro enfoque es que también puede usar SettingsApi para averiguar qué proveedores de ubicación están habilitados. Si no está activado, puede solicitar un diálogo para cambiar la configuración desde la aplicación.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.