Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


API de geocodificación de Android BroadcastReceiver no activado

Estoy tratando de usar la api geofencing de los servicios de Google Play, pero no puedo lograr que mi receptor de difusión dispare su método onReceive() .

Parece que respeto todo lo que se necesita para que funcione, pero no tengo ningún evento de transición.

  • Incluyo los servicios de Google Play en mis dependencias
  • Solicito el permiso ACCESS_FINE_LOCATION
  • Registro mi BroadcastReceiver con el valor exportado establecido en "true" (algunos dicen que es necesario) en mi Manifest
  • Añado un geofence grande en la localización exacta donde estoy (lo validé con Google Maps en mi teléfono celular) con ambos tipos de la transición y ninguna expiración
  • Lo intenté con una localización exacta simulada en el medio de la geofence, y otra fuera de la geofence 10 segundos más tarde (y me aseguré de que la ACCESS_MOCK_LOCATION ACCESS_MOCK_LOCATION estuviera presente)
  • Verifiqué que la localización de mi teléfono móvil estaba encendido y su modo fue fijado a la alta exactitud
  • Verifiqué la conexión a internet
  • He intentado con y sin desconectar el LocationClient después de agregar el geofence

Pero aún así, obtengo una devolución de llamada onAddGeofencesResult() satisfactoria, pero no onReceive() devolución de llamada onReceive() . Lo intenté con un Nexus 5 y un Nexus 7 y ambos fallan al activar las transiciones de geofence.

También intenté la muestra en https://developer.android.com/training/location/geofencing.html , pero su comportamiento era idéntico.

Aquí está mi clase BroadcastReceiver :

 public class GeofencesReceiver extends BroadcastReceiver implements ConnectionCallbacks, OnConnectionFailedListener, OnAddGeofencesResultListener { private final static String TAG = "GeofencesReceiver"; private Context context = null; private LocationClient locationClient = null; /** * An empty constructor is needed by the manifest. */ @SuppressWarnings("unused") public GeofencesReceiver(){} public GeofencesReceiver(Context context){ this.context = context; locationClient = new LocationClient(context, this, this); locationClient.connect(); } @Override public void onConnected(Bundle bundle) { new Thread(new Runnable() { @Override public void run() { List<Geofence> geofences = getGeofences(); if(geofences.size() > 0){ Intent geofenceBroadcastReceiverIntent = new Intent(context, GeofencesReceiver.class); PendingIntent pi = PendingIntent.getBroadcast(context, 0, geofenceBroadcastReceiverIntent, PendingIntent.FLAG_UPDATE_CURRENT); locationClient.addGeofences(geofences, pi, GeofencesReceiver.this); }else Log.w(TAG, "No GPS zone found"); } }).start(); } private List<Geofence> getGeofences(){ Vector<Geofence> geofences = new Vector<Geofence>(); Geofence geofence = new Geofence.Builder() .setRequestId("1") .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT) .setCircularRegion(45.2676018, -72.1572185, 100) .setExpirationDuration(Geofence.NEVER_EXPIRE) .build(); geofences.add(geofence); return geofences; } @Override public void onDisconnected() { Log.d(TAG, "onDisconnected"); } @Override public void onAddGeofencesResult(int i, String[] strings) { if(i != LocationStatusCodes.SUCCESS) Log.e(TAG, "Failed to add geofences"); else Log.d(TAG, "Geofences successfully added"); locationClient.disconnect(); } @Override public void onConnectionFailed(ConnectionResult connectionResult) { Log.e(TAG, "onConnectionFailed"); } @Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "onReceive"); if(LocationClient.hasError(intent)){ int errorCode = LocationClient.getErrorCode(intent); Log.e(TAG, "Location Services error: " + Integer.toString(errorCode)); return; } int transitionType = LocationClient.getGeofenceTransition(intent); if(transitionType == Geofence.GEOFENCE_TRANSITION_ENTER || transitionType == Geofence.GEOFENCE_TRANSITION_EXIT) { List<Geofence> triggerList = LocationClient.getTriggeringGeofences(intent); for(Geofence geofence : triggerList){ Log.d(TAG, (transitionType == Geofence.GEOFENCE_TRANSITION_ENTER ? "Entering" : "Exiting") + " GPS zone " + geofence.getRequestId()); } }else{ Log.e(TAG, "Geofence transition error: " + transitionType); } } } 

En mi Manifiesto, tengo las siguientes líneas (no en esa estructura)

 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <receiver android:name="novom.anyware.anywaresdk.GeofencesReceiver" android:exported="true" /> <meta-data android:name="com.google.android.gms.version" android:value="4323000" /> 

Y en mi archivo build.gradle, incluyo los servicios como este

 dependencies { compile 'com.google.android.gms:play-services:4.3.23' } 

He pasado todo el día tratando de averiguar por qué no funciona … Desde Logcat he encontrado esas líneas, pero no estoy seguro de si están relacionados con el problema, ya que no encuentro ninguna publicación en Google sobre esos errores Con Geofencing.

 04-07 09:01:14.631 1160-1319/? I/GCoreUlr﹕ Successfully inserted location 04-07 09:01:14.631 1160-1319/? I/GCoreUlr﹕ Not calling LocationReportingService, hasMoved: true, elapsed millis: 580166, request: Phone 04-07 09:02:16.481 1160-1319/? I/GCoreUlr﹕ Successfully inserted location 04-07 09:02:16.501 1160-1319/? I/GCoreUlr﹕ Starting service, intent=Intent { cmp=com.google.android.gms/com.google.android.location.reporting.LocationReportingService }, extras=null 04-07 09:02:16.571 1210-1252/? W/GLSUser﹕ GoogleAccountDataService.getToken() 04-07 09:02:16.601 1160-3780/? I/qtaguid﹕ Failed write_ctrl(u 69) res=-1 errno=22 04-07 09:02:16.601 1160-3780/? I/qtaguid﹕ Untagging socket 69 failed errno=-22 04-07 09:02:16.601 1160-3780/? W/NetworkManagementSocketTagger﹕ untagSocket(69) failed with errno -22 04-07 09:02:16.601 1160-3780/? I/imp﹕ I/O exception (org.apache.http.NoHttpResponseException) caught when processing request: The target server failed to respond 04-07 09:02:16.601 1160-3780/? I/imp﹕ Retrying request 04-07 09:02:17.501 1160-6156/? I/GCoreUlr﹕ Starting service, intent=Intent { act=com.google.android.location.reporting.ACTION_UPDATE_ACTIVE_STATE cmp=com.google.android.gms/com.google.android.location.reporting.service.DispatchingService }, extras=null 04-07 09:02:17.511 1160-6156/? I/GCoreUlr﹕ Batch Location Update succeeded for account account#7# 04-07 09:02:17.571 1160-1319/? I/GCoreUlr﹕ Ensuring that reporting is active for [account#7#] 

Si nadie me puede ayudar, me temo que voy a implementar mi propio algoritmo geofencing con el LocationManager registrado con el GPS_PROVIDER, y esto va a drenar la batería de mis usuarios …

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