Geolocalización - TeamSecurityFirst/GeoGuardianWiki GitHub Wiki

Funcionalidades definidas que requieren de localización

Debido a las características de la aplicacion, la mayoría de acciones que pueden ser realizados por los usuarios requieren el uso de Geolocalización. Podemos distinguir entre:

Mapa de la actividad de tus usuarios seguidos

Una vez se haya efectuado el login correcto en la aplicación, al usuario se le mostrará un mapa mostrando su ubicación actual. Este mapa será navegable y el usuario podrá moverse en él. Además, tendrá acceso a la ubicación de sus amigos, proporcionando información relevante como su ubicación actual y las zonas de seguridad y de peligro creadas por ellos. De esta manera, podrá tener un seguimiento de los mismos.

Mapa de edición de tus rutas / geofences

En el modo edición de la aplicación, el usuario podrá consultar sus propias zonas de seguridad y de peligro estipuladas, además de si tiene alguna ruta configurada. Esta vista de edición tendrá disponible la opción de creación, edición (moverlas de lugar) o eliminación de sus zonas de seguridad.

Servicio en segundo plano de rastreamiento de los usuarios

La aplicación contendrá en servicio que, en cuanto se abra la aplicación, este comprobando con frecuencia la posición actual de los usuarios. Para esto, se ha creado un servicio que envíe peticiones a nuestro servidor de manera que notifique estos cambios constantemente. En etapas iniciales, aún no hemos conseguido establecer una comunicación correcta con el servidor, por lo que actualmente, la única función del servicio, es iniciarse una vez se realice un login correcto, y registrar la posición del usuario cada ciertos segundos.

El acceso a este servicio se produce en el fragmento correspondiente al mapa, de tal manerá que implantaremos el método OnServiceConnected para corroborar que esta conexión se ha realizado con éxito. Para iniciar una petición de localización se hace uso del requestLocationUpdates.

    @Override
    public void onCreate() {
        super.onCreate();
        mFusedLocationClient = LocationServices
                .getFusedLocationProviderClient(getApplicationContext());
        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(30); // 30 milisecs  interval
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper());

    }

Para actualizar de manera constante la localización, se hace uso de un LocationCallback.

 private LocationCallback mLocationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(LocationResult locationResult) {
            List<Location> locationList = locationResult.getLocations();
            if (locationList.size() > 0) {
                //The last location in the list is the newest
                Location location = locationList.get(locationList.size() - 1);
                // TODO: Añadir llamada HTTP para enviar petición al server
                mLastLocation = location;
            }
        }
    };

Servicio Broadcast de notificación de las zonas de seguridad

Cuando un usuario crea una nueva Geofence, ya sea de seguridad o de peligro, estas se crean con un Trigger que se activa cuando entra o sale del radio previamente configurado, dependiendo del tipo de Geofence (salida en caso de seguridad, entrada en caso de peligro). Para esto, se crea un Broadcast a modo de listener de las Geofences de los usuarios. Cuando se detecta una salida o entrada, enviará una petición el servidor, que activará las llamadas oportunas a sus amigos que le están monitorizando. Para llevar esta seguimiento de las Geofences, se hace uso de un método OnReceive

public void onReceive(Context context, Intent intent) {
        GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent(intent);
        if ( geofencingEvent.hasError() ) {
            String errorMsg = getErrorString(geofencingEvent.getErrorCode() );
            Log.e("GeofencingBroadcastRec", errorMsg );
            return;
        }
        // Get the transition type.
        int geofenceTransition = geofencingEvent.getGeofenceTransition();

        // Test that the reported transition was of interest. TODO: check only one?
        if (geofenceTransition == Geofence.GEOFENCE_TRANSITION_ENTER ||
                geofenceTransition == Geofence.GEOFENCE_TRANSITION_EXIT) {
            // Get the geofences that were triggered. A single event can trigger
            // multiple geofences.
            List<Geofence> triggeringGeofences = geofencingEvent.getTriggeringGeofences();

            // Get the transition details as a String.
            String geofenceTransitionDetails = getGeofenceTransitionDetails(
                    geofenceTransition, triggeringGeofences);

            // TODO: Send notification and log the transition details.
            sendNotification(context, geofenceTransitionDetails);
        } else {
            // Log the error.
            Log.e("GeofencingBroadcastRec", "Invalid geofense transition");
        }
    }

Actualmente, solo se guardan en logs cuando un usuario entra o sale de una Geofence, de momento no está activado el servicio de notificaciones.

Uso de localización por parte de los dispositivos.

En relación a la configuración de la ubicación por parte de los usuarios, existen dos comprobaciones:

Permisos de acceso a localización

Al acceder al mapa de la actividad principal, si el usuario no ha concedido permisos de localización a la aplicación, se le informará de esto mediante un diálogo donde podrá activarlos desde la propia aplicación.

Ubicación del teléfono activada

Al igual que con los permisos, cuando el usuario acceda a la aplicación sin tener la localización del dispositivo activada, se le mostrará un diálogo donde le redirigirá.

Tanto en el caso de los permisos como la activación de la localización, es necesario un refresco de la aplicación o no entrarán esos cambios, todavía en proceso el por qué no se actualizan directamente

⚠️ **GitHub.com Fallback** ⚠️