Documentos de Académico
Documentos de Profesional
Documentos de Cultura
2018
Programación Avanzada para Dispositivos
Móviles
Autores
Yamil Buenaño Palacios
Carlos Augusto Sánchez Martelo
Henry Leonardo Avendaño Delgado
Manuel Antonio Sierra Rodríguez
Carlos Andrés Collazos Morales
Domingo Alirio Montaño Arias
Breed Yeet Alfonso Corredor
José Daniel Rodríguez Munca
Edición Miembro comité editorial revista Journal of
Editorial Universidad Manuela Beltrán Science Educations. Miembro fundador de la
Sociedad Iberoamericana de Biología Evolutiva.
Autores
Yamil Buenaño Palacios Carlos Andres Collazos
Dr. (c) en Ingeniería de las Morales
Ciencias de la Información y el Postdoctorado en Ciencia y
Conocimiento, Magíster en Tecnología Avanzada, Dr. en
Ingeniería de Software para la Ciencias, Magister en
Web, Esp. En Construcción de Ingeniería Electrónica y
Software para la Web, Computadores, Físico.
Ingeniero de Sistemas, Gerente
General de Softwarecom.
Gerente
Juan Carlos Beltrán Gómez
Secretario General
Juan Carlos Tafur Herrera
Autoridades Académicas
Rectora Alejandra Acosta Henríquez
Vicerrectoría de Investigaciones
Carlos Andrés Collazos
ISBN: 978-958-5467-12-5
TABLA DE CONTENIDO
Programación Avanzada para Dispositivos Móviles
Contenido
Prólogo............................................................................................................................................ 13
Introducción................................................................................................................................... 15
Capítulo I......................................................................................................................................... 17
1. Interactividad y navegación de aplicaciones ................................................................... 19
1.1. Intent .................................................................................................................................... 19
1.1.1. Enviar datos hacia otra actividad ......................................................................................... 23
1.1.2. Acciones descriptivas sobre acciones ............................................................................... 25
1.2. ListView ............................................................................................................................... 25
1.2.1. Implementación de una lista .................................................................................................. 27
1.2.2. Adaptador ................................................................................................................................... 27
1.2.3. ListView-Adapter ...................................................................................................................... 28
1.3. WebView ............................................................................................................................. 30
1.3.1. Elementos para visualizar páginas en Android ................................................................ 31
1.3.2. Cargar una URL en Android................................................................................................... 32
1.4. Thread ............................................................................................................................. 33
1.4.1. Construcción de hilos ............................................................................................................. 34
1.4.1. Componentes de un hilo ........................................................................................................ 35
1.5. Toast .................................................................................................................................... 36
1.5.1. Componentes de un toast ...................................................................................................... 37
1.5.2. Estructura de un toast ............................................................................................................. 37
1.5.3. Constantes de la clase toast ................................................................................................. 38
1.6. Manifest ............................................................................................................................... 39
1.7. Composición de una aplicación Android ................................................................... 40
1.8. Estructura de una aplicación Android ........................................................................ 40
Capítulo II ....................................................................................................................................... 45
2. Conectividad ............................................................................................................................. 47
2.1. HTTP..................................................................................................................................... 47
2.1.1. HTTP Client ................................................................................................................................ 48
2.1.2. Acceso vía GET ......................................................................................................................... 48
2.1.3. Acceso vía POST ...................................................................................................................... 53
11
2.1.4. Servlets ....................................................................................................................................... 54
2.1.5. Middleware ................................................................................................................................. 63
2.1.6. Modelo Vista Controlador (MVC) .......................................................................................... 63
2.1.7. Bases de datos .......................................................................................................................... 64
2.1.8. Web Services ............................................................................................................................. 65
Capítulo III ...................................................................................................................................... 83
3.1. Desarrollo de Aplicaciones Avanzadas ...................................................................... 84
3.1.1. Introducción ............................................................................................................................... 84
3.1.2. Sistema de Sensores ............................................................................................................... 84
3.1.3. Listar los sensores asociados a un terminal .................................................................... 86
3.1.4. Ejemplos ..................................................................................................................................... 86
3.1.5. Ejercicios de reflexión ............................................................................................................. 89
3.1.6. Conclusiones ............................................................................................................................. 92
3.2. Aplicación de Sensores .................................................................................................. 93
3.2.1. Introducción ............................................................................................................................... 93
3.2.2. Marco conceptual ..................................................................................................................... 94
3.2.3. Parámetros que proporciona................................................................................................. 94
3.2.4. El acelerómetro en los móviles............................................................................................. 95
3.2.5. Ejemplos ..................................................................................................................................... 95
3.2.6. Ejercicios de reflexión ............................................................................................................. 99
12
PRÓLOGO
13
14
INTRODUCCIÓN
15
16
CAPÍTULO I
17
18
1. INTERACTIVIDAD Y NAVEGACIÓN DE APLICACIONES
En este apartado se definirán cinco elementos de Android que permitirán
diseñar y construir aplicaciones usables por los usuarios: los intent, las list, los
webview, las thread y los toast.
1.1. Intent
Los intent son mensajes del sistema, que forman una red de comunicaciones
entre las aplicaciones Android dentro de un dispositivo. Los intent notifican a las
aplicaciones desde cambios hardware (como insertar una tarjeta SD), hasta la
recepción de datos (cuando llega un SMS) y eventos de aplicación (cuando se
lanza una aplicación).
Aparte de los intent ya definidos por el sistema, se pueden definir nuevos intent
para lanzar otras actividades dentro de una aplicación o para informar de un
evento producido en el dispositivo a varios destinatarios.
Si se juntan la acción y los datos del ejemplo anterior, se formaría un intent, que
representa la acción de mostrar la información de persona que tiene como
identificador “1” dentro de los contactos. Para ver la información, se podría usar
una aplicación incorporada ya en Android, a través de la invocación del intent.
También un intent puede incorporar los siguientes atributos secundarios:
Categoría: proporciona información adicional de la acción a ejecutar.
19
Tipo: especifica un tipo específico (un tipo MIME) de los datos del intent.
Normalmente este tipo se puede deducir a partir de los propios datos.
Utilizando este atributo se fuerza a un tipo explícito.
Componente: especifica el nombre exacto de una clase componente para
ser usada por el intent. Usualmente, esto es determinado a partir de la
acción, el dato o tipo, y la categoría. Especificando este atributo, el resto de
los atributos de un intent se convierten en opcionales.
Extras: información adicional contenida en un bundle. Puede ser usado
para proporcionar información adicional a un componente. Por ejemplo,
para mandar un e-mail, se podría añadir información extra aquí para el
asunto del e-mail y el cuerpo del mensaje.
Cuando un componente, como por ejemplo activity quiere invocar un intent,
puede hacerlo de dos formas:
Invocación implícita: donde la plataforma determina cuál componente es el
más adecuado para ejecutar el intent mediante un proceso de resolución de
intent a partir de la acción, datos y categoría.
20
Figura 1- Navegación entre activities.
Fuente: elaboración propia.
Por ejemplo, para crear un intent y lanzar una activity explícitamente, se tiene
que crear un objeto de la clase intent con la sintaxis: intent (context/contexto,
class/clase). Se lanzará invocando al método “startActivity()” pasándole por
argumento el intent creado:
21
El contexto se refiere a la página origen desde donde se pretende realizar la
acción y la pagina.class, página de destino a la cual se pretende navegar.
Ejemplo:
Intent i;
i=new Intent(Menu.this, faceboock.class);
startActivity(i);
Si además se desea pasar los datos por parámetro, se puede hacer a través de
un objeto bundle:
22
en como destinos de intent con el elemento <intent-filter> en el fichero
“AndroidManifest.xml”:
<activity android:name=".HolaMundoActivity"
android:label="@string/app_name">
<intent-filter>
Para iniciar una actividad, se debe anexar los datos al intent mediante el
método putExtra(). Este método tiene como objetivo enviar diferentes tipos de
datos.
23
visualizar, por ejemplo “imagen.jpg”. Para ello se debe agregar un TextView en el
cual se mostrará la información en el atributo text.
Ejemplo:
Es de gran relevancia contar con una cadena de texto única, de tal forma que
no se cruce con otra información. Por eso se elige el nombre del paquete del
proyecto que se esté realizando, con lo cual se asegura que no se repita. A
manera de ejemplo, se mostrará la implementación del método putExtra():
//Iniciando la actividad Visor
Intent intent = new Intent(this,Visor.class);
//Adjuntando la cadena de texto
intent.putExtra(NOMBRE_PAQUETE,"imagen.jpg");
//Ejecutando el intent
startActivity(intent);
A partir del método onCreate() del visor, se obtiene el intent. Después de este,
se extrae la cadena de texto de la información enviada a través del método
getStringExtra(), asignándosele al atributo text del TextView:
24
Ejemplo
// del TextView
nombre_imagen = (TextView)findViewById(R.id. nombre_imagen);
1.2. ListView
Las listas en Android son contenedores supremamente útiles para organizar
información en forma vertical y con la capacidad de usar scrolling
(desplazamiento) para simplificar su visualización. Esta técnica es muy popular en
muchas aplicaciones, ya que permite mostrarle al usuario un conjunto de datos de
forma práctica y accesible.
25
La clase ListView representa una lista vertical en el API de Android con el
mismo nombre. Esta clase viene preparada para recibir los ítems que se
desplegarán en la interfaz, facilitando al programador la implementación de sus
características y comportamientos. Si en algún momento los ítems que contiene
dificultan la visualización total en la actividad de la aplicación, automáticamente
implementará scrolling para que el usuario pueda desplegar los elementos ocultos.
<ListView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/lista"/>
26
El código anterior en el layout deberá generar una imagen como la siguiente:
1.2.2. Adaptador
Un adaptador es un objeto que comunica a un ListView los datos necesarios
para crear los registros de la lista, es decir, permite conectar la lista con el origen
de información. Además, provee la información y genera los views para cada
elemento de la lista. En otras palabras, se encarga de todo. Sin embargo, es la
lista la que muestra la información final. Por otro lado, en programación los
adaptadores se representan por la clase Adapter (Revelo, 2014).
27
1.2.3. ListView-Adapter
Cuando se referencia un adaptador a un ListView inmediatamente se comienza
un proceso de comunicación interno para poblar la lista con los datos
correspondientes. Dicha comunicación se basa principalmente en los siguientes
métodos del adaptador:
getCount(): retorna en la cantidad de elementos que tiene un adaptador.
Con este valor la lista ya puede establecer un límite para añadir filas.
getItem(): obtiene un elemento de la fuente de datos asignada al adaptador
en una posición establecida. Normalmente, la fuente de datos es un arreglo
o lista de objetos.
getView(): retorna en el view elaborado e inflado de un elemento en una
posición especifica (Revelo, 2014).
28
Los siguientes son algunos de los parámetros para la construcción de la lista:
Declarar las instancias de la lista y el adaptador:
ListView lista;
ArrayAdapter<String> adaptador;
...
Fuente: http://www.hermosaprogramacion.com/2014/10/android-listas-adaptadores/
Fuente: http://www.hermosaprogramacion.com/2014/10/android-listas-adaptadores/
lista.setAdapter(adaptador);
Fuente: http://www.hermosaprogramacion.com/2014/10/android-listas-adaptadores/
29
Código que construye los elementos para la lista
ListView listview1= (ListView)findViewById(R.id.lista1);
String listview_array[]={"Elemento 1", "Elemento 2", "Elemento 3", "Elemento 4"};
listview1.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,
listview_array));
1.3. WebView
El WebView es considerado el navegador interno de las aplicaciones Android,
es decir, el visor de páginas web nativo de Android. Por lo tanto, es muy propenso
a recibir ataques desde páginas web maliciosas. También, es una aplicación
dispuesta por Android a la que tienen acceso los desarrolladores a la hora de
programar sus aplicaciones.
30
1.3.1. Elementos para visualizar páginas en Android
WebView. Objeto que permite mostrar páginas web.
loadUrl(). Función que permite cargar páginas web.
Fuente: http://www.elandroidelibre.com/2015/06/que-es-webview-y-por-que-tengo-que-
actualizarlo.html
Fuente: https://danielme.com/2012/05/19/android-webview-incrustar-un-navegador-en-nuestras-
apps/
31
1.3.2. Cargar una URL en Android
Ejemplo:
public class google extends Activity {
WebView sitio;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.google);
sitio = (WebView)findViewById(R.id.wvNavegador);
sitio.setWebViewClient(new ViewClient());
sitio.getSettings().setJavaScriptEnabled(true);
sitio.getSettings().setLoadWithOverviewMode(true);
sitio.getSettings().setUseWideViewPort(true);
sitio.loadUrl("http://www.google.es");
}
}
32
Código Fuente propia
Estos códigos de javascript son de gran relevancia para la configuración de las
páginas invocadas desde una aplicación Android, porque permiten ajustarlas de
acuerdo a la resolución y tamaño del dispositivo.
sitio.setWebViewClient(new ViewClient());
sitio.getSettings().setJavaScriptEnabled(true);
sitio.getSettings().setLoadWithOverviewMode(true);
sitio.getSettings().setUseWideViewPort(true);
1.4. Thread
En sistemas operativos thread (hilo), llamado hebra o subproceso, es la unidad
de procesamiento más pequeña que puede ser planificada por un sistema
operativo. La creación de un hilo es una característica que permite a una
aplicación realizar varias tareas a la vez.
33
sistema (cargar sonidos, leer ficheros), etc. De hecho, todos los programas con
interface gráfico (AWT o swing, activity) son multihilo porque los eventos y las
rutinas de dibujado de las ventanas corren en un hilo distinto al principal.
Ejemplo:
34
Figura 7- Imagen que muestra el proceso de carga mediante un hilo.
Fuente: http://www.hermosaprogramacion.com/wp-content/uploads/2014/12/android-progressbar-
landscape.png
35
Este código visualiza en un tiempo determinado una imagen.
public class AppWebSocialActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
logo.start();
}
}
1.5. Toast
El toast es una clase que tiene como función visualizar mensajes sobrepuestos
a la ventana en un determinado período de tiempo, pero sin detener la aplicación.
Se debe tener en cuenta que este mensaje no permite interactuar con el usuario,
es decir, no se pueden ingresar datos, seleccionar botones ni obligar a que se
cierre.
36
Un toast también es un mensaje en un pequeño pop-up, cuyo tamaño no
excede el contenido del mensaje. Este tipo de mensajes son muy útiles cuando se
quiere mostrar cualquier mensaje informativo, donde no se necesita la interacción
del usuario. Por ejemplo, si se guardan los datos de un usuario en la base de
datos de una aplicación, se podría mostrar el mensaje “Usuario guardado
correctamente” en un toast.
37
1.5.3. Constantes de la clase toast
- LENGTH_SHORT. Duración corta.
- LENGTH_LONG. Duración larga.
Ejemplo:
Código completo que implementa u mensaje a través de un toast.
//actividad_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toast_layout_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#C8C8C8"
android:gravity="center"
android:orientation="horizontal"
android:padding="10dp" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
android:src="@android:drawable/ic_dialog_info" />
<TextView
android:id="@+id/text_toast"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFF" />
38
</LinearLayout>
Fuente: https://developer.android.com/guide/topics/ui/notifiers/toasts.html
//MainActividad.java
Context context = getApplicationContext();
CharSequence text = "Hello toast!";
int duration = Toast.LENGTH_SHORT;
1.6. Manifest
Como lo explica el portal Tuprogramación.com, se encuentra situado en la raíz
de las aplicaciones de Android con el nombre AndroidManifest.xml y es el archivo
de configuración donde se pueden aplicar las configuraciones básicas de una app
móvil. La configuración puede ser realizada por medio de interfaz gráfica o por
código. Sin embargo, es recomendable realizarla por medio de la sintaxis debido a
que es más sencillo y rápido hacerlo desde el propio xml. El Android manifest está
situado en la raíz de cada aplicación.
39
1.7. Composición de una aplicación Android
Toda las aplicaciones que se construyan para para Android poseen una misma
estructura básica, que se compone del código fuente, archivos de recursos y
vistas, librerías de código y el Android manifest. Las siguientes definiciones han
sido tomadas del portal Tuprogramación.com:
- Directorio SRC: se encuentra toda la lógica de aplicación, es decir,
todas las clases programadas en Java. Ahí se puede definir distintos
paquetes, donde se puede dividir en capas las reglas de negocio.
- Android Library: aquí se encuentran alojadas todas las librerías
propias del SDK de Android, dependiendo la versión elegida al crear el
proyecto se tendrá una versión u otra.
- Directorios RES: en este paquete se encuentran todos los archivos
con los recursos que usan la aplicación: las imágenes, archivos de idiomas,
estilos, etc.
40
- Values. Carpeta con los xml de contenido de la app. En ella se puede
definir las constantes de la aplicación, dando la posibilidad del multiidioma, estilos
para los componentes y demás configuraciones.
- Directorio bin. Aquí se encuentran todos los archivos generados por la
propia app. Como se sabe, Android usa la máquina virtual dalvik, primero se
traduce a los típicos archivos .class de java y posteriormente es traducido a los
archivo .dex propios de Android. También se encuentra el ejecutable de la
aplicación "apk", que equivale a los ".exe" de Windows. Este es el archivo que se
debe instalar en teléfono Android para probar la aplicación.
- Directorio gen. En esta carpeta está el archivo R.class, que contiene los
identificadores y los recursos usados por un proyecto: imágenes, layout, etc.
41
- Directorio assests: carpeta donde se encuentran los archivos auxiliares de
una aplicación: imágenes, audios, vídeos. La diferencia con los que se encuentran
en la carpeta "RES" es que los archivos incluidos aquí no generarán un
identificador dentro del archivo R.class anteriormente descrito. Para usar estos
archivos, en vez de referenciarlos por un ID, habría que usar la ruta física como
cualquier otro archivo Directorio lib. Aquí irán las librerías externas importados que
se necesiten.
- Android Manifest: se considera el archivo básico de configuración de toda
aplicación Android. En él se definen todas las activities de la app y sus permisos.
42
Todas las activities de la app deben ser declaradas en esta sección, sino no se
declaran entonces la aplicación no funcionará. La actividad inicial de la aplicación
debe ser declarada de tipo "LAUNCHER":
<application
android:icon="@drawable/logows"
android:label="@string/app_name"
android:debuggable="true" >
<activity
android:name=".AppWebSocialActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
43
<activity
android:name=".Menu"
android:label="@string/app_name" >
<intent-filter>
<action android:name="com.appwebsocial.es.Menues" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity android:name="google"></activity>
<activity android:name="faceboock"></activity>
<activity android:name="twiter"></activity>
<activity android:name="skype"></activity>
<activity android:name="youtube"></activity>
</application>
</manifest>
44
CAPÍTULO II
Conectividad
45
46
2. CONECTIVIDAD
La conectividad es la disposición que posee un dispositivo para establecer
conexión de forma independiente, es decir, que los dispositivos no deben estar
interconectados para obtener una reciprocidad en el manejo de la información.
2.1. HTTP1
Es un protocolo de transferencia de hipertexto que se usa en la web. Su sigla
significa HyperText Transfer Protocol o Protocolo de Transferencia de Hipertexto.
Este protocolo fue desarrollado por las instituciones internacionales W3C y IETF y
se usa en todo tipo de transacciones a través de Internet. Por otro lado, este
protocolo opera por petición y respuesta entre el cliente y el servidor. A menudo
las peticiones tienen que ver con archivos, ejecución de un programa, consulta a
una base de datos, traducción y otras funcionalidades. Toda la información que
1
Definición ABC (2007), disponible en: http://www.definicionabc.com/tecnologia/http.php
47
opera en la web mediante este protocolo es identificada mediante el URL o
dirección.
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/intro" />
<EditText
48
android:id="@+id/url"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textUri"
android:text="http://"
>
<requestFocus />
</EditText>
<Button
android:id="@+id/enviar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/enviar" />
<ScrollView
android:id="@+id/scrollView1"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<EditText
android:id="@+id/salida"
android:layout_width="wrap_content"
android:layout_height="365dp"
android:layout_weight="1"
android:enabled="false"
android:inputType="textMultiLine" />
</LinearLayout>
49
</ScrollView>
</LinearLayout>
50
}
in.close();
salida.setText(sb);
}
catch (Exception e) {
salida.setText("Error: "+e);
}
51
ello habrá que introducir la URL en un componente tipo WebView (en lugar de la
caja de texto actual) y se verá el resultado de la web. En este caso, la aplicación
no descargará vía HTTP el contenido HTML, sino que será el propio componente
WebView el que lo hará. Así pues, las modificaciones a nivel de código serán las
siguientes, que tienen el componente salida de tipo WebView.
52
2.1.3. Acceso Vía POST
El acceso vía POST se haría de la siguiente forma: en primer lugar, deberá
conectarse a la URL en cuestión:
HttpClient client = new DefaultHttpClient();
HttpPost request = new HttpPost("http://unapagina.com");
Por otro lado, también se puede cargar una página de forma directa, ingresando
su URL. A continuación, un ejemplo:
53
switch(v.getId()){
case R.id.Enviar:
String web=navegador.getText().toString();
sitio.loadUrl(web);
break;
}
}
}
2.1.4. Servlets
Son clases especiales escritos en Java para establecer comunicación con un
servidor. Además, pueden ser utilizadas como controladores en las aplicaciones
web.
Estructura de un Servlets:
package Servlets;
@WebServlet(name = "NombreServlet", urlPatterns = {"/ NombreServlet "})
public class NombreClase extends HttpServlet {
54
Ahora, se indicará cómo crear y utilizar un Servlets:
1. En Netbeans, crear un proyecto (File/new/Proyecto).
55
4. Hacer clic en Next, ingresar el nombre del Servlets y hacer clic en Finish.
56
Miremos un ejemplo donde se creará un servicio pasando parámetros y
utilizando el método POST: se proporcionará a ese servicio (un Servlet, por
ejemplo) los parámetros necesarios para realizar la operación.
Una vez vista la forma de trabajar, se realizará un ejemplo que interconecte una
aplicación Android con un servicio en la red (un Servlet). La petición se hará vía
POST. Para ello se debe realizar el Servlet, el cual recibirá una cantidad de dinero
y la moneda en la que se encuentra dicha cantidad; el servicio se encargará de
convertirla a otra moneda. Por ejemplo, se va a crear un conversor de euros a
dólares.
57
String moneda = req.getParameter("moneda");
58
de conversión- y por último la caja de texto deshabilitada en la que se mostrará el
resultado de la conversión. El resultado es el siguiente:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/titulo"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/ip"
android:textAppearance="?android:attr/textAppearanceSmall" />
<EditText
android:id="@+id/ip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:inputType="textUri"
android:text="@string/valorIp" >
<requestFocus />
</EditText>
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
59
android:layout_height="wrap_content"
android:text="@string/cantidad"
android:textAppearance="?android:attr/textAppearanceSmall" />
<EditText
android:id="@+id/cantidad"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number"
android:text="@string/cien" />
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<Button
android:id="@+id/euros"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="@string/euros" />
<Button
android:id="@+id/dolares"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/dolares" />
</LinearLayout>
<EditText
android:id="@+id/resultado"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:editable="false"
android:enabled="false"
60
android:inputType="number" />
</LinearLayout>
61
HttpEntity resEntity = response.getEntity();
String cadenaRespuesta = EntityUtils.toString(resEntity);
resultado.setText(cadenaRespuesta);
}
catch (Exception e) {
Toast.makeText(this, "Error: "+e.getMessage(),
Toast.LENGTH_SHORT).show();
}
}
62
Es importante especificar que aunque el Servidor de Aplicaciones se tenga en
la misma máquina, hay que especificar su dirección IP, pues no conectará con
la dirección de bucle interno tipo 127.0.0.1 o localhost.
2.1.5. Middleware
Los Middleware son servicios que tienen como función intercambiar mensajes o
información entre los elementos que participan. Este tipo de sistema orientado a
servicios realiza sus tareas de forma oculta, es decir, se encarga de integrar o
conectar aplicaciones, sistemas, entre otros.
63
aplicación, con el objetivo de facilitar el proceso por separado de los tres,
incrementando la reutilización y flexibilidad de las aplicaciones software.
64
Oracle, MySQL, SQL, entre otras) permitirán la conexión con los dispositivos
móviles.
65
Figura 8 – Estructura de un webservice Rest.
Fuente: http://blog.manishchhabra.com/2013/04/rest-and-soap-web-services-analogy/
66
Figura 10 – Estructura de un Web Service Soap vs. Rest.
Fuente: http://www.rightsoftcorp.com/?name=news&file=readnews&id=31
@Path("saluda")
public class SaludaSW {
@Context
private UriInfo context;
/**
* Creates a new instance of SaludaSW
*/
public SaludaSW() {
}
/**
* Retrieves representation of an instance of aplicacion.SaludaSW
* @return an instance of java.lang.String
*/
67
@GET
@Produces("text/plain")
public String getText() {
//TODO return proper representation object
Calendar c = Calendar.getInstance();
return "Hola, son las
"+c.get(Calendar.HOUR_OF_DAY)+":"+c.get(Calendar.MINUTE)+":"+
c.get(Calendar.SECOND);
}
/**
* PUT method for updating or creating an instance of SaludaSW
* @param content representation for the resource
* @return an HTTP response with content of the updated or created
resource.
*/
@PUT
@Consumes("text/plain")
public void putText(String nombre) {
}
}
68
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/saludo"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/enviar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/enviar" />
<EditText
android:id="@+id/salida"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:enabled="false"
android:inputType="text" >
<requestFocus />
</EditText>
</LinearLayout>
69
HttpClient httpclient = new DefaultHttpClient();
HttpGet request = new
HttpGet("http://192.168.30.12:8080/SaludaSW/resources/saluda");
ResponseHandler<String> handler = new BasicResponseHandler();
try {
String resultado = httpclient.execute(request, handler);
salida.setText(resultado);
}
catch (Exception e) {
Toast.makeText(this, "Error: "+e.getMessage(),
Toast.LENGTH_LONG).show();
}
httpclient.getConnectionManager().shutdown();
}
70
Ahora se expondrá otro ejemplo de Web Service, pero esta vez conectando con
una base de datos externa MySQL, la cual permitirá insertar y consultar datos
desde una aplicación móvil construida en Android:
1. Una vez creado el proyecto, seleccione el módulo war y haga clic derecho
sobre él, luego siga la siguiente ruta: new/other/Web Services.
71
2. Elija la opción RESTFUL Web Services from Patterns.
72
4. Configure los campos la ventana anterior así: en Resource Package
escriba el nombre Web Service y en el Class Name escriba el nombre de la
clase. Lo demás como está. Finalmente, haga clic en la opción Finish.
Cuando esté ubicado en la aplicación web, debe seguir los siguientes pasos
para configurar el Web Service, de tal forma que se pueda acceder desde el
dispositivo móvil:
73
2) Dentro del paquete Clases, debe crear dos clases: ReporteDatos y
LogicaWebService.
Ejemplo:
//Clase que permite seleccionar los datos de la base de datos, para
luego ser visualizados en el dispositivo móvil.
//Clase ReporteDatos
import java.sql.*;
public class ReporteDatos {
Connection conn=null;
PreparedStatement stmt;
ResultSet rs;
String salida="";
// private reporte_boletines
public ReporteCursos()
{
}
public String ConsultaCursos()
{
try {
conn=Conexion.crearConexion();
stmt = (PreparedStatement)conn.prepareStatement("SELECT *
FROM datos");
rs = stmt.executeQuery();
while (rs.next()) {
String iddocumento=rs.getString(1);
String nombre=rs.getString(2);
salida=salida+"CEDULA No. :"+
iddocumento.toString()+"\n"+"NOMBRES:"+ nombre.toString()+";
}
rs.close();
stmt.close();
conn.close();
74
} catch (SQLException e) {}
return salida;
}
}
import Clases.LogicaWS;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.PathParam;
import javax.ws.rs.Consumes;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;
@Path("ConexionDatos")
public class ConexionDatos {
@Context
private UriInfo context;
@GET
@Produces("application/xml")
public String getXml() {
String salida;
LogicaWS LG=new LogicaWS();
salida=LG.ConsultaDatos();
return salida;
}
@PUT
@Consumes("application/xml")
public void putXml(String content) {
}
}
76
<TextView
android:id="@+id/vista"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/cidcurso"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignTop="@+id/textView1"
android:ems="10"
android:hint="Ingrese Id Curso" >
<requestFocus />
</EditText>
<EditText
android:id="@+id/ccurso"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/vista"
android:layout_marginTop="26dp"
android:layout_toRightOf="@+id/vista"
android:ems="10"
android:hint="Ingrese el Curso" />
<Button
android:id="@+id/BGuardar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/vista"
android:layout_below="@+id/ccurso"
android:text="Guardar" />
<Button
android:id="@+id/BListar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/BGuardar"
android:layout_alignBottom="@+id/BGuardar"
android:layout_alignRight="@+id/cidcurso"
android:layout_marginRight="19dp"
android:text="Listar" />
<EditText
android:id="@+id/editText1"
77
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/ccurso"
android:layout_alignParentBottom="true"
android:layout_marginBottom="109dp"
android:layout_marginLeft="22dp"
android:ems="10" />
</RelativeLayout>
78
ccurso = (EditText)findViewById(R.id.ccurso);
bton1=(Button)findViewById(R.id.bton1);
bton1.setOnClicListener(new OnClicListener(){
public void onClic(View arg0) {
// TODO Auto-generated method stub
GuradarCursos();
}});
btonVerAsignat=(Button)findViewById(R.id.btonVercurso);
btonVerAsignat.setOnClicListener(new OnClicListener(){
public void onClic(View arg0) {
// TODO Auto-generated method stub
VerCursos();
}});
}
HttpPost("http://"+conexion.IP+":"+conexion.puerto+"NombreServlet")
;
ArrayList<BasicNameValuePair> params = new
ArrayList<BasicNameValuePair>();
params.add(new BasicNameValuePair("cidcurso",
cidcurso.getText().toString()));
params.add(new BasicNameValuePair("ccurso",
ccurso.getText().toString()));
7) Diseñar la Activity (Actividad). Esta es la clase que permite consultar los datos
almacenados en la base de datos desde el dispositivo móvil.
public class vercursos extends Activity {
/** Called when the activity is first created. */
TextView salida;
String URL,resultado;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.vercursos);
salida = (TextView)findViewById(R.id.salida);
try {
URL="http://"+conexion.IP+":"+conexion.puerto+"/Siges-
war/resources/ConexionCursos";
HttpClient httpclient = new DefaultHttpClient();
HttpGet request = new HttpGet(URL);
ResponseHandler<String> handler = new BasicResponseHandler();
resultado= httpclient.execute(request, handler);
salida.setText(resultado);
}
catch (Exception e) {
Toast.makeText(this, "Error: "+e.getMessage(),
Toast.LENGTH_SHORT).show();
//Toast.makeText(this, "Error: "+resultado.toString(),
Toast.LENGTH_LONG).show();
}
}
}
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:weightSum="10"
android:orientation="horizontal">
</LinearLayout>
<TextView
android:id="@+id/nlista"
android:layout_width="314dp"
android:layout_height="wrap_content"
android:text="Listado de Cursos" android:layout_gravity="center_horizontal"/>
<TextView
android:id="@+id/salida"
android:layout_width="322dp"
android:layout_height="wrap_content"
android:layout_weight="1.20"
android:text="" />
</LinearLayout>
81
8) Por último, no olvidar agregar las actividades creadas al Manifest y los
permisos.
Para agregar los permisos al Manifest:
82
CAPÍTULO III
83
3.1. Desarrollo de Aplicaciones Avanzadas
3.1.1. Introducción
Bajo la denominación de sensores se engloba un conjunto de dispositivos con
los que se puede obtener información del mundo exterior2 (en este conjunto no se
incluye la cámara, el micrófono o el GPS). Como se verá en este capítulo, todos
los sensores se manipulan de forma homogénea. Por lo tanto, se identificarán y se
conocerán los dispositivos de entrada de mayor novedad que incorpora Android y
con ellos, posteriormente, se implementarán diseños atractivos e interactivos para
el usuario final. Además, se mostrará cómo se emulan estos procesos y las
herramientas existentes para tal fin.
2
Tomado de: http://www.androidcurso.com/index.php/tutoriales-android/36-unidad-5-entradas-en-
android-teclado-pantalla-tactil-y-sensores/154-los-sensores.
84
Tabla 1 - Descripción de Sensores.
Fuente: http://www.aprendeandroid.com/l9/sensores_android.htm
3
Tomado de: http://www.aprendeandroid.com
85
niveles de recepción de eventos han cambiado, y onSensorChanged, que
permitirá determinar que el sensor ha obtenido un nuevo valor.
Esta línea de código permitirá crear una instancia de SensorManager. Hay que
recordar que esta clase da acceso a la identificación y acceso a los sensores. A
través del método getSensorList(int) se puede tener acceder a un sensor
determinado. Así, por ejemplo, si se quiere acceder al acelerómetro se pondría:
Sensor s = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
Iterator<Sensor> i = sm.getSensorList(Sensor.TYPE_ALL).iterator();
String resultado = new String();
while (i.hasNext()) {
Sensor s = i.next();
resultado += "\nSensor: "+s.getName();
}
3.1.4. Ejemplos
En este caso, por ejemplo, se ha utilizado una variable de tipo String para
almacenar todos los sensores presentes en el terminal. Solo habrá que ver si esa
variable tiene contenido después del bucle para saber si se puede indicar el
conjunto de sensores que tiene el terminal al usuario o, por el contrario, indicarle
que su terminal no dispone de ningún sensor:
Sensor s = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
Iterator<Sensor> i = sm.getSensorList(Sensor.TYPE_ALL).iterator();
String resultado = new String();
while (i.hasNext()) {
Sensor s = i.next();
86
resultado += "\nSensor: "+s.getName();
}
Para exportar una aplicación Android (apk) es necesario pulsar con el botón
derecho sobre el proyecto a exportar, luego hacer clic sobre la opción AndroidTols
y, posteriormente, exportar. Deberá aparecer un asistente sobre el que, en primer
lugar, se indicará el proyecto a exportar. Después se tendrá que crear las claves y
guardarlas (si previamente se tiene una, se podrá utilizar), como se evidencia en la
figura siguiente:
87
Figura 3 – Llave de almacenamiento.
Fuente: elaboración propia.
88
Para que la instalación se pueda realizar es necesario que el dispositivo tenga
habilitada la restricción de instalar aplicaciones externas en el GooglePlay.
Solamente se tendrá que conectar la USB, transferir la aplicación a la memoria
interna del dispositivo o a la tarjeta de memoria externa y después, con una
aplicación de consulta de ficheros tipo “File Explorer”, se podrá instalar en nuestro
dispositivo.
<uses-feature android:name="android.hardware.sensor.accelerometer"
android:required="true" />
89
SensorSimulatorSettings-2.0-rc1.apk. Para ser instalada en el AVD también se
puede recurrir al dispositivo. Se trata la carpeta donde se tiene descomprimido el
SDK del Android y dentro de esa carpeta se accederá a la carpeta platform-tools.
A través del programa adb y el modificador install se podrá instalar la aplicación en
el AVD: adb install [ruta al SensorSimulatorSettings-2.0-rc1.apk].
90
Desde la aplicación del AVD se introducirá la IP:
Una vez que introducida la IP, se podrá hacer clic en Testing y ver cómo
empieza a recibir datos de los sensores emulados. Al ir al dispositivo virtual del
programa Java, este enviará nuevos valores de los sensores emulados al AVD, tal
y como se ve en la siguiente imagen:
91
Para poder utilizar estos sensores emulados sobre nuestras aplicaciones
Android, se tendrá que hacer uso de una librería que se encuentra sobre el
directorio/lib del SensorSimulator. Esa librería trae nuevas implementaciones de
las principales Clases e Interfaces anteriormente vistas, como Sensor,
SensorEvent o SensorEventSimulator. El acceso a las principales clases se
realizará a través del paquete: org.openintents.sensorsimulator.hardware.
3.1.6. Conclusiones
Es indispensable utilizar la herramienta SensorSimulator para poder probar e identificar
los sensores en un dispositivo móvil. Es de gran beneficio identificar los diferentes tipos
de sensores y sus propiedades para implementar y reconocer patrones que puedan
actuar en la construcción de apps móviles. Los sensores pueden ser utilizados para la
solución de problemas en diferentes áreas del conocimiento.
92
3.2. Aplicación de Sensores
3.2.1. Introducción
Generalmente, los diferentes tipos de teléfonos, y refiriéndonos específicamente
a los teléfonos inteligentes, contienen una serie componentes software y hardware
como los sensores que de una u otra forma sirven para cumplir funciones
específicas en el aparato: por ejemplo, contestar y parar la llamada, acceder a otro
sistema, entre otros.
Este tipo de sensores aplicados a los juegos permiten una interesante evolución, ya
que se puede conducir con el teléfono a modo de volante o guiar una bola por un laberinto
como si fuera una caja real.
4
Tomado de: https://tomatek.wordpress.com/2008/11/24/que-es-acelerometro-o-sensor-de-movimiento/
93
3.2.2. Marco Conceptual
Teniendo en cuenta que los sensores están compuestos tanto de componentes
software como de hardware, los podemos clasificar en tres tipos5:
5
Tomado de: http://www.aprendeandroid.com/l9/sensores_android.htm.
6
Tomado de: http://www.ecured.cu/Aceler%C3%B3metro
94
3.2.4. El Acelerómetro en los Móviles
Casi todos conocemos la Wii, la consola de Nintendo que utiliza un mando que
podemos mover en el aire para controlar al personaje en pantalla. Pues bien, en su
interior se encuentra un acelerómetro para detectar esos movimientos. También muchas
cámaras de fotos, al menos los modelos actuales, incluyen un acelerómetro con el que es
posible detectar si se hace la foto en horizontal y en vertical, grabando ese dato en la foto
y permitiendo verla con su orientación correcta. Incluso, cuando la estamos viendo en la
cámara trasera la foto puede girarse automáticamente dependiendo de la posición de
esta.
3.2.5. Ejemplos
El acelerómetro, como se comentó en el apartado anterior, permite la medición de la
fuerza de aceleración en tres ejes (x, y, z). Se mostrará el ejemplo a través del AVD, para
luego ser emulados y gestionados los sensores, por lo cual se deberá tener en presente
todas las restricciones que se exponen en este capítulo.
7
Tomado de: http://www.ecured.cu/Aceler%C3%B3metro
95
por ejemplo X, Y y Z y se utilizarán para mostrar la aceleración que emitida por el sensor
del dispositivo en cada coordenada. El código XML deberá se escrito como sigue:
Código XML
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/saludo"
android:textAppearance="?android:attr/textAppearanceLarge" />
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/x"
android:textAppearance="?android:attr/textAppearanceSmall" />
<EditText
android:id="@+id/x"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:layout_weight="1.73"
android:editable="false"
android:enabled="false"
android:inputType="numberSigned" >
</EditText>
96
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout2"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.35"
android:text="@string/y"
android:textAppearance="?android:attr/textAppearanceSmall" />
<EditText
android:id="@+id/y"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:layout_weight="0.64"
android:editable="false"
android:enabled="false"
android:inputType="numberSigned" />
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout3"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.54"
android:text="@string/z"
android:textAppearance="?android:attr/textAppearanceSmall" />
<EditText
android:id="@+id/z"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:editable="false"
android:enabled="false"
android:inputType="numberSigned" />
</LinearLayout>
</LinearLayout>
97
En esta Actividad se creará una instancia al gestor de sensores y luego se conectará:
SensorManagerSimulator sms = SensorManagerSimulator.getSystemService(this,
SENSOR_SERVICE);
sms.connectSimulator();
Para que todo funcione sin inconvenientes, se debe tener en cuenta los siguientes
elementos:
• Habrá que añadir la librería del SensorSimulator para poder utilizar los
sensores simulados.
• Habrá que permitir las conexiones de red en la aplicación.
• Habrá que hacer que la Actividad implemente la Interfaz
SensorEventListener para que se pueda implementar los métodos de
gestión de eventos.
98
Figura 8 – Sensor emulado.
Fuente: elaboración propia.
99
En lo que a la programación se refiere, se va a construir un programa que
permita, a través del emulador, mostrar los valores recogidos por este sensor. Hay
sensores que solamente detectan dos tipos de estados: cerca y lejos, mientras
que otros detectan, como se comentaba, la distancia al objeto.
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/intro"
android:textAppearance="?android:attr/textAppearanceSmall" />
<EditText
android:id="@+id/salida"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:enabled="false"
android:inputType="number" >
<requestFocus />
</EditText>
</LinearLayout>
SensorManagerSimulator sms =
SensorManagerSimulator.getSystemService(this,
SENSOR_SERVICE);
sms.connectSimulator();
100
Hay que registrar el sensor; en este caso, se registrará el sensor de proximidad.
sms.registerListener(this, sms.getDefaultSensor(Sensor.TYPE_PROXIMITY),
SensorManager.SENSOR_DELAY_FASTEST);
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
float valor[] = event.values;
TextView salida = (TextView) this.findViewById(R.id.salida);
salida.setText(String.valueOf(valor[0]));
}
101
Por otro lado, al arrancar el SensorSimulator se tendrá que habilitar el sensor
de proximidad, de acuerdo a la siguiente imagen:
102
Figura 10 – Configuración sensor de proximidad.
Fuente: elaboración propia.
103
104
GLOSARIO
Directorio bin: ahí se encuentran todos los archivos generados por la propia
app.
Activity: aquí se encuentran todos los archivos generados por la propia app.
105
Manifest: archivo de configuración de Android.
Servlets: es un tipo de clase java que se utiliza para atender servidores web.
Market de Google: (google play) rspacio dispuesto por Google para subir las
aplicaciones móviles.
106
Sensor: esta clase representa una instancia de un sensor determinado.
Permitirá obtener información del mismo.
107
108
Bibliografía
Ableson, F., & Sen, R. (2010). Android Guía para desarrolladores. Madrid:
Anaya Multimedia.
El Android libre. (2015). Qué es WebView y por qué tengo que actualizarlo.
Disponible en: http://www.elandroidelibre.com/2015/06/que-es-webview-y-por-que-
tengo-que-actualizarlo.html
109
Tu programación. (s.f.). Estructura de una aplicación Android. Disponible en:
https://developer.android.com/guide/topics/ui/notifiers/toasts.html
______. (s.f.). ¿Qué es el Android manifest? Disponible en:
http://www.tuprogramacion.com/glosario/que-es-el-android-manifest/
Ableson, F., & Sen, R. (2010). Android: Guía para desarrolladores. España: Anaya
Multimedia.
Appleon. (s.f.). Pantalla que representa una base de datos externa [figura].
Disponible en: http://www.appleon.com/index.php?modulo=BBDD
110
Cuello, J., & Vittone, J. (2013). Diseño de Apps para Móviles. Disponible en:
http://appdesignbook.com/es/contenidos/las-aplicaciones/
111
112
113
114
115
978-958-5467-12-5
116