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
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
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.
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;
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");
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
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
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
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++)
{
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)
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();
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.
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
Cómputo en dispositivos móviles
Practica 10 Proyecto 12 - Aplicación para taquería 13
3.3 Finalizar o volver
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
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.
Top Related