lunes, 18 de octubre de 2010

Primeros pasos: Sonido

Una perla que ya iremos ampliando.

Para generar sonidos con el telefono o ponerle musica a nuestra aplicacion podemos usar un Player. Hay diferentes tipos de Player, desde uno de tonos (tipo 8bits) hasta un reproductor multimedia de video.

Pero para empezar por algo facil os dejo un ejemplo de un arpegio con el Player de MIDI.

Para ello usamos el Manger, que es un objeto que nos permite crear diferentes reproductoes.
Y un MIDIControl que es el objeto que configura la secuencia de sonidos, el sintetizador.
Player player = Manager.createPlayer(Manager.MIDI_DEVICE_LOCATOR);
player.realize();
// get volume control for player and set volume to max
MIDIControl synth = (MIDIControl)player.getControl("javax.microedition.media.control.MIDIControl");
// the player can start with the smallest latency
player.prefetch();
// non-blocking start
player.start();
synth.setChannelVolume(channel, 100);
synth.setProgram(channel,-1,program);
//59 is G/Do
static final int[] TONES=new int[]{59,61,63,64,66,68,70,71};               
synth.shortMidiEvent(MIDIControl.NOTE_ON, TONES[0],100);
synth.shortMidiEvent(MIDIControl.NOTE_ON, TONES[2],100);
synth.shortMidiEvent(MIDIControl.NOTE_ON, TONES[4],100);
synth.shortMidiEvent(MIDIControl.NOTE_ON, TONES[7],100);
 Mas informacion en el API de multimedia

Primeros pasos: Screen y Canvas

Siguiendo con la parte general, las aplicaciones para Symbian tienen dos posibles modos visuales:
  • Screen es el objeto que te permite gestionar la pantalla del movil a modo de formulario, puedes usar etiquetas, texto, botones, campos editables, opciones, check button, etc.
  • Canvas es la parte grafica, te permite utilizar la pantalla del movil como un lienzo y presentar lineas, ciculos, rectangulos... y de modo mas avanzado imagenes, sprites y capas.
El ejemplo de Hola Mundo está creado a partir de un Form que es un objeto de la rama de los Screen, en el se utiliza además un StringItem que permite representar etiquetas o botones.

El Form es un contenedor de "Items" al que se le pueden definir una estructura tipo lista (un objeto debajo de otro) o tipo tabla (con objetos en paralelo y en filas) y tambien puedes definir diferentes operaciones que conformarán los menus y botones estandar de la parte inferior del telefono (o a la derecha si permite apaisado).

Siguiendo con los formularios, puedes definir en un mismo MIDlet tantos formularios como quieras y adecuar diferentes pulsaciones para moverte entre ellos. Así puedes definir un comando que te permite ir de un formulario a otro y otro comando para volver al primero.

Usando display.setCurrent(mi_form) puedes hacer que en pantalla se presente uno u otro formulario.

Para que tu MIDlet pueda recoger los comandos de opciones y menus, debe implementar el interfaz CommandListener y sobreescribir la funcion commandAction

Para procesar el comando "salir" (para cerrar tu MIDlet y volver al menu del telefono) debes crear un objeto Command del siguiente modo:
Command exitCommand = new Command("Exit", Command.EXIT, 1)
Debes registrar el ComandListener que vas a usar en tu formulario:
mi_form.setCommandListener(this);
Y añadir el comando al formulario, para que aparezca como una opcion:

mainForm.addCommand(exitCommand);

Y en la funcion commandAction debes preguntar por cual es el comando que se ha ejecutado:
    public void commandAction(Command command, Displayable displayable) {
        if (command == exitCommand) {
            notifyDestroyed();
        }
    }
De este modo, cuando pulses en "Exit" se ejecutará el commandAction y si el comando es exitCommand, se lanza la notificación al sistema para que "destruya el MIDLet"

Además del CommandListener hay otro modo de asignar y recibir comandos, es el ItemCommandListener y la funcion commandAction en su version "Item" (la otra funcion tiene como parametro un "Displayable", en nuestro caso, un Form).

Funciona del mismo modo que la version para Form, pero en este caso, la opcion solo aparece en el menu si tienes seleccionado el Item al que le añadiste el comando. Por ejemplo si crear un StringItem y le asocias el comando "delCommand", en las opciones el menu sólo aparece "Delete" cuando tienes seleccionado ese Item (cuando lo tienes marcado), sino aparecen unicamente las opciones de comando que haya asignado al Form. Esto puede parecer un poco lioso, pero lo mejor es que probeis a asignar comandos a diferentes elementos y veais como se comporta vuestro telefono, que menus aparecen y como se organizan las opciones en listas, porque esto depende de la version de Symbian y de la marca del telefono.

Si quieres rehacer entero el contenido de un Form, pero no quieres perder la configuracion de comandos... solo cambiar los elementos que contiene, puedes quitar y poner elementos con los metodos append y delete.
  • append recibe el Item que quieres añadir y lo coloca "detras" del ultimo elemento. 
  • delete pide un numero, que es la posicion (o el orden en que lo has añadido) comenzando por el 0 (como siempre en Java) del Item que queires quitar del Form
  • Con el metodo deleteAll() elminas todos los Items del Form y puedes volver a rellenar desde el principio.
 Aqui teneis todo el API del paquete LCDUI que es el que contiene los elementos que se pueden presentar en la pantalla:

En otro post veremos el modo de usar los Canvas, como usar las funciones "paint" y "repaint" y como detectar la pulsacion de la pantalla tactil o de las diferentes teclas de teclado.

lunes, 20 de septiembre de 2010

Primeros pasos: parametros del JAD o JAR

Este es un tema interesante al que iremos recurriendo cuando vayamos avanzando en nuestros Midlets.

Muchas de las configuraciones a cerca de como queremos que el telefono trate nuestras aplicaciones se configuran en el properties del JAD o en el Manifest del JAR.

En cualquier caso, ambas las editaremos desde el Application Descriptor, en diferentes campos.
  • Nombre del Midlet, el fabricante (vendor) y la version
  • El tamaño en datos, la descripcion de la aplicacion y los mensajes de borrado e instalacion.
  • Los valores especificos para Motorolas y Nokias
  • Los certificados y firmas
  • Otras operativas como la necesidad de mostrar las teclas de navegacion, la orientacion de la pantalla (en los dispositivos que soportan el "apaisado"), etc.
Todos los valores posibles podeis consultarlos en la biblioteca de Desarrollo JavaME de Nokia buscando por "JAR manifest attributes".

Los mas ultiles son:
  • Nokia-MIDlet-App-Orientation: [portrait|landscape] que define la orientacion obligatoria del telefono. Si indicas "landscape" el telefono ignorará la posicion y siempre mantendrá tu aplicación apaisada.
  • Nokia-MIDlet-On-Screen-Keypad: [no|gameactions|navigationkeys] que permite ocultar o mostrar los botones de navegacion y juegos (sobre todo util poder ocultarlos).
  •  Nokia-MIDlet-On-Screen-Softkeys-Position: [right|bottom] que permite cambiar la situacion de los botones en modo apaisado (landscape), forzando que queden siempre en la parte inferior de la pantalla (y no a la derecha, que es la posicion por defecto para S60v5)
  • Nokia-MIDlet-Original-Display-Size y Nokia-MIDlet-Target-Display-Size: width, height que se usan para informar de las dimensiones con las que se ha diseñado la aplicación, así como los valores reales del dispositivo donde va a ejecutarse (tendrás que cambiar el Target_size si quieres hacer aplicaciones para dos telefonos con diferente resolución). Estos dos parametros son muy utiles para adaptar aplicaciones, imagenes, fondos, sprites y demás cosas hechas para dispositivos de pantalla pequeña (240,320) a dispositivos de pantalla grande (360,480), combinandolo con "on_screen_keypad = no" si es un dispositivo tactil.
  • Especificos para dispositivos NOKIA tienes algunos mas que te permiten controlar la ejecución de tu aplicativo en el arranque, impedir que se apague, mantenerlo en background o cosas por el estilo... utiles si quieres hacer software tipo "demonio" que esté ejecutandose todo el tiempo... por ejemplo para mantener estadisticas de uso o monitorizar alguna funcion del sistema.

Primeros pasos: "Hola mundo"

En la web encontraréis un millon de ejemplos del "hola mundo", aqui os dejo el que yo usé.

De todos modos, lo realmente importante es saber como iniciar un proyecto de tipo "MIDlet".

La estructura basica del proyecto es:
  1. Un directorio scr con nuestro codigo
  2. Un directorio res con los recursos encesarios (iconos, imagenes, etc)
  3. Un descriptor de la aplicacion (con datos de configuracion y parametros de ejecucion)
  4. Un fichero de propiedades de la compilacion (y de generacion del jar).
Eclipse genera todos estos elementos de forma automatica cuando elegimos: New > Midlet proyect
O bien, si Midlet proyecto no parece directamente: New > Proyect...  Desplegamos Java ME y elegimos Midlet proyect.


Ahora podemos copiar el ejemplo del Hola Mundo y compilarlo.

Antes de lanzar el emulador de dispositivo, para probar nuestro programa tenemos que fijar algunos parametros en el descriptor de aplicacion.

Podemos hacer doble click sobre el Application Descriptor y Eclise nos muestra varias pestañas con diferentes elementos a configurar. Por ahora solo nos interesa la sengunda pestaña, donde elegiremos el Midlet a ejecutar (un proyecto puede tener varios Midlets, unos pueden llamar a otros, o puedes hacer que tu instalación genere "dos aplicaciones" con dos iconos en el telefono).


Pulsamos Add, ponemos un nombre al Midlet y elegimos la clase que se ejecutará, en nuestro caso el HolaMundoMidlet.

Ahora en la primera pestaña "Overview" en la seccion Runtime elegimos el "tipo de telefono" donde queremos probarlo. Por defecto aparece el telefono elegido al configurar JavaMe. Yo os aconsejo, aunque es más pesado de cargar, que useis el S60Emulator, porque permite cargar varias veces la aplicacion sin tener que apagarlo cada vez (como pasa con los dispositivos del JavaMe o del Wireless Toolkit).

Lanza la aplicacion ejecutando la opcion JavaME Midlet en la seccion Running y comprueba como tu dispositivo virtural saluda al mundo entero.

viernes, 17 de septiembre de 2010

El entorno de trabajo: Symbian S60

La guia para instalar las librerias y complementos necesarios para desarrollar software sobre plataforma Symbian está en el foro de Nokia

Los pasos a seguir son:
  1. Descargar el Sun Java Wireless Toolkit for CLDC aunque yo recomiendo que descargueis directamente el Java ME SDK, que contiene dicho toolkit en su ultima version, la 3.0.
  2. Descargar las librerias de Symbian S60 del foro de Nokia. Elegid el fichero: S60_5th_Edition_SDK_v1_0_en.zip (o version posterior).
  3. Descargar ActivePerl, esta no es una descarga obligatoria para un desarrollador en Java, pero el Emulador utiliza Perl en algunas de sus funciones.
  4. Además podeis descargar la librería de consulta para desarrolladores en Java ME que se integra con Eclipse (y funciona pulsando F1 en la herramienta)
Realmente si habeis descargado Pulsar, no hace falta nada más porque el paquete de Eclipse ya lleva todos los plugin necesarios, si ya teníais instalada una version de Eclipse y no quereis cambiarla, podeis instalar Eclipse Mobile Tools desde el udate site oficial o desde la opcion Help > Install New Software del propio Eclipse.

Ahora vamos a ir instalando cada uno de los ficheros descargados:
  1. Si habeis decidido instalar el Perl, es lo primero.
  2. Descomprimimos y ejecutamos la instalacion de Symbian_S60_5th y "recordamos" el directorio donde se ha instalado, por defecto es C:/S60/devices. Si no habeis instalado Perl, aparecerá una alerta durante la instalacion, la ignorais y continuais el proceso.
  3. Ahora hacemos lo mismo con el Java Me v3.0 y tambien "recordarmos" donde lo hemos instaldo, por ejemplo: C:\Java_ME_platform_SDK_3.0
Comenzamos a configurar todo junto: encemos Eclipse, vamos al Workbench y abrimos la ventana de configuracion: Window > Preferences. En el arbol de configuracion buscamos Java ME y dentro de ella: Device Management.
Este proceso tendremos que hacerlo dos veces, salvo que hayais tenido la precaucion de instalar el Java ME v3 dentro del directorio C:/S60 (jeje, podría haberlo dicho antes, verdad?).
  1. Elegimos Manual Install
  2. Pulsado Browse y elegimos el directorio S60 donde hemos instalado las librerias de Symbian... esperamos un poco y aparecen los dos dispositivos: Device y Emulator.
  3. Volvemos a pulsar Manual Install
  4. Ahora buscamos el directorio Java ME platform DSK... esperamos otro poco y aparecen todos los dispositivos standar de Java, son 9. Si instasté el Wireless Toolkit, aparecen menos dispositivos (y los nombres son distintos).
  5. Pulsamos OK, y se cierra la ventana.

Ahora, para mejorar la experiencia con los simuladores de dispositivos, vamos a cambiar un par de cosas en el debuger de Eclipse.
  1. Entramos en las opciones de configuracion otra vez: Window > Preferences
  2. Navegamos hasta Java - Debug
  3. Desmarcamos las dos opciones:
  • Suspend execution on uncaught exceptions.
  • Suspend execution on compilation errors.
De este modo, los errores que pueda lanzar el emulador no afectan a la ejecucion o debug de nuestros programas.

Ya solo nos queda añadir la documentacion de Java ME a Eclipse, copiado el fichero Java_Developers_Library_3.1.0.jar dentro del direcrtorio eclipse/plugins. Esto ultimo es mejor hacerlo con Eclipse apagado.

El entorno de trabajo: Eclipse

Cuando nos planteamos comenzar a desarrollar software para un telefono, lo primero es disponer un entorno de trabajo que nos ayude en la labor.

El entorno de desarrollo más extendido para trabajar con Java en dispositivos moviles es Eclipse y mas concretamente el paquete Pulsar

La version con la que yo trabajo es Helios, que es la release de 2010.

Descargad la aplicacion e instaladla (creo que es suficiente con descomprimir el archivo en un directorio "/eclipse"). Luego modificad el fichero eclise.ini para que asigne 1Gb al heap, editando la linea:

-Xmx384m
y poniendo

-Xmx1024m
Ahora iremos instalando las librerias necesarias para cada sistema operativo: Symbian, Android, etc.