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
[email protected]
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