Está en la página 1de 6

Red

Una de las funcionalidades habituales de la que quiere disponer una aplicación es la capacidad de
intercambiar información con un servidor remoto, bien sea sobre una red privada o sobre Internet.

Según se trate de un particular, profesional, …, corresponde al responsable verificar, llegado el


caso, si es necesario declarar el uso de datos personales de los usuarios recogidos en los
servidores (como por ejemplo sus coordenadas geográficas). Para más información visite la
siguiente dirección: http://www.aepd.es/

La duración de un intercambio con un servidor, es decir, el tiempo entre la construcción / envío del
mensaje, y el retorno / análisis de la respuesta, depende de muchos factores:

La construcción y el envío de la consulta, que puede llevar más o menos tiempo según la
potencia del dispositivo Android y la complejidad de la consulta.

La calidad de la red y su velocidad, en especial cuando la conexión se establece mediante la


red de telefonía móvil.

El tiempo de respuesta del propio servidor que puede tardar varios segundos, o decenas de
segundos, antes de enviar una respuesta.

El desarrollador es totalmente dependiente de factores cuya duración no puede controlar. Deberían


tenerse en cuenta en la etapa del desarrollo de la comunicación con el servidor. En particular, la tarea
de comunicación puede ser larga, y tendrá que realizarse en un thread secundario para no bloquear la
aplicación.

Para poder comunicarse con un servidor remoto, la primera etapa consiste en dotar a la aplicación de
los permisos para abrir sockets de red. Para ello, hay que agregar
el permiso android.permission.Interneten el manifiesto.
Ejemplo

<?xml version="1.0" encoding="utf-8"?>


<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
</manifest>

Android incluye la librería HTTP Apache que permite utilizar el protocolo HTTP de forma sencilla. Esta
librería contiene numerosas clases y métodos. Dado que no es específica de Android, no detallaremos
más que algunas de sus clases y ciertos métodos.

Desde la versión 2.2 (API 8), Android proporciona también la clase An droidHttpClient que
implementa la interfaz Htt pClient, configurada especialmente para Android. Esta clase prohíbe, en
concreto, el envío de consultas HTTP desde el thread principal, elevando una excepción.

Ejemplo

java.lang.RuntimeException: This thread forbids HTTP requests

En versiones inferiores a Android 2.2 (API 8), es posible reemplazar la


clase AndroidHttpClientpor la clase DefaultHttpClient. El firewall que impide su uso
en el thread principal no existe, por lo que habrá que velar por ejecutarla sobre un thread
secundario.

Veamos cómo utilizar las clases y los métodos más utilizados de estas librerías para enviar una
consulta a un servidor remoto y recuperar la respuesta.
1. Agente usuario
El user-agent (agente usuario) es una cadena de caracteres incluida en el encabezado de una
consulta HTTP enviada por un cliente a un servidor. Permite identificar el sistema del cliente indicando,
por ejemplo, el nombre de la aplicación cliente, su versión…

El servidor puede entonces utilizar esta información para adaptar mejor su respuesta. Por ejemplo,
un servidor web podrá detectar que el cliente es un navegador de un dispositivo móvil. Podrá,
entonces, redirigir automáticamente la petición hacia la versión móvil del sitio web.

En el caso en que el desarrollador Android gestione también la parte servidora, puede ser
interesante para él construir un agente usuario proporcionando la máxima información posible sobre
el dispositivo, el sistema y la aplicación Android. Esto le permitirá ver en detalle qué dispositivos, qué
sistemas y versiones del sistema, y qué versiones de las aplicaciones poseen los usuarios.

Para obtener la información asociada al sistema, podemos utilizar algunas de las constantes que
proporciona la clase android.os.Build. Los valores de estas constantes son cadenas de
caracteres.

La constante Bu ild.MODELproporciona el modelo del dispositivo Android en forma de cadena de


caracteres. Los valores devueltos por esta constante pueden ser, por ejemplo: DROID2, Nexus
One,GT-I9000, T-Mobile G2, X10i, ZTE-RACER, MB525, GT-I5700...

Sintaxis

Build.MODEL

Ejemplo

String modelo = Build.MODEL;

La constante Build.VERSION.RELEASEproporciona el número de versión del sistema en forma


de cadena de caracteres. Los valores devueltos por esta constante pueden ser, por
ejemplo: 3.0,2.3.3, 2.2.2, 2.1-update1, 1.5...

Sintaxis

Build.VERSION.RELEASE

Ejemplo

String versionSistema = Build.VERSION.RELEASE;

La constante Bui ld.DISPLAYproporciona el nombre de código del sistema en forma de cadena de


caracteres. Los valores devueltos por esta constante pueden ser, por
ejemplo: VZW, FRG83G,ECLAIR, FRF91...

Sintaxis

Build.DISPLAY
Ejemplo

String codigoSistema = Build.DISPLAY;

El código del idioma así como el código regional configurado por el usuario en el sistema Android
también pueden recuperarse. Para ello, hay que usar la clase L ocaley su método getDefault.
Este método devuelve una instancia de tipo L ocale. El uso del método toString permite
recuperar el código del idioma así como el código regional concatenados en forma de cadena de
caracteres. Los valores devueltos pueden ser, por ejemplo: en_US, es_ES, fr_FR, bg_BG, zh_TW…
Sintaxis

public static Locale getDefault ()

Ejemplo

String paramsReg = Locale.getDefault().toString();

Android permite obtener información sobre las aplicaciones. En nuestro caso, esto permite recuperar
esta información de forma dinámica en lugar de incluirla directamente en nuestro código. El código no
se habrá modificado tras la actualización de la aplicación y podrá reutilizarse para otras aplicaciones.

La identificación de una aplicación se realiza mediante el nombre de su paquete. Este nombre se


utilizará en los métodos detallados más adelante. Para recuperar dinámicamente el nombre del
paquete en curso, hay que usar el método Co ntext.getPackageName.
Sintaxis

public abstract String getPackageName ()

Ejemplo

String nombrePaquete = context.getPackageName()

La clase PackageManagerpermite recuperar información asociada a las aplicaciones instaladas en


el sistema. Es posible recuperar una instancia de esta clase invocando al método
estático getPackageManager.
Sintaxis

public abstract PackageManager getPackageManager ()

Ejemplo

PackageManager manager = context.getPackageManager();

El método ge tPackageInfopermite obtener toda la información contenida en el manifiesto. Este


método recibe como parámetros el nombre de la aplicación identificada por su paquete y un flag
opcional que aquí no se utiliza.

Devuelve un objeto de tipo PackageInfo. Puede elevar una


excepción NameNotFoundException si el nombre del paquete proporcionado no se encuentra
entre las aplicaciones instaladas.

Sintaxis

public abstract PackageInfo getPackageInfo (String packageName,


int flags)

Ejemplo

PackageInfo info = null;


try {
info = manager.getPackageInfo(context.getPackageName(), 0);
} catch (NameNotFoundException e1) {
}

Queda por recuperar la información del objeto de tipo PackageInfoaccediendo directamente a sus
variables miembros p ackageNamey versionNameproporcionando, respectivamente, el nombre
del paquete y el número de versión de la aplicación.
Ejemplo

String nombrePaquete = info.packageName;


String nombreVersion = info.versionName;

La cadena de caracteres agente usuario puede, así, estar constituida por toda esta información.

Ejemplo

final String AGENTE_USUARIO = "%s/%s (Android/%s/%s/%s/%s)";


String agenteUsuario = String.format(AGENTE_USUARIO,
info.nombrePaquete, nombreVersion, modelo, versionSistema,
codigoSistema, paramsReg);

2. AndroidHttpClient
Para describir el envío de una consulta y la recepción de la respuesta del servidor, supondremos que
el servidor remoto acepta una petición HTTP GE Ty envía una respuesta bajo la forma de una cadena
de caracteres como, por ejemplo, una respuesta con formato JSON.

Android incluye la librería org.json que contiene lo necesario para leer respuestas con
formato JSON. Para más información sobre el formato JSON: http://www.json.org/.

Desde Android 3.0 (API 11), la librería org.json proporciona las nuevas
clases J sonReadery JsonWriterque permiten, respectivamente, leer y escribir de forma
sencilla un flujo JSON.

La petición GETse crea fácilmente con la clase HttpGety uno de sus constructores recibe como
parámetro la dirección completa del sitio.

Sintaxis

public HttpGet (String uri)

Ejemplo

HttpGet httpGet = new HttpGet("http://...");

La clase A ndroidHttpClientpermite utilizar un cliente HTTP específicamente adaptado a Android.


Para utilizarla no hay que instanciarla directamente, sino invocar a su método
estático ne wInstanceque devuelve una instancia. Este método recibe como parámetro una cadena
de caracteres que describe el agente usuario.

Sintaxis

public static AndroidHttpClient newInstance (String userAgent)

Ejemplo

AndroidHttpClient httpClient =
AndroidHttpClient.newInstance(agenteUsuario);

El envío de la consulta y la recepción de la respuesta se realizan invocando al método e xecutedel


cliente HTTP. Este método está disponible en distintas formas. Una de ellas, en concreto, recibe como
parámetros la consulta y un objeto que implementa la interfaz R esponseHandler. Puede elevar
excepciones de tipo IOEx ceptionsi ha tenido algún problema o si la conexión ha sido anulada y
excepciones de tipo ClientProtocolExceptionsu ha habido un error en el protocolo HTTP.

Es preciso, evidentemente, que el dispositivo Android esté conectado a la red mediante Wi-Fi o
mediante la red de telefonía móvil, por ejemplo, o en caso contrario se elevará una excepción
de tipo java.net.UnknownHostException, que hereda del tipo IOException.

La clase BasicResponseHandlerimplementa la interfaz ResponseHandlery, en concreto, su


método h andleResponse. Este método recibe como entrada la respuesta del servidor bajo la
forma de un objeto de tipo Htt pResponse, extrae el contenido de la respuesta y lo devuelve en
forma de cadena de caracteres.

Se elevará una excepción de tipo HttpResponseExceptionsi el código de retorno del servidor es


igual o superior a 300.

Sintaxis

public String handleResponse (HttpResponse response)

De este modo, el método e xecute devuelve la respuesta del servidor en forma de cadena de
caracteres si recibe como parámetro un objeto de tipo B asicResponseHandler, y eleva las
excepciones llegado el caso.

Sintaxis

public abstract T execute (HttpUriRequest request,


ResponseHandler<? extends T> responseHandler)

Ejemplo

String reponse = null;


try {
reponse = httpClient.execute(httpGet,
new BasicResponseHandler());
} catch (HttpResponseException e1) {
int errno = e1.getStatusCode();
procesarExcepcion(e1);
} catch (ClientProtocolException e2) {
procesarExcepcion(e2);
} catch (IOException e3) {
procesarExcepcion(e3);
}

Una vez finalizada la comunicación, el cliente debe cerrar las conexiones y liberar los recursos
reservados invocando a su método cl ose.
Sintaxis

public void close ()

Ejemplo

try {
...
} finally {
httpClient.close();
}

La llamada a este método puede, en particular, realizarse en el bloque finallyde la gestión


de las excepciones. De este modo, siempre se invocará y los recursos siempre se liberarán, se
haya elevado o no una excepción.

También podría gustarte