Taller de programación

1,317 views

Published on

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,317
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
40
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Taller de programación

  1. 1. Taller de Programaciónde Dispositivos Móviles José Miguel Rubio L. Oficina 3-20 http://www.inf.ucv.cl/~jrubio jose.rubio.l@ucv.cl
  2. 2. Parte 11.Programación de dispositivos móviles2.Limitaciones de los dispositivos móviles3.Sistemas operativos móviles4.Desarrollo de aplicaciones móviles5.Java 2 Mobile Edition6.Configuración CDC7.Configuración CLDC8.Paquetes opcionales en J2ME9.MIDP: MIDlets10.MIDP: Interfaces Gráficas de Usuario11.MIDP: Persistencia12.MIDP: Conexión por red13.Persistencia II: Ficheros14.Para terminar
  3. 3. MIDP: MidletsMIDP: MIDlets●Una aplicación MIDP requiere la implementaciónde un MIDlet, cuya estructura recuerda los Appletsy Servlets de J2SE import javax.microedition.midlet.MIDlet; public class EjemploMidlet extends MIDlet { public void startApp() { // Arrancar aplicación } public void pauseApp() { // Parar aplicación } public void destroyApp(boolean unconditional) { // Eliminar recursos } } Sistemas operativos móviles
  4. 4. MIDP: MidletsDe manera similar a un Applet, un MIDlet requiere●la implementación de tres operaciones de la claseMIDlet:●startApp(). Es llamada automáticamente cuando la aplicación debe comenzar su ejecución.●pauseApp(). El dispositivo puede solicitar la parada temporal de la aplicación en cualquier momento. La reanudación implicará una nueva llamada a startApp() o la terminación definitiva mediante la llamada a destroyApp().●destroyApp(). Es invocada para solicitar la liberación de los recursos del MIDlet y cualquier tarea necesaria antes de su eliminación de memoria. Sistemas operativos móviles
  5. 5. MIDP: Midlets●Un conjunto de MIDlets se distribuye en un fichero .jar●El MANIFEST del fichero jar es más complicado que los que conocemos●Primero se indica el nombre global del conjunto deMIDlets del fichero jar, su versión, autor y las versio-nes de CLDC y MIDP necesarias●Después cada MIDlet se describe mediante un nom-bre, el icono correspondiente y el nombre de la claseque lo implementa MIDlet-Name: EjemplosMIDP MIDlet-Version: 1.0 MIDlet-Vendor: ajrueda MicroEdition-Configuration: CLDC-1.1 MicroEdition-Profile: MIDP-2.0 MIDlet-1: Ejemplo,ejemplo.png,EjemploMidlet Sistemas operativos móviles
  6. 6. MIDP: Interfaces Gráficas de UsuarioMIDP: Interfaces Gráficas de Usuario● MIDP proporciona una forma sencilla de construirinterfaces de usuario adaptada a las limitaciones depantalla, potencia de cálculo y batería de los dispo-sitivos móviles.●En comparación con toolkits como Swing, la varie-dad y número de componentes existentes es muypequeño.●La interfaz se construye a base de distintas panta-llas, en lugar de ventanas o diálogos.●Las acciones del usuario definen la transición deuna pantalla a otra . Sistemas operativos móviles
  7. 7. MIDP: Interfaces Gráficas de Usuario●Es importante tener en cuenta el pequeño tamañola pantalla del dispositivo a la hora de diseñar lainterfaz.●La mayoría de los dispositivos dispone de un parde botones de acción cuyo efecto se puede progra-mar para cada pantalla. Sistemas operativos móviles
  8. 8. MIDP: Interfaces Gráficas de Usuario●Para empezar hay que obtener el objeto Displayque permite manejar la pantalla del dispositivo.●La operación estática getDisplay() de esta clase devuelve el objeto Display d = Display.getDisplay()●A continuación podemos establecer la pantalla ac-tual mediante: d.setCurrent(Displayable pantalla)●Una vez obtenido el display, el MIDlet sigue el siguiente esquema de funcionamiento: 1.Crear una pantalla 2.Mostrarla mediante setCurrent() 3.Esperar las acciones del usuario 4.Elegir otra pantalla en función de estas acciones (volver a 1) Sistemas operativos móviles
  9. 9. MIDP: Interfaces Gráficas de Usuario●Las clases que implementan la interfaz Displayable son las siguientes: TextBox List Alert Form Sistemas operativos Canvas móviles
  10. 10. ● Crear y activar una pantalla TextBox es muy sencillo: TextBox t = new TextBox( Escribe un poema , , 500, TextField.ANY); d.setCurrent(t);●Un Alert es similar a un messageBox de Swing,admitiendo distintos tipos.●El tiempo de visualización del Alert es configurablemediante setTimeout()●Al llamar a setCurrent() es necesario indicarel siguiente displayable a mostrar tras el Alert Alert a = new Alert( Error , Error al salvar la información , null, AlertType.ERROR); a.setTimeout(5000); d.setCurrent(a, siguienteDisp); móviles
  11. 11. MIDP: Interfaces Gráficas de UsuarioEl displayable Form permite definir una pantalla●con múltiples Item (o componentes): ● StringItem. Similar a un label de Swing. ●Spacer. Un espacio con un ancho y alto determinado. Útil para distribuir los componentes. ● TextField. Un editor de texto con una etiqueta asociada. ● ImageItem. Una imagen con una etiqueta. ● DateField. Un editor que permite introducir una fecha/hora. ● Gauge. Sirve para representar de manera gráfica un valor entero. ●ChoiceGroup. Sirve para seleccionar valores de una lista predeterminada. Puede ser múltiple, exclusiva o popup ● Cualquier Item definido por el usuario móviles
  12. 12. MIDP: Interfaces Gráficas de Usuario● Los Form permiten crear interfaces mucho más ricas: Form f = new Form("Ficha deportiva"); f.append(new TextField("Apellidos", null, 40, TextField.ANY)); f.append(new TextField("Nombre", null, 40, TextField.ANY)); f.append(new DateField("Fecha de nacimiento", DateField.DATE)); f.append(new TextField("E-mail", null, 20, TextField.EMAILADDR)); String[] tipos = {"Profesor", "Alumno"}; f.append(cg = new ChoiceGroup("Tipo", ChoiceGroup.EXCLUSIVE, tipos, null)); d.setCurrent(f); Sistemas operativos móviles
  13. 13. ●Para asociar acciones a los botones del dispositivo se utiliza la clase Command●Las activación de un comando es capturada por un CommandListener, cuya única operación escommandAction() class listenerTextBox implements CommandListener { public commandAction(Command cm, Displayable ds) { if (cm == cFin) { // Procesar el comando } } } TextBox t = new TextBox( Escribe un poema , , 500, TextField.ANY); t.addCommand(cFin = new Command( Fin , Command.OK, 0)); t.setListener(new listenerTextBox()); d.setCurrent(t);
  14. 14. Tarea:Siguiendo el ejemplo que hemos desarrollado en la asignatura, crear unvisor móvil de nuestra cuenta import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import java.util.*; public class MidletCuenta extends MIDlet { private Cuenta c; private Display d; private TextField tCodigo; private Command cEntrar, cSalir, cVolver, cMovimientos; private Form fPeticionCodigo, fInfoCuenta; private List lMovCuenta; public MidletCuenta() { d = null; } void crearComandos() { cEntrar = new Command("Entrar", Command.OK, 0); cSalir = new Command("Salir", Command.EXIT, 1); cVolver = new Command("Volver", Command.BACK, 0); cMovimientos = new Command("ver Mov.", Command.SCREEN, 0); }
  15. 15. MIDP: Interfaces Gráficas de Usuariopublic void startApp() { if (d == null) { d = Display.getDisplay(this); } crearComandos();crearFormPeticionCodigo();d.setCurrent(fPeticionCodigo); }void crearFormPeticionCodigo() { fPeticionCodigo = new Form("Información de cuentas"); fPeticionCodigo.append(tCodigo = new TextField("Código de cuenta ", null, 10, TextField.NUMERIC)); fPeticionCodigo.addCommand(cEntrar); fPeticionCodigo.addCommand(cSalir);fPeticionCodigo.setCommandListener(new listenerPeticionCodigo());tCodigo.setLayout(Item.LAYOUT_2 | Item.LAYOUT_CENTER); }class listenerPeticionCodigo implements CommandListener {public void commandAction(Command cm, Displayable s) { if(cm == cEntrar) { // Cargar la cuenta aquí crearFormInformacionCuenta(); d.setCurrent(fInfoCuenta); } else if (cm == cSalir) { destroyApp(true); notifyDestroyed(); } }} Sistemas operativos móviles
  16. 16. MIDP: Interfaces Gráficas de Usuariovoid crearFormInformacionCuenta() { // Crear formulario de información dae la cuenta fInfoCuenta = new Form("Información de cuenta"); fInfoCuenta.append(new StringItem("Código:", Long.toString(c.leerNumero()))); fInfoCuenta.append(new StringItem("Titular:", c.leerTitular())); fInfoCuenta.append(new StringItem("Interés:", Float.toString(c.leerInteres()))); fInfoCuenta.append(new StringItem("Saldo:", Float.toString(c.leerSaldo()))); fInfoCuenta.addCommand(cMovimientos); fInfoCuenta.addCommand(cVolver); fInfoCuenta.setCommandListener(new listenerInformacionCuenta()); // Crear lista de movimientos lMovCuenta = new List("Ultimos movimientos", List.IMPLICIT); Movimiento m; int nMov, nm; for (nMov = 10, nm = c.numMovimientosHistorico() - 1; nMov > 0 && nm >= 0; nm--, nMov--) { m = c.leerMovimientoHistorico(nm); lMovCuenta.append(cadenaDate(m.fecha) + + m.tipo + + m.importe + + m.saldo, null); } lMovCuenta.addCommand(cVolver); lMovCuenta.setCommandListener(new listenerInformacionMovimientos());} Sistemas operativos móviles
  17. 17. MIDP: Interfaces Gráficas de Usuarioclass listenerInformacionCuenta implements CommandListener{ public void commandAction(Command cm, Displayable s) { if(cm == cVolver) { d.setCurrent(fPeticionCodigo); } else if (cm == cMovimientos) { d.setCurrent(lMovCuenta); } }}class listenerInformacionMovimientos implements CommandListener { public void commandAction(Command cm, Displayable s) { if (cm == cVolver) { d.setCurrent(fInfoCuenta); } }} Sistemas operativos móviles
  18. 18. MIDP: PersistenciaMIDP: Persistencia●La capacidad de almacenamiento persistente de un dispositivo móvil puede ser muy limitada.●El soporte de tarjetas de memoria, cada vez máscomún, ha aumentado mucho las prestaciones (8Gben iPhone o Nokia N95) posibilitando una estructurade ficheros similar a la de un computador convencional.●Sin embargo el perfil MIDP es conservador y pro-porciona un soporte sencillo de persistencia a travésde registros de bloques de bytes. Sistemas operativos móviles
  19. 19. MIDP: PersistenciaUn MIDlet puede abrir un almacén de registros●con un nombre arbitrario mediante: RecordStore RecordStore.openRecordStore(“nombre”, true);● El segundo parámetro indica que el almacéndebe abrirse si no existe.●A través de las operaciones del objeto RecordStore podremos manejar los registros.●Normalmente un almacén no se comparte conotros MIDlets, aunque puede habilitarse este acceso.●El almacén de registros se cierra mediante: closeRecordStore() Sistemas operativos móviles
  20. 20. MIDP: Persistencia●El acceso a los registros se realiza a través deun identificador numérico, que es devuelto al aña-dir un registro: int addRecord(byte[] datos, int offset, int numBytes)●Para recuperar un registro debemos indicar suidentificador: int getRecord(int id, byte[] buffer, int offset)● Modificar un registro ya existente: void setRecord(int id, byte[] nuevosDatos, int offset, int numBytes)● Eliminar un registro: void deleteRecord(int id) Sistemas operativos móviles
  21. 21. MIDP: PersistenciaEs posible recorrer los registros de un almacén●creando una enumeración: RecordStore rs = RecordStore.openRecordStores( ejemplo, true); RecordEnumeration re = re.enumerateRecords(null, null, false); while (re.hasNextElement()) { byte[] datos = re.nextRecord(); // Operar con los datos } re.destroy(); rs.closeRecordStore();●La operación enumerateRecords() admite la es-pecificación de clases de filtrado y ordenación delos registros del almacén. Sistemas operativos móviles
  22. 22. MIDP: PersistenciaTarea:Crear un gestor de persistencia para las cuentas corrientes medianteun almacén de registros.import java.io.*;import java.util.*;import javax.microedition.rms.*;public class DAOCuentaRS { static DAOCuentaRS instancia = null; public static DAOCuentaRS obtenerInstancia() throws RecordStoreException { if (instancia == null) { instancia = new DAOCuentaRS(); } return instancia; } private DAOCuentaRS() {} public boolean existe(long numero) throws RecordStoreException, IOException { RecordStore rs = null; try { rs = RecordStore.openRecordStore("cuentas", true); return (buscarRegistroCuenta(rs, numero) != -1); } finally { if (rs != null) rs.closeRecordStore(); } } Sistemas operativos móviles
  23. 23. MIDP: Persistenciapublic Cuenta cargar(long numero) throws RecordStoreException, IOException { RecordStore rs = null; DataInputStream dis = null; Cuenta c = null; try { rs = RecordStore.openRecordStore("cuentas", true); int idReg = buscarRegistroCuenta(rs, numero); if (idReg == -1) { return null; } dis = new DataInputStream(new ByteArrayInputStream(rs.getRecord(idReg))); 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())); } } finally { if (dis != null) dis.close(); if (rs != null) rs.closeRecordStore(); } return c;} Sistemas operativos móviles
  24. 24. MIDP: Persistenciapublic void salvar(Cuenta c) throws RecordStoreException, IOException { RecordStore rs = null; ByteArrayOutputStream bos = null; DataOutputStream dos = null; try { rs = RecordStore.openRecordStore("cuentas", true); dos = new DataOutputStream(bos = new ByteArrayOutputStream()); 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); } int idReg = buscarRegistroCuenta(rs, c.leerNumero()); if (idReg != -1) { rs.setRecord(idReg, bos.toByteArray(), 0, bos.size()); } else { rs.addRecord(bos.toByteArray(), 0, bos.size()); } } finally { if (dos != null) dos.close(); if (rs != null) rs.closeRecordStore(); }} Sistemas operativos móviles
  25. 25. MIDP: Persistencia private int buscarRegistroCuenta(RecordStore rs, long numero) throws RecordStoreException, IOException { RecordEnumeration re = null; DataInputStream dis = null; long recNum; int id; try { re = rs.enumerateRecords(null, null, false); while (re.hasNextElement()) { id = re.nextRecordId(); dis = new DataInputStream(new ByteArrayInputStream(rs.getRecord(id))); recNum = dis.readLong(); if (recNum == numero) { return id; } dis.close(); dis = null; } } finally { if (dis != null) dis.close(); if (re != null) re.destroy(); } return -1; }} Sistemas operativos móviles
  26. 26. MIDP: Persistencia En el MIDlet debemos crear un atributo para referenciar el gestor de persis-tencia, y realizar su inicialización en startApp() public void startApp() { if (d == null) { d = Display.getDisplay(this); } if (dc == null) { try { dc = DAOCuentaRS.obtenerInstancia(); } catch(Exception e) { d.setCurrent(new Alert("Error", "No es posible abrir el almacén de registros", null, AlertType.ERROR)); destroyApp(true); notifyDestroyed(); return; } } // Crear las cuentas de ejemplo si no existen crearCuentasEjemplo(); crearComandos(); crearFormPeticionCodigo(); d.setCurrent(fPeticionCodigo); } Sistemas operativos móviles
  27. 27. MIDP: Persistenciaclass listenerPeticionCodigo implements CommandListener {public void commandAction(Command cm, Displayable s) { if(cm == cEntrar) { try { c = dc.cargar(Long.parseLong(tCodigo.getString())); if (c == null) { d.setCurrent(new Alert("Error", "Cuenta inexistente", null, AlertType.ERROR), fPeticionCodigo); return; } } catch(Exception e) { d.setCurrent(new Alert("Error", "Error de lectura de cuenta", null, AlertType.ERROR), fPeticionCodigo); return; } crearFormInformacionCuenta(); d.setCurrent(fInfoCuenta); } else if (cm == cSalir) { destroyApp(true); notifyDestroyed(); } }} Sistemas operativos móviles
  28. 28. MIDP: Conexión por redMIDP: Conexión por red●MIDP es especialmente potente en lo que se refie-re a la conexión por red mediante sockets, http yotros protocolos●La clase Connection representa una conexión ge-nérica y es extendida a tres conexiones que admi-ten E/S mediante streams: InputConnection, Output-Connection y StreamConnection●La clase StreamConnection es extendida a variasclases que representan distintos tipos de conexiones: CommConnection, HttpConnection, httpsConnection,SocketConnection, etc. Sistemas operativos móviles
  29. 29. MIDP: Conexión por red●La clase Connector es una factoría que a partir de un url devuelve la clase de conexión correspon-diente: Connection Connector.open(String url)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 streamde lectura o escrituraHttpConnection con1;con1 = (HttpConnection) Connector.open(http://www.google.es/search?hl=es&q=j2me);InputStream is = con1.openInputStream();// Utilizar el streamcon1.close(); Sistemas operativos móviles
  30. 30. MIDP: Conexión por red Ejemplo:El siguiente gestor de persistencia obtiene los datos de la cuentadesde un servidor webimport 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 numero) { try { cargar(numero); } catch(Exception e) { return false; } return true; } Sistemas operativos móviles
  31. 31. 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
  32. 32. Persistencia II: FicherosPersistencia II: Ficheros●El File Connection and PIM API (JSR 75) defineun nuevo tipo de conexión denominado FileConnec-tion que permite trabajar con ficheros de manerasimilar a un computador convencional.●Este API no está disponible en todos los disposi-tivos.●El acceso al sistema de ficheros requiere permisosespeciales si la aplicación no está certificada, paraevitar daños en el mismo. Sistemas operativos móviles
  33. 33. Persistencia II: Ficheros El siguiente ejemplo lee una imagen guardada en el dispositivoFileConnection fc;InputStream is;fc = (FileConnection) Connector.open( /Imagenes/flower.jpg , Connector.READ);is = fc.openInputStream();Image mi = Image.createImage(is); //Utilizar la imagenis.close();●La clase FileConnection permite abrir un stream deE/S al fichero pero también contiene operacionespara la creación, renombrado y borrado de ficheros y directorios. Sistemas operativos móviles
  34. 34. 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 =FileSystemRegistry.listRoots(); while(raicesSF.hasMoreElements()) {raizSF = (String) raicesSF.nextElement();// Hacer algo con la raiz encontrada } Sistemas operativos móviles
  35. 35. Persistencia II: FicherosEste gestor de persistencia utiliza el API JSR 75import 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
  36. 36. Persistencia II: Ficherospublic boolean existe(long numero) { try { cargar(numero); } catch(Exception e) { return false; } return true;}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.readUTF(), dis.readFloat()); c.saldo = dis.readFloat(); Sistemas operativos móviles
  37. 37. 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.open(urlCuenta(c.leerNumero()), ifConnector.READ_WRITE); (!fc.exists()) { fc.create(); } Sistemas operativos móviles
  38. 38. 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); nm < nMov; nm++) for (int nm = 0; { 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
  39. 39. Persistencia II: Ficheros●Otro problema adicional son las restricciones deseguridad existentes en algunos dispositivos, quesólo permiten el acceso a determinados directorios públicos (/Imagenes, /Sonidos, etc.) Sistemas operativos móviles
  40. 40. Para terminarPara terminar●Hemos estudiado MIDP a nivel básico●En función de las necesidades de la aplicaciónmóvil a implementar será necesario estudiar conmayor 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 13 5 ● Bluetooth API JSR 82 Sistemas operativos móviles

×