Академический Документы
Профессиональный Документы
Культура Документы
Programacin Java
Plan
Introduccin Introducci Instalacin Instalaci Primer Programa Interfaz de Usuario en J2ME
Commands Screen (Alertas, formularios, imgenes, choicegroup, ticker) im choicegroup, ticker) GameCanvas (lectura de teclado, dibujar en pantalla, sprites, sprites, tiledLayer, tiledManager, scroll, colisiones) tiledLayer, tiledManager, scroll,
RMS HTTP Vibracin e Iluminacin Vibraci Iluminaci Otros: bluetooth/obex, servicios Web, Grficos 3D, bluetooth/ obex, Gr sonido y msica m Referencias 2
Introduccin
Se
llama J2ME (Java Micro Edition) a las Edition) implementaciones de Java par dispositivos mviles m Hay varias implementaciones dependiendo del tipo de dispositivo CLDC y MIDP Personal Java (jdk 1.22) API propia
Introduccin
El universo de J2ME.
Imagen de [Knudsen2003]
Introduccin
Imagen de [Knudsen2003]
Instalacin
Java Development Kit (JDK)
Descripcin: Entorno de desarrollo de java para PC. Versin 1.4.2 o Descripci Versi superior (ltima 1.5 y 1.6 Beta) ( Descarga: http://java.sun.com/j2se/downloads.html j2sdk-1_4_2-windows-i586.exe y j2sdk-1_4_2-doc.zip (docs) j2sdk- 1_4_2- windows- i586.exe j2sdk- 1_4_2docs) Instalacin: Instalaci
Ejecutar el instalador y seleccionar la carpeta por defecto. P.ej: P.ej: Descomprimir la documentacin en esa carpeta documentaci Actualizar la variable de entorno PATH=c:\jsdk1.4.2\bin\ PATH=c:\ jsdk1.4.2\bin\
c:\jsdk1.4.2 c:\ jsdk1.4.2
Instalacin
J2ME Sun Java Wireless Toolkit
Descripcin: Entorno para compilar y generar .jar y .jad incluye Descripci .jar .jad emuladores Descarga: http://java.sun.com/products/sjwtoolkit/download-2_3.html http://java.sun.com/products/sjwtoolkit/downloadsun_java_wireless_toolkit-2_3-beta-windows.exe sun_java_wireless_toolkit- 2_3- beta(Admite bluetooth, multimedia, API 3D, posicionamiento,) bluetooth, posicionamiento, Instalacin: Instalaci
Esto crea la siguiente estructura en c:\j2me\WTK23\apps\HolaMundo c:\ j2me\ WTK23\ apps\ Hay que guardar en src el cdigo (.java) (HolaMundo.java anterior) c (HolaMundo.java En classes se guardarn los (.class) guardar (.class) En bin se guardarn los ficheros que hay que enviar al mvil (.jad y .jar) guardar m (.jad .jar)
10
11
Siguiendo estos pasos se pueden probar todos los programas que se realicen en el emulador. El siguiente paso ser pasar el programa al telfono ser tel
12
6. Generar los fichero .jad y .jar: Project Package Create Package .jad .jar: 7. Los 2 ficheros a enviar al telfono son: HolaMundo.jad tel HolaMundo.jar, guardados en c:\j2me\WTK21\apps\HolaMundo\bin HolaMundo.jar, c:\ j2me\ WTK21\ apps\ HolaMundo\
y
13
14
8. Donde el nombre de la aplicacin, la versin y el suministrador aplicaci versi son los que se hayan seleccionado al editar los datos del proyecto 9. Si la instalacin es correcta, se podr ejecutar la aplicacin en instalaci podr aplicaci el men del telfono Aplicaciones Hola Mundo men tel
15
16
17
Dentro de la UMA es necesario tener abierto el puerto 80 en los servicios centrales de Informtica Inform
En algunos mviles ser suficiente con descargar el .jar m ser .jar En lo que no sea suficiente, habr que descargar el .jad habr .jad
pero modificando la linea URL de la siguiente forma:
Antes
MIDlet-Jar-URL: DBVMijar.jar
Despus
MIDlet-Jar-URL: http://miweb.com/DBVMijar.jar 18
19
Canvas Javax.microedition.lcdui
GameCanvas Javax.microedition.lcdui.game
20
10
slo uno (aunque puede ser compuesto como un form) form) que se muestre en el Display. Para asociarlo a la pantalla Display. se utiliza setCurrent y se puede cambiar cuando se quiera TextBox cuadrotexto;
cuadrotexto=new TextBox(titulo,contenido,30,TextField.ANY); pantalla.setCurrent(cuadrotexto); 21
hecho de elegir uno u otro salvo en la posicin en la que posici aparecer en pantalla aparecer Para crear una nuevo objeto Command 3 parmetros par (texto, tipo, prioridad [0 es la mxima]): m
Command miok; Miok=new Command(Aceptar, Command.OK,0) 22
11
cuales es una ayuda, en total hay 3 command asociados a las operaciones de salir de la aplicacin, ayuda y volver (salir de la aplicaci ayuda)
23
Programa: DBVCommands
24
12
Programa: DBVCommands
import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class DBVCommands extends MIDlet implements CommandListener { private Display pantalla ; private TextBox tintro,tayuda ; private Command salir, ayuda, volver; public DBVCommands () { pantalla = Display.getDisplay(this); // Preparando la pantalla principal tintro = new TextBox("Mis Comandos", "Puedes salir o elegir ayuda", 40, 0); salir = new Command("Salir", Command.EXIT, 0); ayuda = new Command("Ayuda",Command.HELP,1); tintro .addCommand(salir); tintro.addCommand(ayuda); tintro.setCommandListener(this); // Preparando pantalla de ayuda tayuda = new TextBox("Ayuda", "Para salir debe regresar :-)", 40, 0); volver=new Command("Volver",Command.BACK,1); tayuda.addCommand(volver); tayuda.setCommandListener(this); } public void startApp() { pantalla .setCurrent(tintro); } public void pauseApp() { }
25
Programa: DBVCommands
public void destroyApp(boolean unconditional) { } public void commandAction(Command c, Displayable displayable) { if (c == salir) { destroyApp(false); notifyDestroyed(); } else if (c==ayuda) { pantalla.setCurrent(tayuda); } else if (c==volver) { pantalla.setCurrent(tintro); } } }
26
13
IU: Screen:Alertas
Las alertas son cuadros de dialogo que avisan al usuario
de algn problema, confirman alguna accin del usuario, alg acci o muestran un recordatorio en la pantalla Hay varios tipos predefinidos
IU: Screen:Alertas
Por defecto aparecen acciones Command asociadas a Command
las alertas, aunque pueden definirse nuevas con addCommand para personalizar los resultados Para mostrar la alerta se cambia el display como siempre
pantalla.setCurrent(mialerta);
Cuando la alerta se cierra se vuelve a la pantalla anterior Si se quiere que al cerrar la alerta se pase a otra
pantalla se utiliza un segundo parmetro de setCurrent par
pantalla.setCurrent(mialerta,siguientepantalla);
28
14
IU: Screen:Formularios
Los formularios permiten recoger datos del usuario En un formulario se pueden incluir derivados de la clase
Item
ChoiceGroup, CustomItem, DateField, Gauge, ImageItem, ChoiceGroup, CustomItem, DateField, ImageItem, Spacer, StringItem, TextField StringItem,
Form miform; miform=new Form(Ttulo");
Programa: DBVAcceso
30
15
Programa: DBVAcceso
import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class DBVAcceso extends MIDlet implements CommandListener { private Display pantalla ; private Form flogin ; private Alert confirmacion; private TextField usuario; private TextField passwd; private Command salir,aceptar; private String cad; public DBVAcceso () { pantalla = Display.getDisplay(this); // Preparando la pantalla principal flogin=new Form("Control Acceso"); usuario=new TextField("usuario","",10,TextField.ANY); passwd=new TextField("contrasea","",10,TextField.ANY|TextField.PASSWORD); aceptar = new Command("Enviar", Command.OK, 0); salir = new Command("Salir", Command.EXIT, 0); flogin.append(usuario); flogin.append(passwd); flogin.addCommand(aceptar); flogin.addCommand(salir); flogin.setCommandListener(this); // Alerta de confirmacion de datos confirmacion= new Alert ("Confirmacin","", null, AlertType.CONFIRMATION); confirmacion.setTimeout(Alert.FOREVER); }
31
Programa: DBVAcceso
public void startApp() { pantalla .setCurrent(flogin); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } public void commandAction(Command c, Displayable displayable) { if (c == salir) { destroyApp(false); notifyDestroyed(); } else if (c==aceptar) { cad="Bienvenido al sistema " + this.usuario.getString(); confirmacion.setString(cad); pantalla.setCurrent(confirmacion); } }
32
16
Las imgenes se aadirn al fichero .jar (lo hace WT) im a adir .jar
33
34
17
35
Programa: DBVImagenes
3 segs.
36
18
37
38
19
39
IU: Screen:Formularios:ChoiceGroup
Permite crear botones de tipo radio y checkbox. checkbox. Hay 3 tipos
Choice.EXCLUSIVE Choice.MULTIPLE Choice.IMPLICIT Botones Radio Botones Checkbox Men
Para crear las selecciones: Para procesar elemento seleccionado en radio: Para procesar elementos seleccionados en check:
for (i=0;i<micheck.size();i++) { if (micheck.isSelected(i)){ mensaje=new StringItem("",micheck.getString(i)+"\n"); principal.append(mensaje); } } i=miradio.getSelectedIndex(); mensaje=new StringItem("",miradio.getString(i)+"\n"); miradio=new ChoiceGroup("Mi Radio",Choice.EXCLUSIVE); miradio.append("opcion1",null); // 2 parmetro es una imagen miradio.append("opcion2",null); principal.append(miradio);
40
20
Programa: DBVChoice
41
21
} public void startApp() { pantalla.setCurrent(principal); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } public void commandAction(Command c, Displayable displayable) { int i; StringItem mensaje; if (c == salir) { destroyApp(false); notifyDestroyed();
43
44
22
IU: Screen:Ticker
Permite mostrar un scroll horizontal. Se puede asociar a cualquier clase derivada de Screen Para crearlo y asociarlo, por ejemplo a un formulario
cad=new String("Soy un texto que se desplaza por la pantalla"); miticker=new Ticker(cad); principal.setTicker(miticker);
45
Programa: DBVTicker
46
23
47
24
49
IU: GameCanvas
Las aplicaciones no suelen utilizar directamente
GameCanvas, sino que heredan de esta clase GameCanvas, Como mnimo hay dos clases: Una para el midlet clases: principal y otra para la clase que hereda de GameCanvas El juego suele ejecutarse en una hebra independiente con el siguiente bucle principal
// Dentro de la clase que hereda de GameCanvas public void run() { Graphics g = getGraphics(); while (jugando == true) { colision(); // Controla colisiones leeTeclado(); // Lee acciones del usuario dibujaPantalla(g); // Dibuja la escena actual try { Thread.sleep(retraso); } // Retraso entre iteraciones catch (InterruptedException ie) {} } }
50
25
// Metodo para gestionar el teclado private void leeTeclado() { int keyStates = getKeyStates(); // Izquierda if ((keyStates & LEFT_PRESSED) != 0) { // Acciones cuando pulse izquierda } // Derecha if ((keyStates & RIGHT_PRESSED) !=0 ) { // Acciones cuando pulse izquierda } } 51
52
26
24
16 2 3 4
0 24
80
Fichero: babosin.png
53
54
27
Programa: DBVGameCanvas
Se va a mostrar en un programa los elementos
relacionados con GameCanvas vistos hasta este punto Se dibujaran algunas lneas y rectngulos y se mover l rect mover un Sprite por la pantalla Se va a utilizar una clase para el midlet (DBVGameCanvas), que ser muy similar en todos los DBVGameCanvas), ser programas que usen GameCanvas Por otro lado, se va a utilizar una clase que hereda de GameCanvas (BabosinCanvas) sobre la que recae la BabosinCanvas) mayor parte de la accin acci Esta ltima tiene una hebra que es iniciada por la clase principal
55
Programa: DBVGameCanvas
Cursores
56
28
57
58
29
59
60
30
62
31
Deco.png
Image tileImages = Image.createImage("/deco.png"); // Carga la imagen con los elementos de la pantalla TiledLayer decorado = new TiledLayer(40,24,tileImages,8,8); // reserva espacio para la capa del decorado // Selecciona los 40x24 elementos del decorado segn su posicin en deco.png // 0 indica que no hay nada en esa posicin int[] map= {42,41,42,41,1,2,42,41,1,2,42,41,1,2,42,41,1,2,42,41,1,2,42,41,1,2,42,41,1,2,42,41,1,2,42,41,42,41,1,2, 264,264,264,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,264, 264,264,264,0,0,248,249,250,251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,264, } // Guarda los elementos del mapa en la posicin de pantalla que corresponda for (int i=0; i < mapa.length; i++) { int columna = i % 40; // Se divide por el nmero de elementos de una fila=numero de columnas int fila = i/40; decorado.setCell(columna,fila,mapa[i]); // Actualiza 1 a 1 todas las celdas }
63
64
32
+ +
=
// Dibuja la imagen de fondo g.drawImage(fondo,decox/4,decoy/4,0); decorado.setPosition(decox,decoy); // Actualiza el decorado controlcapas.paint(g,0,0); // Pinta el decorado // Actualiza el personaje babosin.setPosition(babosinX,babosinY); babosin.paint(g); // pinta el personaje 65
66
33
67
Programa: DBVBabosin
En el siguiente programa se combina todo lo relacionado
con GameCanvas: Sprites, Imgenes, TiledLayer, GameCanvas: Sprites, Im TiledLayer, LayerManager, Control de Teclado LayerManager, Teclado Con esto se podra hacer prcticamente cualquier juego podr pr en 2D Se va a utilizar para el midlet la misma clase que en (DBVGameCanvas) DBVGameCanvas) Por otro lado, se va a utilizar una clase que hereda de GameCanvas (BabosinCanvas) en la que se desarrolla el BabosinCanvas) juego El programa carga una imagen de fondo, un tiledLayer y un sprite y cuando se mueven los cursores, el sprite se desplaza por el fondo que tambin se desplaza, tambi detectando posibles colisiones
68
34
Programa: DBVBabosin
69
70
35
72
36
73
37
75
76
38
RMS: RecordStore
RecordStore permite realizar operaciones con los
registros del tipo: Crear, Insertar, Borrar, ... Todas las operaciones que se realizan con RecordStore necesitan estar en un try..catch try..catch Para crear o abrir:
RecordStore recordstore; // Declaracin try { // Abre un registro llamado contador y lo crea si es necesario (2 parametro a true) recordstore = RecordStore.openRecordStore("contador", true ); } catch (Exception error) { alert = new Alert("Error Creando", error.toString(), null, AlertType.WARNING); alert.setTimeout(Alert.FOREVER); display.setCurrent(alert); }
String outputData = "1"; // Cadena que se va a escribir byte[] byteOutputData = outputData.getBytes(); // Conversin de la cadena // Se aade la array de bytes al registro desde el inicio (0) y con longitud (length) recordstore.addRecord(byteOutputData, 0, byteOutputData.length);
78
39
// Crea un array de bytes para leer los datos byte[] byteInputData = new byte[30]; int length = 0; // Almacenar el nmero de bytes leidos String cadena=new String(""); // Bucle para los todos los registros que haya (getNumRecords) for (int x = 1; x <= recordstore.getNumRecords(); x++) { // Lee el registro de la posicin x en el array de bytes al inicio (0) length = recordstore.getRecord(x, byteInputData, 0); cadena=cadena + " "+ new String(byteInputData); } 79
80
40
Para cada telfono emulado hay una carpeta con su nombre, por tel
ejemplo para el DefaultColorPhone
C:\WTK22\appdb\DefaultColorPhone
Cada recordset es precedido por run_by_class_storage_ run_by_class_storage_ Es decir si tenemos un RecordStore llamado contador, que se ha
usado en el telfono por defecto se encontrar en: tel encontrar
C:\WTK22\appdb\DefaultColorPhone\run_by_class_storage_contador.db
81
Programa: DBVRMSSimple
Para probar los elementos bsicos de registros se va a b
mostrar el programa DBVRMSSimple Este programa crea un RecordStore llamado contador en el que la primera vez escribe la cadena 1 Y posteriormente escribe 2, 3, ... Dispone de un men que permite Crear, Insertar, Ver, men Borrar y Salir
82
41
Programa: DBVRMSSimple
Salir
83
84
42
85
43
87
88
44
tipos La clase DataOutputStream tiene mtodos para escribir todo tipo de elementos: elementos:
boolean Byte Float Int String writeBoolean writeByte writeFloat writeInt writeUTF
89
90
45
Programa: DBVRMSRecords
Insertar Listado
Salir 92
46
} public void startApp() { cargarRecords(); mostrarRecords(); pantalla.setCurrent(alert,principal); } public void pauseApp() { } public void destroyApp( boolean unconditional ) { } public void commandAction(Command command, Displayable pantallaable) { if (command == salir) { // Accin para terminar if (records!=null) { cerrarRecords(); } destroyApp(true); notifyDestroyed(); } else if (command==nuevorecord) {// Aadir un nuevo record pantalla.setCurrent(frecord); } else if (command==listado) { // Ver todos los records mostrarRecords(); 94
47
96
48
97
98
49
Comunicaciones HTTP
J2ME permite hacer conexiones por HTTP Esto permite hacer cualquier tipo de aplicacin en la que aplicaci
el dispositivo mvil ser el cliente m ser Lo nico que hay que hacer es definir un protocolo propio para interpretar los mensajes entre el cliente y el servidor Lo ms sencillo es que el servidor devuelva texto plano m Por ejemplo, el telfono pide por el mtodo get la lista tel m de citas del da, y el servidor las devuelve: d
Cliente (Telfono abre esta direccin)
http://miservidor.es/citas.jsp?idusuario=bueno&fecha=hoy
99
<?php // Enviaremos un texto plano header('Content-type: text/plain'); echo ("hola mundo"); jsp ?> <% response.setContentType("text/plain");%> <%=Hola Mundo%>
50
Programa: DBVHTTPHolaMundo
La luz verde Indica conexin Web
102
51
public class DBVHTTPHolaMundo extends MIDlet implements CommandListener, Runnable { private Alert alert; private Command salir,conectar; private Display pantalla; private Form principal; private TextField ftexto; public DBVHTTPHolaMundo() { principal=new Form("Conexion HTTP"); // Preparacion de la pantalla principal ftexto=new TextField("Texto Leido:","",30,TextField.ANY); conectar=new Command("Conectar", Command.SCREEN,0); salir = new Command("Salir", Command.EXIT, 0); principal.append(ftexto); principal.addCommand(conectar); principal.addCommand(salir); principal.setCommandListener(this); } public void startApp() { pantalla = Display.getDisplay(this); pantalla.setCurrent(principal); ftexto.setString("Pulse conectar..."); } public void pauseApp() { }
103
52
105
Curiosidades
Para hacer vibrar el telfono a partir de MIDP 2.0 tel Para probar estas caractersticas se va a mostrar un caracter
Display.vibrate(100) .- Tiempo en Milisegundos Display.vibrate(100) . Display.flashBacklight(tiempo).- Enciende la luz del telfono Display.flashBacklight(tiempo).tel
programa que permitir usar el telfono para dar permitir tel masajes o como una linterna :-) :En el emulador la vibracin se muestra con un zumbido vibraci La luz de fondo se muestra con un marco de color No todos los telfonos permiten controlar la luz y el tel vibrador
106
53
Programa: DBVMasaje
zumbido
107
Programa: DBVMasaje
import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class DBVMasaje extends MIDlet implements CommandListener { private Display pantalla ; private TextBox tintro,tayuda ; private Command salir, masaje, linterna; public DBVMasaje(){ pantalla = Display.getDisplay(this); // Preparando la pantalla principal tintro = new TextBox("Mi linterna mgica", "Elije un masaje o una linterna", 40, 0); salir = new Command("Salir", Command.EXIT, 0); masaje = new Command("Masaje",Command.HELP,1); linterna= new Command("Linterna",Command.SCREEN,1); tintro .addCommand(salir); tintro.addCommand(masaje);tintro.addCommand(linterna); tintro.setCommandListener(this); } public void startApp() {pantalla .setCurrent(tintro); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } public void commandAction(Command c, Displayable displayable) { if (c == salir) { destroyApp(false); notifyDestroyed(); } else if (c==linterna) { pantalla.flashBacklight(3000); // Enciende la luz 3 segundos } else if (c==masaje) { pantalla.vibrate(3000); // Activa la vibracin 3 segundos } } }
108
54
Sonidos
Tonos en la clase Manager
playTone(int nota, int duracion, int volumen)
Las notas se asocian igual que en un midi, cada tecla del midi,
piano es una nota C(60-440Hz)C#(61)D(62)D#(63)E(64)F(65)F#(66) C(60G(67)G#(68)A(69) Volumen mximo=100 m
Manager.playTone(60,1000,100)
109
Para ampliar
Servicios Web (jsr172) Bluetooth/OBEX (jsr82)
Grficos 3D (jsr184) Gr Sonidos y Msica. MMAPI(Mobile Media API-jsr135) sica. API Uso de push para iniciar aplicaciones desde un servidor
en el movil RecordEnumeration
Permite ordenar y filtrar los registros de un RecordStore
Para probar los ejemplos bluetooth es necesario en ktoolbar: ktoolbar: Edit Preferences Security Security Domain=trusted
Location (jsr179) Localizacin geogrfica (CLDC 1.1) Localizaci geogr Cada especificacin jsrXYZ se puede encontrar en:
http://jcp.org/en/jsr/detail?id=XYZ
110
55
Referencias
Jonathan Knudsen, Wireless Java: Developing with J2ME, 2nd edition. J2ME James Keogh, The Complete Reference: J2ME, Ed. Osborne, 2003. J2ME Jason Lam, J2ME & Gaming, 2004. Gaming
http://www.jasonlam604.com
Libros
Artculos Art Qusay H. Mahmoud, Wireless Application Programming with J2ME and Mahmoud, Bluetooth, 2003 Bluetooth
Jonathan Knudsen, Creating 2D Action Games with the Game API, API
2003. http://developers.sun.com/techtopics/mobility/midp/articles/game/ http://developers.sun.com/techtopics/mobility/midp/articles/game/ Webs de Inters Inter Forum Nokia. http://www.forum.nokia.com/ http://www.forum.nokia.com/ Java en sun. http://java.sun.com/
111
Curiosidades
Para hacer vibrar el telfono a partir de MIDP 2.0 tel
display.vibrate(100) .- Tiempo en Milisegundos display.vibrate(100) . Display.flashBacklight(tiempo).- Enciende la luz del telfono Display.flashBacklight(tiempo).tel
112
56