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.