P10 proyecto 12

16
Universidad Politécnica de Victoria Practica 10 Nombre: Segunda parte de la aplicación para taquería, desarrollada en cliente-servidor. 2014 Materia: Computación en dispositivos móviles Maestro: Marco Aurelio Nuño Maganda Equipo: Tania Guadalupe Montellano Flores 1030160 Karla Cecilia Quintero Tovar 1130250 Tahily Sheretzada Rodríguez Cabello 1030205 Fecha: 12- agosto- 2014

Transcript of P10 proyecto 12

Page 1: P10 proyecto 12

Universidad

Politécnica de Victoria

Practica 10

Nombre: Segunda parte de la

aplicación para taquería,

desarrollada en cliente-servidor.

2014

Materia: Computación en dispositivos móviles

Maestro: Marco Aurelio Nuño Maganda

Equipo:

Tania Guadalupe Montellano Flores 1030160

Karla Cecilia Quintero Tovar 1130250

Tahily Sheretzada Rodríguez Cabello 1030205

Fecha: 12- agosto- 2014

Page 2: P10 proyecto 12

Cómputo en dispositivos móviles

Practica 10 Proyecto 12 - Aplicación para taquería 1

Contenido

1. Introducción .......................................................................................................................... 2

2. Desarrollo ............................................................................................................................. 3

2.1 Cliente ........................................................................................................................... 3

2.1.1 Clase principal, instanciando botones ..................... ¡Error! Marcador no definido.

2.1.2 Clase principal, método onActivityResult ................. ¡Error! Marcador no definido.

2.1.3 Función addListenerOnButton() .............................. ¡Error! Marcador no definido.

2.1.4 Pantalla secundaria .............................................. ¡Error! Marcador no definido.

2.1.5 Actividad terciaria ................................................ ¡Error! Marcador no definido.

2.1.6 Actividad cuaternaria ............................................ ¡Error! Marcador no definido.

2.1.7 Actividad Quinaria ................................................ ¡Error! Marcador no definido.

2.1.8 AndroidManifest del cliente .......................................................................................... 3

2.2 Servidor ......................................................................................................................... 3

2.2.1 Variables e instancias en el servidor ........................................................................... 3

2.2.2 La clase ServerThread ................................................. ¡Error! Marcador no definido.

2.2.3 Método getMyIp() ......................................................... ¡Error! Marcador no definido.

2.2.4 La clase CommunicationThread ................................... ¡Error! Marcador no definido.

2.2.5 Clase updateUIThread ................................................. ¡Error! Marcador no definido.

3. Resultados ......................................................................................................................... 11

3.1 Pantalla principal del cliente ........................................................................................ 12

3.2 Pantalla secundaria lista de precios ............................... ¡Error! Marcador no definido.

3.3 Pantalla terciaria ver tipos de carnes .............................. ¡Error! Marcador no definido.

3.4 Pantalla cuaternaria hacer pedido .................................. ¡Error! Marcador no definido.

3.4.1 Cantidad de tacos o tortas ............................................ ¡Error! Marcador no definido.

3.4.2 Tipo de alimento a elegir .............................................. ¡Error! Marcador no definido.

3.5 Ver pedido y total, asignar la IP para enviar el pedido ................................................. 12

3.6 Finalizar o volver ......................................................................................................... 13

3.7 Mensaje que aparece en el servidor cuando el cliente finaliza su pedido y ejecuta la

orden. .................................................................................................................................... 14

Page 3: P10 proyecto 12

Cómputo en dispositivos móviles

Practica 10 Proyecto 12 - Aplicación para taquería 2

4. Conclusión ............................................................................................................................ 15

1. Introducción

En la práctica número 10 se trabajó con una aplicación en arquitectura cliente-

servidor y trata de la segunda parte de la practica número 5 que se presento

anteriormente, se realizaron algunos cambios como la realización de un menú de

alimentos que se ofrecen al cliente de forma dinámica, donde el administrador pueda

agregar estos alimentos desde el servidor y se actualicen de forma rápida en el cliente.

El administrador o encargado de realizar los pedidos, ya tiene la opción de marcar

los pedidos como realizados y también poder respaldar la información de las ventas en

un correo electrónico que sea indicado en la aplicación, este no necesariamente debe

ser el mismo siempre, puede cambiar y también el correo del remitente.

En este documento se explican algunos de los permisos que debe incluir cualquier

desarrollador en el android manifest, si desea implementar funcionalidades como el

envió de correos.

Page 4: P10 proyecto 12

Cómputo en dispositivos móviles

Practica 10 Proyecto 12 - Aplicación para taquería 3

2. Desarrollo

2.1 Cliente

En la parte del cliente se cambiar algunos criterios para poder enviar la IP al servidor

e identificar el celular desde el cual se realizo el pedido, ya que ahora se pueden

tener varios conectados simultáneamente.

2.1.1 AndroidManifest del cliente

Se agregaron permisos para la red wifi, y las actividades para los formularios.

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

</uses-permission>

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >

</uses-permission>

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >

</uses-permission>

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >

</uses-permission>

<application

</activity>

<activity

android:name=".ActivitySecundaria">

</activity>

<activity

android:name=".ActivityTerciaria">

</activity>

<activity

android:name=".ActivityCuaternaria">

</activity>

<activity

android:name=".ActivityQuinaria">

</activity>

<activity

android:name=".ActivitySextenaria">

</activity>

</application>

2.2 Servidor

2.2.1 Variables e instancias en el servidor

package com.upv.p05_proyecto_12_servidor;

Page 5: P10 proyecto 12

Cómputo en dispositivos móviles

Practica 10 Proyecto 12 - Aplicación para taquería 4

import java.util.Properties;

import javax.mail.Folder;

import javax.mail.Message;

import javax.mail.MessagingException;

import javax.mail.NoSuchProviderException;

import javax.mail.Session;

import javax.mail.Store;

import android.util.Log;

public class GMailReader extends javax.mail.Authenticator {

private static final String TAG = "GMailReader";

private String mailhost = "imap.gmail.com";

private Session session;

private Store store;

public GMailReader(String user, String password) {

Properties props = System.getProperties();

if (props == null){

Log.e(TAG, "Properties are null !!");

}else{

props.setProperty("mail.store.protocol", "imaps");

Page 6: P10 proyecto 12

Cómputo en dispositivos móviles

Practica 10 Proyecto 12 - Aplicación para taquería 5

Log.d(TAG, "Transport:

"+props.getProperty("mail.transport.protocol"));

Log.d(TAG, "Store: "+props.getProperty("mail.store.protocol"));

Log.d(TAG, "Host: "+props.getProperty("mail.imap.host"));

Log.d(TAG, "Authentication: "+props.getProperty("mail.imap.auth"));

Log.d(TAG, "Port: "+props.getProperty("mail.imap.port"));

}

try {

session = Session.getDefaultInstance(props, null);

store = session.getStore("imaps");

store.connect(mailhost, user, password);

Log.i(TAG, "Store: "+store.toString());

} catch (NoSuchProviderException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (MessagingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public synchronized Message[] readMail() throws Exception {

try {

Folder folder = store.getFolder("Inbox");

folder.open(Folder.READ_ONLY);

/* TODO to rework

Page 7: P10 proyecto 12

Cómputo en dispositivos móviles

Practica 10 Proyecto 12 - Aplicación para taquería 6

Message[] msgs = folder.getMessages(1, 10);

FetchProfile fp = new FetchProfile();

fp.add(FetchProfile.Item.ENVELOPE);

folder.fetch(msgs, fp);

*/

Message[] msgs = folder.getMessages();

return msgs;

} catch (Exception e) {

Log.e("readMail", e.getMessage(), e);

return null;

}

}

}

2.2.2 AndroidManifest del servidor

Permisos necesarios para los servicios de correo, wifi y escritura en archivos de texto.

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

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

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"

>

</uses-permission>

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

</uses-permission>

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >

</uses-permission>

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >

</uses-permission>

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >

</uses-permission>

2.3 Clase GmailReader.java

Page 8: P10 proyecto 12

Cómputo en dispositivos móviles

Practica 10 Proyecto 12 - Aplicación para taquería 7

Esta clase fue necesaria para la sesión del correo, cuestiones de protocolos, host y puertos. Sin esta clase una aplicación que vaya a enviar correo no podría funcionar.

2.4 Clase Main.java

Clase añadida para la funcionalidad del correo

package com.upv.p05_proyecto_12_servidor;

import java.io.IOException;

import java.util.Date;

import java.util.Properties;

import javax.activation.CommandMap;

import javax.activation.DataHandler;

import javax.activation.DataSource;

import javax.activation.FileDataSource;

import javax.activation.MailcapCommandMap;

import javax.mail.Address;

import javax.mail.BodyPart;

import javax.mail.Folder;

import javax.mail.Message;

import javax.mail.MessagingException;

import javax.mail.Multipart;

import javax.mail.NoSuchProviderException;

import javax.mail.PasswordAuthentication;

import javax.mail.Session;

import javax.mail.Store;

import javax.mail.Transport;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeBodyPart;

import javax.mail.internet.MimeMessage;

import javax.mail.internet.MimeMultipart;

public class Mail extends javax.mail.Authenticator {

private String _user;

private String _pass;

private String _from;

private String _port;

private String _sport;

private String _host;

private boolean _auth;

private boolean _debuggable;

private Multipart _multipart;

public Mail()

{

_host = "smtp.gmail.com"; // default smtp server

_port = "465"; // default smtp port

Page 9: P10 proyecto 12

Cómputo en dispositivos móviles

Practica 10 Proyecto 12 - Aplicación para taquería 8

_sport = "465"; // default socketfactory port

_user = ""; // username

_pass = ""; // password

_from = ""; // email sent from

_debuggable = false; // debug mode on or off - default off

_auth = true; // smtp authentication - default on

_multipart = new MimeMultipart();

// There is something wrong with MailCap, javamail can not find a

// handler for the multipart/mixed part, so this bit needs to be added.

MailcapCommandMap mc = (MailcapCommandMap) CommandMap

.getDefaultCommandMap();

mc.addMailcap("text/html;; x-java-content-

handler=com.sun.mail.handlers.text_html");

mc.addMailcap("text/xml;; x-java-content-

handler=com.sun.mail.handlers.text_xml");

mc.addMailcap("text/plain;; x-java-content-

handler=com.sun.mail.handlers.text_plain");

mc.addMailcap("multipart/*;; x-java-content-

handler=com.sun.mail.handlers.multipart_mixed");

mc.addMailcap("message/rfc822;; x-java-content-

handler=com.sun.mail.handlers.message_rfc822");

CommandMap.setDefaultCommandMap(mc);

}

public Mail(String user, String pass)

{

this();

_user = user;

_pass = pass;

}

public boolean send(String[] _to,String _subject,String _body) throws

Exception

{

Properties props = _setProperties();

if (!_user.equals("") && !_pass.equals("") && _to.length > 0

&& !_from.equals("") && !_subject.equals("")

&& !_body.equals(""))

{

Session session = Session.getInstance(props, this);

MimeMessage msg = new MimeMessage(session);

msg.setFrom(new InternetAddress(_from));

InternetAddress[] addressTo = new InternetAddress[_to.length];

for (int i = 0; i < _to.length; i++)

{

Page 10: P10 proyecto 12

Cómputo en dispositivos móviles

Practica 10 Proyecto 12 - Aplicación para taquería 9

addressTo[i] = new InternetAddress(_to[i]);

}

msg.setRecipients(MimeMessage.RecipientType.TO, addressTo);

msg.setSubject(_subject);

msg.setSentDate(new Date());

// setup message body

BodyPart messageBodyPart = new MimeBodyPart();

messageBodyPart.setText(_body);

_multipart.addBodyPart(messageBodyPart);

// Put parts in message

msg.setContent(_multipart);

// send email

Transport.send(msg);

return true;

} else

{

return false;

}

}

public void getInbox()

{

// open email and get inbox

Properties props = System.getProperties();

props.put("mail.smtp.host", _host);

props.setProperty("mail.store.protocol", "imaps");

props.setProperty("mail.imap.socketFactory.class",

"javax.net.ssl.SSLSocketFactory");

props.setProperty("mail.imap.socketFactory.fallback", "false");

try

{

// open session

Session session = Session.getDefaultInstance(props, null);

Store store = session.getStore("imaps");

store.connect("imap.gmail.com", _user, _pass);

// get inbox folder

Folder folder = store.getFolder("inbox");

folder.open(Folder.READ_ONLY);

if (folder.isOpen())

{

// get messages

Message[] msg = folder.getMessages();

for (int i = 0; i < msg.length; i++)

{

// senders

Address[] senders = msg[i].getFrom();

for(Address addr:senders)

Page 11: P10 proyecto 12

Cómputo en dispositivos móviles

Practica 10 Proyecto 12 - Aplicación para taquería 10

System.out.println("Sender: "+addr); // TODO

// message subject

System.out.println("Subject: "+msg[i].getSubject()); // TODO

// get message content (plain text) (part 0) , for HTML use part 1

try

{

Multipart multipart = (Multipart)msg[i].getContent();

BodyPart plainTextPart = multipart.getBodyPart(0);

System.out.println("Body:");

System.out.println(plainTextPart.getContent()); // TODO

} catch (IOException e)

{

System.out.println("ERRROR");

e.printStackTrace();

}

}

folder.close(true);

} else

System.out.println("Folder isn't open");

store.close();

} catch (NoSuchProviderException e)

{

e.printStackTrace();

} catch (MessagingException e)

{

e.printStackTrace();

}

}

public void addAttachment(String filename) throws Exception

{

BodyPart messageBodyPart = new MimeBodyPart();

DataSource source = new FileDataSource(filename);

messageBodyPart.setDataHandler(new DataHandler(source));

messageBodyPart.setFileName(filename);

_multipart.addBodyPart(messageBodyPart);

}

@Override

public PasswordAuthentication getPasswordAuthentication()

{

return new PasswordAuthentication(_user, _pass);

}

public void set_from(String _from)

{

this._from = _from;

}

private Properties _setProperties()

{

Properties props = new Properties();

Page 12: P10 proyecto 12

Cómputo en dispositivos móviles

Practica 10 Proyecto 12 - Aplicación para taquería 11

props.put("mail.smtp.host", _host);

if (_debuggable)

{

props.put("mail.debug", "true");

}

if (_auth)

{

props.put("mail.smtp.auth", "true");

}

props.put("mail.smtp.port", _port);

props.put("mail.smtp.socketFactory.port", _sport);

props.put("mail.smtp.socketFactory.class",

"javax.net.ssl.SSLSocketFactory");

props.put("mail.smtp.socketFactory.fallback", "false");

return props;

}

}

3. Resultados

Los apk fueron instalados en dispositivos Samsung con android 2.3.6. LG-E612F 4.0.3 y en Lanix ILIUM S500 version de android 4.0.4.

Page 13: P10 proyecto 12

Cómputo en dispositivos móviles

Practica 10 Proyecto 12 - Aplicación para taquería 12

3.1 Pantalla principal del cliente

3.2 Ver pedido y total, asignar la IP para enviar el pedido

Page 14: P10 proyecto 12

Cómputo en dispositivos móviles

Practica 10 Proyecto 12 - Aplicación para taquería 13

3.3 Finalizar o volver

Page 15: P10 proyecto 12

Cómputo en dispositivos móviles

Practica 10 Proyecto 12 - Aplicación para taquería 14

3.7 Resultado en el servidor

Mensaje que aparece en el servidor cuando el cliente finaliza su pedido y ejecuta

la orden. Se pueden apreciar dos direcciones IP diferentes, porque hay dos

clientes conectados, aunque pueden ser más, las pruebas solo se realizaron

con 3 equipos.

3.8 Respaldar en correo electrónico

Page 16: P10 proyecto 12

Cómputo en dispositivos móviles

Practica 10 Proyecto 12 - Aplicación para taquería 15

4. Conclusión

En esta práctica fue de gran experiencia la administración del proyecto, el

establecer tiempos y presentación de avances de integrantes del equipo de trabajo, lo

nuevo en esta ocasión fue la inclusión de la funcionalidad de respaldo en correo

electrónico, con lo que aprendimos como trabajan las clases que permiten realizar esto,

y cómo funcionan los métodos que se encuentran en esas clases.

También aprendimos y conocimos los permisos que requiere la aplicación para

poder conectarse al servicio web de correo electrónico, fue una experiencia muy

aportadora para nuestra vida profesional, este proyecto nos impulso a pensar en

posibles aplicaciones que podamos desarrollar para pequeñas empresas y que nuestro

trabajo sea de utilidad en el funcionamiento de algún negocio en particular.