Tareas en segundo plano - TeamSecurityFirst/GeoGuardianWiki GitHub Wiki
Como el principal objetivo de la aplicación es monitorizar los desplazamientos de los usuarios, para que, en caso de ocurrir algún desvío o problema inesperado, se pueda avisar a quien haya prefijado con antelación, creemos que es necesario tener un servicio en segundo plano relacionado con esta tarea.
Se ha pensado tener un servicio que, en cuanto se abra la aplicación, este comprobando con una frecuencia relativamente alta(rango mínimo todavía por establecer) 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 este servicio también se incluirán comprobaciones acerca de las Geofences. Los futuros usuarios podrán configurar tanto zonas seguras, como zonas peligrosas, permitiendo establecer un radio de acción para generar posibles avisos. Aprovechando estas actualizaciones constantes, también se verificará que el usuario este dentro de sus zonas seguras configuradas, de la misma manera, que no entre en ninguna zona "peligrosa".
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 unos pocos ms.
El desarrollo actual del servicio se puede encontrar aquí
El acceso a este servicio se produce en el fragmento correspondiente al mapa(donde se indicará la localización actual del usuario) de tal manera que implantaremos el método OnServiceConnected para corroborar que esta conexión se ha realizado con éxito.
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
Log.v("Check", "Service Connected");
GeoLocationService.LocalBinder binder = (GeoLocationService.LocalBinder) service;
geoLocationService = binder.getService();
List<GeofenceGuardian> myGeofenceGuardians = geoLocationService.getMyGeofences();
printGeofences(myGeofenceGuardians);
mBound = true;
}
En este apartado también es preciso indicar que se han definido y empleado tres AsyncTasks. El primero ha sido definido en la clase FragmentMap y se emplea para obtener el bitmap de la foto del usuario que se va a dibujar en el mapa. El código se puede comprobar a continuación:
public class HttpGetRequest extends AsyncTask<String, Void, Bitmap> {
@Override
protected Bitmap doInBackground(String... params){
try {
URL url = new URL(params[0]);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap myBitmap = BitmapFactory.decodeStream(input);
int width = myBitmap.getWidth(), height = myBitmap.getHeight();
Bitmap output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
final Path path = new Path();
path.addCircle(
(float)(width / 2)
, (float)(height / 2)
, (float) Math.min(width, (height / 2))
, Path.Direction.CCW);
final Canvas canvas = new Canvas(output);
canvas.clipPath(path);
canvas.drawBitmap(myBitmap, 0, 0, null);
return Bitmap.createScaledBitmap(output,80,80,false);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
@Override
protected void onPostExecute(Bitmap result){
super.onPostExecute(result);
}
}
La siguiente tarea asíncrona también se encuentra en FragmentMap y se utiliza para delegar un bucle en el que se pretende obtener los followings del servidor tras haber añadido un nuevo following.
public class getFollowingsTask extends AsyncTask<Void, Void, List<Following> > {
@Override
protected List<Following> doInBackground(Void... voids) {
List<FollowingPosition> followingPositions = null;
List<Following> followingList = null;
do{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
followingPositions = geoLocationService.getMyFollowingPositions();
followingList = followingApi.getMyFollowing(followingPositions);
}while(followingList==null);
return followingList;
}
@Override
protected void onPostExecute( List<Following> result){
super.onPostExecute(result);
}
}
Finalmente, la última tarea asíncrona se encuentra en la clase FragmentFollowing, siendo muy similar a la anterior, aunque con este simplemente se pretende actualizar la lista de followings tras añadir uno nuevo al grupo.
public class getFollowingsListTask extends AsyncTask<Void, Void, List<Following> > {
@Override
protected List<Following> doInBackground(Void... voids) {
List<Following> myFollowings = null;
do {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
myFollowings = followingApi.getMyFollowing(FragmentMap.getInstance().getFollowingPositionsFragment());
} while (myFollowings==null);
return myFollowings;
}
@Override
protected void onPostExecute( List<Following> result){
super.onPostExecute( result);
}
}