Geolocalización sencilla en Android usando CTTP

Este último año he escrito varios posts en este blog tratando sobre cómo utilizar geolocalización en Android. Si los habéis seguido sabréis que no es particularmente sencillo, pero el tema se complica cuando además queremos resaltar puntos de interés.

Como sabéis, en GPMESS os notificamos cuando pasáis cerca de un yipi, y los yipis están geolocalizados en un lugar en concreto. ¿Cómo hacemos esto? Pues utilizando CTTP.

CTTP o «Close to the point» (Cerca del punto) es una librería propia que inicialmente nació como parte interna de GPMESS y que ahora hemos decidido liberar para que los desarrolladores podáis utilizarla con unos planes de pago muy razonables. ¿Y para que puede servirme?

Imaginad que tenéis una cadena de tiendas y queréis desarrollar una app. Además queréis que en esa app exista la posibilidad de notificar al usuario con descuentos cuando este pasa cerca de alguna de vuestras tiendas (algo parecido a lo que hace GPMESS, pero a nivel de vuestras tiendas), también con cualquier otro tipo de puntos de interés.

¿Y cómo lo hacemos? Pues no os lo podemos contar, pero sí os puedo contar cómo utilizar la librería. Su instalación es muy sencilla:

– Entráis en http://www.closetothepoint.com y os registráis, seleccionáis un plan de pago aunque tenéis 15 días de prueba para arrepentiros
– Descargais CloseToThePoint para Android
– En el proyecto que queráis incluir la librería (de momento está disponible para Android Studio) copíais la carpeta CloseToThePoint
– Editar el archivo settings.gradle del proyecto y añadir ,’:CloseToThePoint’
– Editar el archivo build.gradle del módulo principal del proyecto y añadir dentro de dependences

	dependences{
		//Dependencias ya existentes
		compile project(':CloseToThePoint')
	}

– Sincronizar los archivos Gradle con el proyecto

– Si no tenemos un archivo que extienda al a clase Application, crear una nueva clase llamada CTTPApplication:

	public class CTTPApplication extends Application {
		@Override
		public void onCreate() {
			super.onCreate();
			CloseToThePoint closeToThePoint = CloseToThePoint.getInstance(this);
			try {
				closeToThePoint.run();
			} catch (ApplicationException e) {
				e.printStackTrace();
			}

		}
	}

– Editar el archivo AndroidManifest.xml del módulo principal del proyecto y añadir al tag <Application> la propiedad android:name = «.CTTPApplication»
– Crear una clase que extienda de PointsReceiver:

	public class MyReceiver extends PointsReceiver {
		@Override
		public void onMovedAway() {
			Log.d(getClass().getSimpleName(), "MoveAway");
		}

		@Override
		public void onClosePointDetected(double v, double v2, ArrayList<POI> pois, UserSessionInfo userSessionInfo) {
			Log.d(getClass().getSimpleName(), "Point Detected");
		}

		@Override
		public void onNetworkError(String s) {
			Log.d(getClass().getSimpleName(), "OnNetWorkErrror");

		}
	}

– En estos métodos recibiremos los eventos mandados por la librería

– Añadir este receiver al archivo AndroidManifest.XML del módulo principal


     <receiver android:name=".MyReceiver"
		android:enabled="true">
			<intent-filter>
				<action android:name="com.gpmess.library.closetothepoint.action_point_detected" />
				<category android:name="android.intent.category.DEFAULT" />
			</intent-filter>
			<intent-filter>
				<action android:name="com.gpmess.library.closetothepoint.action_moved_away" />
				<category android:name="android.intent.category.DEFAULT" />
			</intent-filter>
			<intent-filter>
				<action android:name="com.gpmess.library.closetothepoint.action_network_error" />

				<category android:name="android.intent.category.DEFAULT" />
			</intent-filter>
    </receiver>

– Finalmente, en el archivo /res/values/strings.xml añadir estas dos claves:

    <string name="cttp_api_key">noapi</string>
    <string name="cttp_app_id">noappid</string>

– Y sustituir los valores por el Api Key y App Id proporcionados en el momento de la compra

En el panel que tenéis dentro de CloseToThePoint.com podréis configurar los puntos de interés, y una vez tengáis la librería instalada, cuando paséis cerca de uno de estos puntos recibiréis un callback al método onClosePointDetected del receiver. Cuando os alejeis de un punto, recibiréis un callback al punto onMoveAway.

Os animo a que lo probéis, ya que hay un montón de trabajo de desarrollo detrás de ella y puede ser una opción muy interesante para incluir en vuestras apps que hagan uso de geolocalización. También os invito a que nos reporteis errores y fallos, así como sugerencias para poder mejorar.