Download J2ME-Seccion 3
Document related concepts
no text concepts found
Transcript
Taller de Programación de Dispositivos Móviles José Miguel Rubio L. Oficina 3-20 http://www.inf.ucv.cl/~jrubio jose.rubio.l@ucv.cl Contenidos 1.Programación de dispositivos móviles 2.Limitaciones de los dispositivos móviles 3.Sistemas operativos móviles 4.Desarrollo de aplicaciones móviles 5.Java 2 Mobile Edition 6.Configuración CDC 7.Configuración CLDC 8.Paquetes opcionales en J2ME 9.MIDP: MIDlets 10.MIDP: Interfaces Gráficas de Usuario 11.MIDP: Persistencia 12.MIDP: Conexión por red 13.Persistencia II: Ficheros 14.Para terminar MIDP: Conexión por red MIDP: Conexión por red MIDP es especialmente potente en lo que se refiere a la conexión por red mediante sockets, http y otros protocolos. ●La clase Connection representa una conexión genérica y es extendida a tres conexiones que admiten E/S mediante streams: InputConnection, OutputConne ction y StreamConnection ●La clase StreamConnection es extendida a varias clases que representan distintos tipos de conexiones: CommConnection, HttpConnection, httpsConnection, SocketConnection, etc. ● Sistemas operativos móviles MIDP: Conexión por red La clase Connector es una factoría que a partir de un url devuelve la clase de conexión correspondienConnection Connector.open(String url) te: ● HttpConnection con1; con1 = (HttpConnection) Connector.open(http://www.google.es/search?hl=es&q=j2me); SocketConnection con2; con2 = (SocketConnection) Connector.open(socket://miservidor:79); La conexión debe cerrarse al final con close() ●A partir de la conexión podemos obtener un stream de lectura o escritura ● HttpConnection con1; con1 = (HttpConnection) Connector.open(http://www.google.es/search?hl=es&q=j2me); InputStream is = con1.openInputStream(); // Utilizar el stream con1.close(); Sistemas operativos móviles MIDP: Conexión por red El siguiente gestor de persistencia obtiene los datos de la cuenta desde un servidor web import java.io.*; import java.util.*; import javax.microedition.io.*; import javax.microedition.io.file.*; public class DAOCuentaNC { static DAOCuentaNC instancia = null; public static DAOCuentaNC obtenerInstancia() { if (instancia == null) { instancia = new DAOCuentaNC(); } return instancia; } private { } DAOCuentaNC() public boolean existe(long { try { cargar(numero); } catch(Exception e) { return false; } return true; } numero) Sistemas operativos móviles MIDP: Conexión por red public Cuenta cargar(long numero) throws IOException { InputConnection ic = null; DataInputStream dis = null; Cuenta c = null; try { ic = (InputConnection) Connector.open(urlCuenta(numero)); dis = ic.openDataInputStream(); c = new Cuenta(dis.readLong(), dis.readUTF(), dis.readFloat()); c.saldo = dis.readFloat(); int nMov = dis.readInt(); for (int nm = 0; nm < nMov; nm++) { c.movimientos.addElement(new Movimiento(new Date(dis.readLong()), dis.readChar(), dis.readFloat(), dis.readFloat())); } } catch(Exception e) { // No se encuentra la cuenta return null; } finally { if (ic != null) ic.close(); } return c; } private String urlCuenta(long codigo) { return "http://robin.ujaen.es/asignaturas/progav/cuentas/" + Long.toString(codigo) + ".cnt"; } } Sistemas operativos móviles Persistencia II: Ficheros Persistencia II: Ficheros El File Connection and PIM API (JSR 75) define un nuevo tipo de conexión denominado FileConne ction que permite trabajar con ficheros de manera similar a un ordenador convencional. ●Este API no está disponible en todos los dispositivos. ●El acceso al sistema de ficheros requiere permisos especiales si la aplicación no está certificada, para evitar daños en el mismo. ● Sistemas operativos móviles Persistencia II: Ficheros El siguiente ejemplo lee una imagen guardada en el dispositivo FileConnection fc; InputStream is; fc = (FileConnection) Connector.open( /Imagenes/flower.jpg is = fc.openInputStream(); Image mi = Image.createImage(is); // Utilizar la imagen is.close(); , Connector.READ); La clase FileConnection permite abrir un stream de E/S al fichero pero también contiene operaciones para la creación, renombrado y borrado de ficheros y directorios. ● Sistemas operativos móviles Persistencia II: Ficheros No obstante existe un problema importante: la estructura del sistema de ficheros de cada dispositivo no es estándar. ●Cada dispositivo contiene una raíz para cada uno de los medios de almacenamiento: memoria interna (/root, /internal, /InternalMemory) y tarjetas de memoria (/SDCard1, /MemoryCard). ●Es posible enumerar las distintas raices existentes mediante el registro del sistema de ficheros: ● Enumeration raicesSF = while (raicesSF.hasMoreElements()) { raizSF = (String) raicesSF.nextElement(); // Hacer algo con la raiz encontrada } FileSystemRegistry.listRoots(); Sistemas operativos móviles Persistencia II: Ficheros Este gestor de persistencia utiliza el API JSR 75 import java.io.*; import java.util.*; import javax.microedition.io.*; import javax.microedition.io.file.*; class FileConnectionAPIInexistente extends Exception public class DAOCuentaFC { static DAOCuentaFC instancia null; String raizSF; {} = public static DAOCuentaFC obtenerInstancia() throws FileConnectionAPIInexistente { if (instancia == null) { String versionFCAPI = System.getProperty( "microedition.io.file.FileConnection.version"); if (versionFCAPI == null) { throw new FileConnectionAPIInexistente(); } instancia = new DAOCuentaFC(); } return instancia; } private DAOCuentaFC() { obtenerRaizSistemaFicheros(); } Sistemas operativos móviles Persistencia II: Ficheros public boolean existe(long { try { cargar(numero); } catch(Exception e) { return false; } return true; } numero) public Cuenta cargar(long numero) throws IOException { FileConnection fc = null; DataInputStream dis = null; Cuenta c = null; try { fc = (FileConnection) Connector.open(urlCuenta(numero), Connector.READ); if (!fc.exists()) { return null; } dis = fc.openDataInputStream(); c = new Cuenta(dis.readLong(), dis.readFloat()); c.saldo = dis.readFloat(); dis.readUTF(), Sistemas operativos móviles Persistencia II: Ficheros int nMov = dis.readInt(); for (int nm = 0; nm < nMov; nm++) { c.movimientos.addElement(new Movimiento(new Date(dis.readLong()), dis.readChar(), dis.readFloat(), dis.readFloat())); } } finally { if (fc != null) fc.close(); } return c; } public void salvar(Cuenta c) throws IOException { FileConnection fc = null; DataOutputStream dos = null; try { fc = (FileConnection) Connector.open("file:///" raizSF + "cuentas", Connector.READ_WRITE); if (!fc.exists()) { fc.mkdir(); } fc.close(); fc = (FileConnection) Connector.READ_WRITE); if (!fc.exists()) { fc.create(); } + Connector.open(urlCuenta(c.leerNumero()), Sistemas operativos móviles Persistencia II: Ficheros dos = fc.openDataOutputStream(); dos.writeLong(c.leerNumero()); dos.writeUTF(c.leerTitular()); dos.writeFloat(c.leerInteres()); dos.writeFloat(c.leerSaldo()); Movimiento m; int nMov = c.numMovimientosHistorico(); dos.writeInt(nMov); for (int nm = 0; nm < nMov; nm++) { m = c.leerMovimientoHistorico(nm); dos.writeLong(m.fecha.getTime()); dos.writeChar(m.tipo); dos.writeFloat(m.importe); dos.writeFloat(m.saldo); } } finally { if (fc != null) fc.close(); } } private String urlCuenta(long codigo) { return "file:///" + raizSF + "cuentas/" Long.toString(codigo) + ".cnt"; } + private void obtenerRaizSistemaFicheros() { Enumeration raicesSF = FileSystemRegistry.listRoots(); if (raicesSF.hasMoreElements()) { raizSF = (String) raicesSF.nextElement(); } } } Sistemas operativos móviles Persistencia II: Ficheros Otro problema adicional son las restricciones de seguridad existentes en algunos dispositivos, que sólo permiten el acceso a determinados directorios públicos (/Imagenes, /Sonidos, etc.). ● Sistemas operativos móviles Para terminar Para terminar Hemos estudiado MIDP a nivel básico ●En función de las necesidades de la aplicación móvil a implementar será necesario estudiar con mayor profundidad algunos de los APIs que hemos visto y otros nuevos. ● PIM API JSR 75 ● API MIDP para juegos ● Mobile Media API JSR JSR 184 ● Wireless Messaging API JSR 135 ● Bluetooth API JSR 82 ● Sistemas operativos móviles