13 de octubre de 2011

Ejemplo de uso del api de localizacion de Android

Únicamente pretendo mostrar el código necesario para crear un Hello world del API de posicionamiento de Androind usando la interfaz LocationListener en nuestra actividad principal. Basicamente lo que hace esta sencilla aplicación es:
1.- Obtiene el mejor provider (proveedor de posicionamiento del terminal), que podrá ser 'network' o 'gps'.
2.- Muestra por pantalla nuestra latitud y longitud actualizandose cuando cambiamos de posicion (mínimo un metro) y cada 15 segundos.

Para ello únicamente modificaremos el android manifest y crearemos dos ficheros, uno para nuestra actividad (ZTLocationActivity.java) y uno para el view (info.xml)
El código original no es mío, aunque lo he modificado, el original donde me basé me lo pasó un compi, cuando tenga la referencia del lugar original la publicaré aquí.

A continuación tenéis, la chicha

Android Manifest: Solo hay que destacar los permisos necesarios para aceder a los sensores de posicionamiento del terminal.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.zt"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="3" />
<!-- Para acceder al hardware de posicionamiento: Inicio -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!-- Para acceder al hardware GPS: Fin -->
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".ZTLocationActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

</application>
</manifest>


ZtLocationActivty: Esta es la actividad principal de nuestro proyecto.

package com.zt;

import android.app.Activity;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

public class ZTLocationActivity extends Activity implements LocationListener{

private LocationManager locManager;
private TextView salida;
private String best;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.info);

//Instanciamos el manager y le indicamos que queremos el servicio de localización
locManager = (LocationManager)getSystemService(LOCATION_SERVICE);
salida = (TextView)findViewById(R.id.salida);

//Establecemos los criterios para obtener el mejor proveeder en base a los requisitos deseados
calcBestProvider();
log("Obtenemos el mejor provider: " + best + "\n");

log("Obtenemos los datos de localización: ");
Location localizacion = locManager.getLastKnownLocation(best);
//Dependiendo del proveedor se tardará más o menos en obtener nuestra localización
dumpLocation(localizacion);
}

@Override
public void onResume(){
super.onResume();
//Iniciar actualización (Se recomienda un retardo >= 60000ms)
//requestLocationUpdates(Nombre del proveedor, retardo,
//distancia mínima para hacer el cambio de localización (en metros), Objeto listner)
locManager.requestLocationUpdates(best, 15000, 1, this);
}

@Override
public void onPause(){
super.onPause();
//Paramos la actualización para preservar la batería cuando la aplicación esté en pausa
locManager.removeUpdates(this);
}

private void log(String string) {
Log.i(this.getClass().getName(), string);
}

private void dumpLocation(Location location) {
if (location == null){
Toast.makeText(this, R.string.location_unknow, Toast.LENGTH_SHORT).show();
log("\nLocation[unknown]");
}else{
salida.setText("");
salida.append("LONGITUD: " + location.getLongitude());
salida.append("\nLATITUD: " + location.getLatitude());
}
}


@Override
public void onLocationChanged(Location location) {
//Calculamos el mejor provider dependiendo del lugar donde estamos
//(habrá que comprobar como afecta esto al rendimiento)
calcBestProvider();
//Usamos la posicion actual
dumpLocation(location);
}

private void calcBestProvider() {
//Establecemos los criterios para obtener el mejor proveeder en base a los requisitos
//deseados
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);
best = locManager.getBestProvider(criteria, true);
}

@Override
public void onProviderDisabled(String provider) {
log("Proveedor deshabilitado: " + provider);
}

@Override
public void onProviderEnabled(String provider) {
log("Proveedor habilitado: " + provider);
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
log("Cambio de estado:\n");
log("Proveedor: " + provider + "\n");
log("Estado: " + ProviderStatus.getLabelById(status) + "\n");
log("Extras: " + extras);
}

public enum ProviderStatus{

OUT_OF_SERVICE (0,"Fuera de servicio"),
TEMPORARILY_UNAVAILABLE (1,"Temporalmente fuera de servicio"),
AVAILABLE (2,"Disponible"),
;
private final int id;
private final String label;
private ProviderStatus(int id, String label) {
this.id = id;
this.label = label;
}
public int getId() {
return id;
}
public String getLabel() {
return label;
}
public static String getLabelById(int id){
for(int i = 0; i < values().length; i++){
if(values()[i].getId() == id){
return values()[i].getLabel();
}
}
//return by default
return OUT_OF_SERVICE.getLabel();
}
}
}




Y, por último el view, info.xml:

<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>

<textview
android:text="@string/act_name"
android:id="@+id/Intro"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<textview
android:id="@+id/salida"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>

-Saludos patateros-

No hay comentarios:

Publicar un comentario