Encender GPS android 4.4

Hola, escribo con la novedad que los métodos para encender el GPS de android hasta antes del API 19 YA NO SIRVEN, esto es a partir del lanzamiento de Android 4.4.

Por lo tanto, antes usabamos algo así:

 

// Encender GPS antes del API 19

public void turnGPSOn()

{

    Intent intent = new Intent(“android.location.GPS_ENABLED_CHANGE”);

    intent.putExtra(“enabled”, true);

    this.sendBroadcast(intent);

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

    }

}

// apagar gps

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

    }

}

Ahora en android 4.4 demos crear una clase llamada GPSService, la cual contendrá el siguiente código:

package com.example.dialisis;

import java.io.IOException;
import java.util.List;
import java.util.Locale;

import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;

public class GPSService extends Service implements LocationListener

{
// saving the context for later use
private final Context mContext;
// if GPS is enabled
boolean isGPSEnabled = false;
// if Netwenter code hereork is enabled
boolean isNetworkEnabled = false;
// if Location co-ordinates are available using GPS or Network
public boolean isLocationAvailable = false;

// Location and co-ordinates coordinates
Location mLocation;
double mLatitude;
double mLongitude;

// Minimum time fluctuation for next update (in milliseconds)
private static final long TIME = 30000;
// Minimum distance fluctuation for next update (in meters)
private static final long DISTANCE = 20;

// Declaring a Location Manager
protected LocationManager mLocationManager;

public GPSService(Context context) {
this.mContext = context;
mLocationManager = (LocationManager) mContext
.getSystemService(LOCATION_SERVICE);

}

/**
* Returs the Location
*
* @return Location or null if no location is found
*/
public Location getLocation() {
try {

// Getting GPS status
isGPSEnabled = mLocationManager
.isProviderEnabled(LocationManager.GPS_PROVIDER);

// If GPS enabled, get latitude/longitude using GPS Services
if (isGPSEnabled) {
mLocationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER, TIME, DISTANCE, this);
if (mLocationManager != null) {
mLocation = mLocationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (mLocation != null) {
mLatitude = mLocation.getLatitude();
mLongitude = mLocation.getLongitude();
isLocationAvailable = true; // setting a flag that
// location is available
return mLocation;
}
}
}

// If we are reaching this part, it means GPS was not able to fetch
// any location
// Getting network status
isNetworkEnabled = mLocationManager
.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

if (isNetworkEnabled) {
mLocationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER, TIME, DISTANCE, this);
if (mLocationManager != null) {
mLocation = mLocationManager
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (mLocation != null) {
mLatitude = mLocation.getLatitude();
mLongitude = mLocation.getLongitude();
isLocationAvailable = true; // setting a flag that
// location is available
return mLocation;
}
}
}
// If reaching here means, we were not able to get location neither
// from GPS not Network,
if (!isGPSEnabled) {
// so asking user to open GPS
askUserToOpenGPS();
}

} catch (Exception e) {
e.printStackTrace();
}
// if reaching here means, location was not available, so setting the
// flag as false
isLocationAvailable = false;
return null;
}

/**
* Gives you complete address of the location
*
* @return complete address in String
*/
public String getLocationAddress() {

if (isLocationAvailable) {

Geocoder geocoder = new Geocoder(mContext, Locale.getDefault());
// Get the current location from the input parameter list
// Create a list to contain the result address
List<Address> addresses = null;
try {
/*
* Return 1 address.
*/
addresses = geocoder.getFromLocation(mLatitude, mLongitude, 1);
} catch (IOException e1) {
e1.printStackTrace();
return (“IO Exception trying to get address:” + e1);
} catch (IllegalArgumentException e2) {
// Error message to post in the log
String errorString = “Illegal arguments “
+ Double.toString(mLatitude) + ” , “
+ Double.toString(mLongitude)
+ ” passed to address service”;
e2.printStackTrace();
return errorString;
}
// If the reverse geocode returned an address
if (addresses != null && addresses.size() > 0) {
// Get the first address
Address address = addresses.get(0);
/*
* Format the first line of address (if available), city, and
* country name.
*/
String addressText = String.format(
“%s, %s, %s”,
// If there’s a street address, add it
address.getMaxAddressLineIndex() > 0 ? address
.getAddressLine(0) : “”,
// Locality is usually a city
address.getLocality(),
// The country of the address
address.getCountryName());
// Return the text
return addressText;
} else {
return “No address found by the service: Note to the developers, If no address is found by google itself, there is nothing you can do about it.”;
}
} else {
return “Location Not available”;
}

}

/**
* get latitude
*
* @return latitude in double
*/
public double getLatitude() {
if (mLocation != null) {
mLatitude = mLocation.getLatitude();
}
return mLatitude;
}

/**
* get longitude
*
* @return longitude in double
*/
public double getLongitude() {
if (mLocation != null) {
mLongitude = mLocation.getLongitude();
}
return mLongitude;
}

/**
* close GPS to save battery
*/
public void closeGPS() {
if (mLocationManager != null) {
mLocationManager.removeUpdates(GPSService.this);
}
}

/**
* show settings to open GPS
*/
public void askUserToOpenGPS() {
AlertDialog.Builder mAlertDialog = new AlertDialog.Builder(mContext);

// Setting Dialog Title
mAlertDialog
.setTitle(“Location not available, Open GPS?”)
.setMessage(“Activate GPS to use use location services?”)
.setPositiveButton(“Open Settings”,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
Intent intent = new Intent(
Settings.ACTION_LOCATION_SOURCE_SETTINGS);
mContext.startActivity(intent);
}
})
.setNegativeButton(“Cancel”,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
dialog.cancel();
}
}).show();
}

/**
* Updating the location when location changes
*/
@Override
public void onLocationChanged(Location location) {
mLatitude = location.getLatitude();
mLongitude = location.getLongitude();
}

@Override
public void onProviderDisabled(String provider) {
}

@Override
public void onProviderEnabled(String provider) {
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}

@Override
public IBinder onBind(Intent arg0) {
return null;
}
}

 

 

Listo, ahora haremos un botón que llame a un método como el siguiente:

 

public String getUbicacion(){

//turnGPSOn();

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

//enableLocation();

String address = “”;

        GPSService mGPSService = new GPSService(this);

        mGPSService.getLocation();

        if (mGPSService.isLocationAvailable == false) {

            // Here you can ask the user to try again, using return; for that

            Toast.makeText(this, “Your location is not available, please try again.”, Toast.LENGTH_SHORT).show();

            //return;

            // Or you can continue without getting the location, remove the return; above and uncomment the line given below

            // address = “Location not available”;

        } else {

            // Getting location co-ordinates

            double latitude = mGPSService.getLatitude();

            double longitude = mGPSService.getLongitude();

            Toast.makeText(this, “Latitude:” + latitude + ” | Longitude: “ + longitude, Toast.LENGTH_LONG).show();

            address = mGPSService.getLocationAddress();

            //tvLocation.setText(“Latitude: ” + latitude + ” \nLongitude: ” + longitude);

            //tvAddress.setText(“Address: ” + address);

        }

        Toast.makeText(this, “Your address is: “ + address, Toast.LENGTH_SHORT).show();

        // make sure you close the gps after using it. Save user’s battery power

        mGPSService.closeGPS();

return “lat” + latitude + ” long “ + longitude;

}

Con lo anterior resolvemos ese molesto problema en el que nos mete Google en la API de android 4.4.

Espero les sirva. Testeado en Galaxy S5 con Android 4.4.2.

Screenshot_2014-11-19-14-39-11 Screenshot_2014-11-19-14-39-14

– Rodiz