Servicios de Google Play o Servicios de ubicación de Android

Estoy deseando implementar la funcionalidad basada en la ubicación en mi aplicación. He estado leyendo un poco y me encuentro un poco confundido.

Cuando el google para el tutorial casi todos los resultados vuelven con un ejemplo usando la API de ubicación de Android.

Sin embargo, al leer las directrices para desarrolladores de Android, indican lo siguiente:

Las API de ubicación de los servicios de Google Play son preferibles a las API de ubicación de marco de Android (android.location) como una forma de agregar conocimiento de ubicación a tu aplicación. Si actualmente utiliza las API de ubicación de framework de Android, se recomienda encarecidamente que cambie a las API de ubicación de servicios de Google Play lo antes posible.

Documentos de Android

Así que esto me está diciendo que no vaya para la ruta más simple de la implementación de un oyente de ubicación.

Así que mi pregunta es, ¿cuál es la diferencia entre los dos? ¿Por qué usaría uno y no el otro?

¿Dónde puedo encontrar un tutorial decente sobre cómo acceder de forma segura y precisa a la API de ubicación de Google Play Services correctamente.

He intentado esto hasta ahora (como se sugirió en el sitio de Android), Sin embargo ninguno de mis respaldos de llamada se están llamando.

public class LocationManager implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { private Context mContext; private GoogleApiClient mGoogleApiClient; private Location mLastLocation; public LocationManager(Context context) { mContext = context; // if (checkIfGooglePlayServicesAreAvailable()) { //Get Access to the google service api buildGoogleApiClient(); } else { //Use Android Location Services //TODO: } } public Location getCoarseLocation() { if (mLastLocation != null) { return mLastLocation; } else return null; } private synchronized void buildGoogleApiClient() { mGoogleApiClient = new GoogleApiClient.Builder(mContext) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); } private boolean checkIfGooglePlayServicesAreAvailable() { int errorCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(mContext); if (errorCode != ConnectionResult.SUCCESS) { GooglePlayServicesUtil.getErrorDialog(errorCode, (MainActivity) mContext, 0).show(); return false; } return true; } @Override public void onConnected(Bundle bundle) { Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); if (location != null) { mLastLocation = location; Toast.makeText(mContext, location.getLongitude() + " , " + location.getLatitude() + " : " + location.getAccuracy(), Toast.LENGTH_LONG).show(); } } @Override public void onConnectionSuspended(int i) { Toast.makeText(mContext, "suspended", Toast.LENGTH_LONG).show(); } @Override public void onConnectionFailed(ConnectionResult connectionResult) { Toast.makeText(mContext, connectionResult.toString(), Toast.LENGTH_LONG).show(); } } 

Entonces llamo a mi LocationManager de mi actividad:

 LocationManager locationManager = new LocationManager(this); Location location = locationManager.getCoarseLocation(); //Use Location 

Quiero hacer una clase de ayuda que puedo llamar simplemente de cualquier actividad o fragmento. Sin embargo, cuando ejecuto lo siguiente, el constructor se ejecuta correctamente. Sin embargo ninguno de mis puntos de interrupción en las devoluciones de llamada se golpea. incluso después de 1 o 2 minutos.

2 Solutions collect form web for “Servicios de Google Play o Servicios de ubicación de Android”

Los servicios de Google Play Api utilizan un método de devolución de llamada public void onConnected(Bundle bundle) que se llama sólo cuando se establece una conexión. Es sólo entonces que la llamada al método LocationServices.FusedLocationApi.getLastLocation(googleApiClient) será capaz de devolver la Location correcta.

Ha construido una clase auxiliar para obtener esta ubicación, pero debe comprender que la conexión no se establece de forma instantánea. Por lo tanto, simplemente una llamada asíncrona a una clase auxiliar o su método puede devolver un objeto nulo, ya que la conexión no se pudo haber realizado.

Puede obtener la Location de las siguientes maneras.

1) Difundir la ubicación y recibirla a través de un BroadcastReceiver para llevar a cabo las operaciones subsiguientes desde dentro del public void onConnected(Bundle bundle) . Esto funcionó para mí.

 private boolean flag = false; @Override public void onConnected(Bundle connectionHint) { location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient); if (location != null && !flag) { flag = true; Intent intent = new Intent(LOCATION_BROADCAST_ACTION); intent.putExtra(INTENT_EXTRA_LOCATION, location); LocalBroadcastManager.getInstance(context).sendBroadcast(intent); Log.i(TAG, "Sending Location Broadcast"); Log.i(TAG, location.toString()); } else if (location == null){ Toast.makeText(mContext, R.string.no_location_detected, Toast.LENGTH_LONG).show(); Log.e(TAG, "No Location Detected"); } } 

2) Cree un objeto de Location pública en la actividad o fragmento de llamada y actualice su valor dentro del método public void onConnected(Bundle bundle) .

 @Override public void onConnected(Bundle connectionHint) { location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient); if (location != null) { MyActivity.location = location; // update the Location object of you caller activity or fragment Log.i(TAG, "location updated"); } } 

Además, debes conectarte a Api de la ubicación de servicios de Google Play después de crear GoogleApiClient. Simplemente agregue la llamada al método mGoogleApiClient.connect() después de su buildGoogleApiClient(); método en su constructor. No es necesario comprobar si Google Play Services está disponible o no.

También puede agregar la llamada de método googleApiClient.connect(); en su implementación de public void onConnectionSuspended(int i) .

Tiene que llamar a:

 mGoogleApiClient.connect() 

Además de su pregunta sobre las diferencias: el marco de servicios de Google Play le proporciona una ubicación "fusionada". Con el marco de Android debe utilizar GPS o Wif. Puede especificar un criterio pero si necesita la posición de usuario de ubicación, los servicios de Google Play son la mejor opción. Si necesita una posición muy precisa como GPS, ya que por ejemplo su aplicación es una aplicación de navegador, que es mejor utilizar directamente el GPS.

  • Localización dinámica de aplicaciones para Android
  • ¿Cómo evitar fallos debido a entradas de cadena faltantes?
  • Google Translator Toolkit para Android e iOS: cómo subir las traducciones existentes?
  • Android Traduce al árabe
  • Tengo la aplicación Android que se está ejecutando en la versión en Inglés Ahora los clientes quieren que se convierta en idioma árabe
  • Android: Diferencia entre LocationManager.addProximityAlert () & LocationClient.addGeofences ()
  • ¿Cómo cambiar el idioma mediante programación?
  • Android: cómo obtener el día actual de la semana (lunes, etc ...) en el idioma del usuario?
  • Adición de archivos de localización de cadenas de un servidor
  • Contactos de Android: Colocación / clasificación local incorrecta
  • Cómo obtener los idiomas disponibles (No todos, solo los idiomas disponibles en mi aplicación)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.