Android Geofencing BroadcastReceiver no activado
Actualmente estoy haciendo una aplicación de Geofencing para android, y he seguido su tutorial, pero no puedo parecen obtener el BroadcastReceiver para desencadenar correctamente.
El onAddGeofencesResult se llama, pero el BroadcastReceiver no se llama nunca. ¿Y la idea de por qué? Lo tengo para que envíe una emisión si una persona está en la geofencia por más de 5 ms, así como sale o entra en la geofencia. Hice geofences basado en coordenadas cerca de mi oficina, pero no obtengo ningún resultado al caminar a través de ellos (o de pie en ellos).
- La caché de dependencias de Android Gradle puede estar dañada y la compilación de gradle no funciona
- Conexión HTTPS con certificado de cliente en una aplicación para Android
- Leer la secuencia dos veces
- Mostrar el valor cuando se pulsa
- ¿He usado Singleton con Realm Database correcto?
ReceiveTransitionsBroadcastReceiver.java:
import com.parse.ParseObject; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; /** * This class receives geofence transition events from Location Services, in the * form of an Intent containing the transition type and geofence id(s) that triggered * the event. */ public class ReceiveTransitionsBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context arg0, Intent arg1) { System.out.println("Hello"); ParseObject gameScore = new ParseObject("EventTest"); gameScore.put("Student", "Josh"); gameScore.put("Entered", true); gameScore.put("Class", "AndroidTest"); gameScore.saveInBackground(); } }
Manifiesto:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.spotter" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="19" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_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"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.spotter.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name="com.example.spotter.ReceiveTransitionsBroadcastReceiver" android:exported="false"/> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> </application> </manifest>
MainActivity donde instalo las geofencias:
@Override public void onConnected(Bundle bundle) { System.out.println("Connected to LocationServices"); Geofence.Builder builder = new Geofence.Builder(); builder.setCircularRegion(41.909858, -87.649038, 100.0f) .setExpirationDuration(Geofence.NEVER_EXPIRE) .setRequestId("1") .setLoiteringDelay(5) .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT | Geofence.GEOFENCE_TRANSITION_DWELL); Geofence fence1 = builder.build(); builder.setCircularRegion(41.910359, -87.651444, 100.0f) .setExpirationDuration(Geofence.NEVER_EXPIRE) .setRequestId("2") .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT); Geofence fence2 = builder.build(); Intent intent = new Intent(this, ReceiveTransitionsBroadcastReceiver.class); PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); locationClient.addGeofences(Arrays.asList(fence1,fence2), pi, this); }
Gracias por revisar esto, agradezco la ayuda.
EDIT: El radio de la geofencia es de 1000 metros. Conduzco alrededor de una milla de distancia y de vuelta, pero nada, así que supongo que no es la precisión que es un problema. Tenga en cuenta que el dispositivo no está activado, por lo que sólo estoy usando wifi, pero hay docenas de puntos wifi en cada geofence, que me conecto a.
- Cómo agregar un certificado pkcs12 de cliente a Postman Chrome, W7?
- Androide: extraer texto de la imagen
- Causado por: java.lang.IllegalStateException: GoogleApiClient aún no está conectado
- Codificación y decodificación de bytes con ZXing
- Notificación de no hacer sonido o vibración?
- Android: NAT Traversal?
- ¿Cómo puedo crear un mapa personalizado en Google Maps?
- GreenBroot EventBus no pudo enviar el evento
Una nota importante en Google Play GeoFencing API. He descubierto que el GeoFencing nunca recupera inteligentemente las ubicaciones del hardware GPS. La API de GeoFence observará la ubicación más precisa disponible desde el sistema operativo o, si no hay una lectura de ubicación reciente disponible, hará que se calcule una ubicación desde Wifi / Cellular. (Que succiona porque celular es v imprecisa y wifi a menudo no está disponible)
Por lo tanto, para obtener resultados precisos o sensibles fuera de la Geofencing API tiene que configurar sus Geofences y, a continuación, encuesta el hardware GPS en algún intervalo, ni siquiera hacer nada con el resultado recibido, por lo que bajo la superficie de datos vale la pena OS y Geofence API.
Esto es probablemente el núcleo de por qué usted no está viendo ningún resultado. Los eventos de geofence no se activarán hasta que el sistema operativo esté 100% seguro de la acción. Así que si una lectura de la ubicación tiene una precisión de 500 metros (no es improbable cuando se utiliza la geolocalización celular) y su valla tiene un radio de 50m, nunca sería capaz de producir un evento de entrada, y tendría que ser por lo menos ~ 550m de su punto de la cerca para producir un acontecimiento de la salida.
TLDR; Encuesta el hardware GPS en un intervalo sin hacer nada con el resultado y comenzará a obtener geofences más preciso.
Stealthwang tiene razón, no puede confiar en el geofencing API porque la ubicación informada es a veces descontroladamente. Deberá realizar el filtrado de ubicaciones para garantizar un informe adecuado.
Además, tenga en cuenta que el valor de tiempo de espera es sólo un aviso. Muchas plataformas simplemente ignoran este valor por lo que si su diseño requiere actualizaciones periódicas confiables, entonces tendrá que implementar esto usted mismo.
Buena suerte w / su proyecto.
- ¿Es la aplicación Terminal IDE para Android compatible con Lollipop?
- Cordova – detecta que la aplicación está en segundo plano