120
BlackBerry Java Application Multimedia Versión: 5.0 Guía de desarrollo

Blackberry Java Application 5

Embed Size (px)

Citation preview

Page 1: Blackberry Java Application 5

BlackBerry Java ApplicationMultimediaVersión: 5.0

Guía de desarrollo

Page 2: Blackberry Java Application 5

Publicado: 2010-06-04SWD-741609-0604105706-005

Page 3: Blackberry Java Application 5

Contenido1 Trabajo con archivos multimedia en una aplicación de dispositivo BlackBerry................................................................ 5

Crear una aplicación de dispositivo BlackBerry que reproduzca multimedia.......................................................................... 5

Crear una aplicación de dispositivo BlackBerry que reproduzca archivos multimedia.................................................. 6

Código de ejemplo: reproducción de archivos multimedia desde un URI...................................................................... 6

Código de ejemplo: reproducir una secuencia de tonos................................................................................................... 7

Crear una aplicación de dispositivo BlackBerry que reproduzca multimedia desde un flujo de entrada.................... 8

Crear una aplicación de dispositivo BlackBerry que reproduzca contenido multimedia............................................... 9

Crear una aplicación de dispositivo BlackBerry que reproduzca un vídeo en un campo de la interfaz de usuario

.................................................................................................................................................................................................. 9

Crear una aplicación de dispositivo BlackBerry que tome una fotografía utilizando la cámara.................................. 10

Crear una aplicación de dispositivo BlackBerry que envíe audio a un dispositivo con Bluetooth................................ 11

Crear una aplicación Gestor de contenido que reproduzca multimedia......................................................................... 12

Código de ejemplo: crear una aplicación Gestor de contenido que reproduzca multimedia....................................... 14

Especificación de las características de una aplicación de dispositivo BlackBerry que reproduce multimedia.................. 19

Consultar las características de reproducción multimedia con las que es compatible una aplicación de dispositivo

BlackBerry............................................................................................................................................................................... 19

Especificar los parámetros de reproducción de vídeo dentro de una aplicación de dispositivo BlackBerry............... 19

Especificar el volumen que una aplicación de dispositivo BlackBerry utiliza para reproducir archivos multimedia

.................................................................................................................................................................................................. 20

Respuesta a la entrada del usuario............................................................................................................................................... 20

Recibir una notificación cuando un usuario pulsa una tecla multimedia en un dispositivo BlackBerry...................... 20

Responder cuando un usuario de dispositivo BlackBerry pulsa una tecla de volumen................................................. 21

Responder cuando cambie el estado de un objeto Player................................................................................................. 21

Reproducción de archivos multimedia en una aplicación de dispositivo BlackBerry............................................................. 22

Archivo de reproducción de vídeo RIMM............................................................................................................................ 22

Formato de vídeo propio de RIM (archivo de reproducción RIMM)................................................................................. 23

Búfer y reproducción de contenido multimedia................................................................................................................. 25

Código de ejemplo: reproducción de archivos multimedia en una aplicación de dispositivo BlackBerry................... 27

Código de ejemplo: lectura de datos desde un búfer........................................................................................................ 28

Código de ejemplo: reproducción de archivos multimedia desde un archivo en el dispositivo BlackBerry................ 30

Código de ejemplo: análisis de un archivo de reproducción de vídeo RIMM................................................................. 31

Grabación de archivos multimedia a través de una aplicación de dispositivo BlackBerry.................................................... 35

Grabar audio en una aplicación de dispositivo BlackBerry............................................................................................... 35

Page 4: Blackberry Java Application 5

Código de ejemplo: registro de audio desde un objeto Player......................................................................................... 37

Grabar vídeo con la aplicación de grabación de vídeo de BlackBerry............................................................................. 38

Utilizar la API multimedia para grabar vídeo...................................................................................................................... 38

Código de ejemplo: uso de la API multimedia para grabar vídeo.................................................................................... 40

Reproducir archivos multimedia en la aplicación multimedia del dispositivo BlackBerry..................................................... 51

Iniciar la aplicación multimedia con o sin contenido......................................................................................................... 51

Reproducir audio en BlackBerry Browser............................................................................................................................ 52

Reproducir un vídeo en BlackBerry Browser....................................................................................................................... 52

2 Trabajo con imágenes de la aplicación Cámara..................................................................................................................... 53

Iniciar la cámara desde una aplicación del dispositivo BlackBerry........................................................................................... 53

Crear una aplicación Gestor de contenido que reproduzca multimedia.................................................................................. 53

Código de ejemplo: crear una aplicación Gestor de contenido que reproduzca multimedia................................................ 55

Recibir una notificación de los eventos del sistema de archivos.............................................................................................. 60

Detectar cuándo se agrega o elimina una imagen en el sistema de archivos del dispositivo BlackBerry........................... 60

Recuperar una imagen................................................................................................................................................................... 61

Mover una imagen dentro del mismo directorio del sistema de archivos................................................................................ 62

Mover una imagen a un directorio diferente del sistema de archivos...................................................................................... 62

Eliminar una imagen del sistema de archivos............................................................................................................................. 63

3 Dibujar y posicionar imágenes.................................................................................................................................................. 65

Posicionar una imagen................................................................................................................................................................... 65

Comprobar que el dispositivo BlackBerry es compatible con una pantalla en color.............................................................. 66

Recuperar el número de colores con los que es compatible la pantalla del dispositivo BlackBerry..................................... 66

Configurar la transparencia del píxel en el área de trabajo...................................................................................................... 67

Consultar las operaciones de malla con las que es compatible la aplicación de dispositivo BlackBerry............................. 67

Dibujar una ruta sombreada y con relleno................................................................................................................................... 67

Código de ejemplo: dibujo de una ruta que pase del azul al rojo en la pantalla de un dispositivo BlackBerry.................. 68

Activar o desactivar un estilo de dibujo....................................................................................................................................... 68

Determinar si se ha configurado un estilo de dibujo.................................................................................................................. 68

Código de ejemplo: determinación de si el estilo de dibujo especificado está activado....................................................... 69

Utilizar una imagen de mapa de bits monocromáticos como marca....................................................................................... 69

Código de ejemplo: demostración del uso de una imagen de mapa de bits monocromáticos como marca....................... 70

Crear una imagen de mapa de bits utilizando otra imagen de mapa de bits.......................................................................... 70

Crear una imagen de mapa de bits que contenga contenido con tamaño modificado de otra imagen de mapa de bits

........................................................................................................................................................................................................... 71

Page 5: Blackberry Java Application 5

Duplicar una imagen de mapa de bits......................................................................................................................................... 71

Crear una imagen de mapa de bits que contenga parte del contenido de otra imagen de mapa de bits........................... 71

Dibujar una imagen en una imagen de mapa de bits vacía...................................................................................................... 72

Filtros de interpolación................................................................................................................................................................... 72

4 Visualización de imágenes......................................................................................................................................................... 73

Visualización de una imagen acercándola, alejándola y desplazándola.................................................................................. 73

Mostrar una imagen acercándola, alejándola y desplazándola................................................................................................ 73

Código de ejemplo: visualización de una imagen acercándola, alejándola y desplazándola................................................ 74

Visualización de una fila de imágenes para realizar desplazamientos..................................................................................... 74

Mostrar una fila de imágenes para realizar desplazamientos................................................................................................... 74

Código de ejemplo: visualización de una fila de imágenes para realizar desplazamientos.................................................. 76

5 Uso de imágenes sin procesar................................................................................................................................................... 78

Recuperar los datos de la imagen sin procesar........................................................................................................................... 78

Almacenar datos sin procesar de la imagen................................................................................................................................ 78

Comparar dos imágenes sin procesar.......................................................................................................................................... 78

Comparar dos imágenes de mapa de bits para comprobar si son diferentes.......................................................................... 79

6 Uso de imágenes cifradas.......................................................................................................................................................... 80

Acceder a una imagen cifrada a través de un flujo de entrada................................................................................................. 80

Cifrar una imagen........................................................................................................................................................................... 80

Mostrar una imagen cifrada.......................................................................................................................................................... 81

Especificar el modo de descodificación de una imagen............................................................................................................. 81

Especificar el tamaño de la pantalla de una imagen cifrada..................................................................................................... 81

7 Uso de contenido SVG en una aplicación del dispositivo BlackBerry................................................................................. 82

Descargar contenido SVG.............................................................................................................................................................. 82

Reproducir contenido multimedia enriquecido........................................................................................................................... 82

Escuchar eventos al descargar un archivo .pme......................................................................................................................... 83

Responder a eventos al descargar un archivo .pme................................................................................................................... 84

Código de ejemplo: respuesta a eventos cuando una aplicación de dispositivo BlackBerry descarga contenido SVG

........................................................................................................................................................................................................... 85

Descargar y reproducir un archivo .pme...................................................................................................................................... 87

Reproducir contenido SVG............................................................................................................................................................ 88

Acceder a contenido SVG a través de una conexión con la que no es compatible MediaManager..................................... 89

Page 6: Blackberry Java Application 5

Código de ejemplo: implementación de un marco de conector personalizado...................................................................... 90

8 Creación de gráficos 2D y 3D con JSR-239............................................................................................................................. 92

Paquetes para la compatibilidad con JSR-239............................................................................................................................ 92

Código de ejemplo: representación de un triángulo 2D en varios colores.............................................................................. 93

Código de ejemplo: dibujo de un cubo en 3D..................................................................................................................... 98

Código de ejemplo: dibujo de un cubo en 3D............................................................................................................................. 104

Utilidades de matemáticas 3D...................................................................................................................................................... 110

Código de ejemplo: uso de aritmética de punto fijo.......................................................................................................... 110

9 Glosario......................................................................................................................................................................................... 112

10 Comentarios................................................................................................................................................................................. 114

11 Historial de revisión del documento......................................................................................................................................... 115

12 Aviso legal..................................................................................................................................................................................... 116

Page 7: Blackberry Java Application 5

Trabajo con archivos multimedia en una aplicación dedispositivo BlackBerry

1

Crear una aplicación de dispositivo BlackBerry que reproduzca multimediaPuede crear una aplicación de dispositivo BlackBerry® que reproduzca multimedia en BlackBerry® Browser o en la aplicaciónMultimedia en un dispositivo BlackBerry. La aplicación multimedia del dispositivo BlackBerry también puede crearse parareproducir audio, vídeo y contenido SVG binario. Asimismo, la aplicación del dispositivo BlackBerry también puede crearse paragrabar audio y el vídeo y enviar el audio a unos auriculares con Bluetooth®.

La API del Gestor de contenido también se utiliza para proporcionar un modelo de ejecución para invocar de forma remota lasaplicaciones secundarias del dispositivo BlackBerry. CHAPI es un mecanismo ideal para configurar parámetros de invocaciónpara aplicaciones secundarias del dispositivo BlackBerry. Con CHAPI es posible invocar aplicaciones proporcionando tanto unaURL, como tipo de contenido, o el ID de contenido cuando se utiliza uno de los constructores disponibles en la clasejavax.microedition.content.Invocation.

Nota: CHAPI intentará recuperar una respuesta de invocación a menos que especifique explícitamente que ninguna respuestaes necesaria.

Puede crear una aplicación de dispositivo BlackBerry para reproducir multimedia que utilice la interfaz Player yjavax.microedition.media package. La interfaz Player ha sido implementada por RIM. Proporciona los métodosnecesarios para administrar los distintos estados de una aplicación de dispositivo BlackBerry que reproduce multimedia y controlala reproducción de archivos multimedia.

Un objeto Player se construye en primer lugar en un estado UNREALIZED. Mientras se encuentra en este estado el objeto esincapaz de hacer cualquier cosa por falta de información y recursos.

Al invocar realize() desplazará el objeto Player al estado REALIZED. Esto activa al objeto Player para ubicar información yobtener así los recursos básicos para reproducir un archivo multimedia.

Al invocar prefetch() desplazará el objeto Player al estado PREFETCHED. En este estado el objeto Player obtiene los recursosnecesarios y, a continuación, "captura" algunos de los archivos multimedia para iniciar inmediatamente la reproducción tanpronto como Player se haya iniciado.

Al invocar start(), Player se desplazará a un estado de inicio STARTED en el que iniciará inmediatamente la reproducciónmultimedia.

Es posible invocar start() sin invocar realize() y prefetch(). El método start() invocará prefetch(0), que asu vez invocará realize() antes de poder iniciar la reproducción multimedia. La sencillez de uso de start() según estepatrón podría compensarse a través del incremento de demoras en el inicio de la reproducción multimedia.

Para obtener más información acerca de los tipos de archivos multimedia con los que es compatible un dispositivo BlackBerry,lea el artículo KB05482 de la base de conocimientos www.blackberry.com/btsc

Guía de desarrollo Trabajo con archivos multimedia en una aplicación de dispositivo BlackBerry

5

Page 8: Blackberry Java Application 5

Crear una aplicación de dispositivo BlackBerry que reproduzca archivos multimedia1. Importe las clases necesarias.

import javax.microedition.media.Manager;import javax.microedition.media.Player;import java.io.IOException;

2. Recupere un objeto Player de la clase Manager invocando el método createPlayer().

3. Invoque Player.realize() con el fin de preparar la aplicación de dispositivo BlackBerry® para obtener los recursosnecesarios.

4. Invoque Player.prefetch() para permitir a la aplicación de dispositivo BlackBerry llevar a cabo acciones que debentener lugar antes de que el dispositivo BlackBerry pueda reproducir multimedia.

5. Invoque Player.start() para iniciar la reproducción multimedia.

Player p = Manager.createPlayer("http://www.test.rim.net/abc.wav");/* * Best practice is to invoke realize(), then prefetch(), then start(). * Following this sequence reduces delays in starting media playback. * * Invoking start() as shown below will cause start() to invoke prefetch(0), * which invokes realize() before media playback is started. */ p.start();

6. Invoque Player.stop() para detener la reproducción multimedia.

7. Invoque Player.close() para colocar el objeto Player en un estado CLOSED.

Código de ejemplo: reproducción de archivos multimedia desde un URI

private void initVideo(String url) { try { _player = javax.microedition.media.Manager.createPlayer(url); _player.realize(); _vc = (VideoControl) _player.getControl("VideoControl"); if (_vc != null) { _videoField = (Field) _vc.initDisplayMode( VideoControl.USE_GUI_PRIMITIVE, "net.rim.device.api.ui.Field"); _vc.setVisible(true); } } catch(MediaException pe) { System.out.println(pe.toString()); } catch (IOException ioe) {

Guía de desarrollo Crear una aplicación de dispositivo BlackBerry que reproduzca multimedia

6

Page 9: Blackberry Java Application 5

System.out.println(ioe.toString()); }}

Código de ejemplo: reproducir una secuencia de tonosToneControl se utiliza para reproducir una secuencia de notas definida por el usuario con una duración y ritmo específicosen un dispositivo BlackBerry®.

// "Mary Had A Little Lamb" has "ABAC" structure// Use block to repeat "A" section// Tempos ranging from 20 to 508 beats per minute are divided by 4// to create a tempo modifier range of 5 to 127.byte tempo_mod = 30; // 120 bpm// Note duration ranges from 128 (1/2 note) to 0 (128th of a note)// with a default resolution of 64.byte duration = 8; // Note length 8 (quaver) = 1/8th of a note duration// Notes are determined from ToneControl.C4 (Middle C),// which has a value of 60 and a frequency of 261.6 Hz.byte C4 = ToneControl.C4; // C note value = 60 (middle C)byte D4 = (byte)(C4 + 2); // D note value = 62 (a whole step)byte E4 = (byte)(C4 + 4); // E note value = 64 (a major third)byte G4 = (byte)(C4 + 7); // G note value = 67 (a fifth)byte rest = ToneControl.SILENCE; // rest byte[] mySequence = { ToneControl.VERSION, 1, // version 1 ToneControl.TEMPO, tempo_mod, // // Start define "A" section ToneControl.BLOCK_START, 0, // // Content of "A" section E4, duration, D4, duration, C4, duration, E4, duration, E4, duration, E4, duration, E4, duration, rest, duration, // // End define "A" section ToneControl.BLOCK_END, 0, // end of block number 0 // // Play "A" section ToneControl.PLAY_BLOCK, 0, // // Play "B" section D4, duration, D4, duration, D4, duration, rest, duration, E4, duration, G4, duration, G4, duration, rest, duration, // // Repeat "A" section ToneControl.PLAY_BLOCK, 0, // // Play "C" section D4, duration, D4, duration, E4, duration, D4, duration, C4, duration

Guía de desarrollo Crear una aplicación de dispositivo BlackBerry que reproduzca multimedia

7

Page 10: Blackberry Java Application 5

};try{ Player p = Manager.createPlayer(Manager.TONE_DEVICE_LOCATOR); p.realize(); ToneControl c = (ToneControl)p.getControl("ToneControl"); c.setSequence(mySequence); p.start(); } catch (IOException ioe) { } } catch (MediaException me) { }

Crear una aplicación de dispositivo BlackBerry que reproduzca multimedia desde un flujo deentrada1. Importe las clases necesarias.

import java.lang.Class;import javax.microedition.media.Player;import javax.microedition.media.Manager;import javax.microedition.rms.RecordStore;import java.io.InputStream;import java.io.ByteArrayInputStream;import net.rim.device.api.media.protocol.ByteArrayInputStreamDataSource;

2. Cree un objeto ByteArrayInputStream. En este ejemplo, se invoca getResourceAsStream(String) pararecuperar el archivo multimedia del archivo de recursos en una ubicación absoluta.

ByteArrayInputStream stream = (ByteArrayInputStream)this.getClass().getResourceAsStream("/abc.mp3");

3. Cree un SourceStream con capacidad de búsqueda creando previamente unByteArrayInputStreamDataSource y pasando el objeto ByteArrayInputStream.

ByteArrayInputStreamDataSource source = new ByteArrayInputStreamDataSource(stream, "audio/mpeg");

4. Recupere un objeto Player invocando Manager.createPlayer() y, a continuación start() para iniciar lareproducción multimedia.

Player p = Manager.createPlayer(source);p.start();

5. También puede utilizar un método que no tenga capacidad de búsqueda para reproducir multimedia desde unInputStream tal como se muestra en el siguiente código de ejemplo.

InputStream stream = (InputStream)this.getClass().getResourceAsStream("/abc.mp3");Player p = Manager.createPlayer(stream, "audio/mpeg");p.start();

Guía de desarrollo Crear una aplicación de dispositivo BlackBerry que reproduzca multimedia

8

Page 11: Blackberry Java Application 5

Crear una aplicación de dispositivo BlackBerry que reproduzca contenido multimediaLos dispositivos BlackBerry® con BlackBerry® Device Software versión 4.3.0 o posterior compatibles con EVDO serán compatiblescon la funcionalidad RTSP

1. Importe las clases necesarias.

import javax.microedition.media.Manager;import javax.microedition.media.Player;

2. Invoque Manager.createPlayer(String) para reproducir contenido multimedia pasando un parámetro querepresente un localizador RTSP.

Player p = Manager.createPlayer("rtsp://streaming.rim com/streaming_video.3gp");

Crear una aplicación de dispositivo BlackBerry que reproduzca un vídeo en un campo de lainterfaz de usuario1. Importe las clases y las interfaces necesarias.

import net.rim.device.api.ui.Field;import javax.microedition.media.Manager;import javax.microedition.media.Player;import javax.microedition.media.control.VideoControl;

2. Cree la variables Player, VideoControl y Field.

Player videoPlayer;VideoControl videoControl;Field videoField;

3. Invoque Manager.createPlayer(String) pasando un parámetro considerado como URI que describa el contenidodel vídeo. Almacene una referencia al objeto Player que devuelva la llamada a createPlayer(String).

videoPlayer = Manager createPlayer("file:///SDCard/BlackBerry/videos/soccer1.avi");

4. Invoque Player.realize() con el fin de permitir a Player obtener la información necesaria para obtener recursosmultimedia.

videoPlayer.realize();

5. Invoque Player.getControl() pasando un parámetro que represente la variable Control que desea recuperar.Asigne el objeto devuelto como un objeto VideoControl.

videoControl = (VideoControl)_videoPlayer.getControl( "javax.microedition.media.control.VideoControl");

Guía de desarrollo Crear una aplicación de dispositivo BlackBerry que reproduzca multimedia

9

Page 12: Blackberry Java Application 5

6. Invoque VideoControl.initDisplayMode(int mode, Object arg) pasando un parámetro arg y especificandola primitiva de interfaz de usuario que muestra el vídeo para inicializar el modo en el que el objeto videoField muestra elvídeo. Asigne el objeto devuelto como un objeto Field.

videoField = (Field)_videoControl.initDisplayMode( VideoControl.USE_GUI_PRIMITIVE, "net.rim.device.api.ui.Field" );

Tenga en cuenta que initDisplayMode() se puede invocar de diversas maneras para devolver un objeto Field, comose ha mostrado anteriormente, devolver un objeto Item para su uso con MIDlets o bien para mostrar un vídeo en unCanvas.

Crear una aplicación de dispositivo BlackBerry que tome una fotografía utilizando la cámara1. Importe las clases y las interfaces necesarias.

import net.rim.device.api.ui.Field;import javax.microedition.media.Manager;import javax.microedition.media.Player;import javax.microedition.media.control.VideoControl;

2. Invoque Manager.createPlayer(String) pasando un parámetro considerado como URI que describe el contenidode la imagen.

Player cameraPlayer = Manager.createPlayer( "capture://video?encoding=jpeg" );

3. Invoque Player.realize() con el fin de permitir a Player obtener la información necesaria para obtener recursosmultimedia.

cameraPlayer.realize();

4. Invoque Player.getControl() pasando un parámetro que representa la clase VideoControl. Asigne el objetodevuelto como un objeto VideoControl.

VideoControl videoControl = (VideoControl)cameraPlayer.getControl( "javax.microedition.media.control.VideoControl");

5. Invoque VideoControl.initDisplayMode(int mode, Object arg) para inicializar el modo que utilizavideoField para mostrar el vídeo.

6. Invoque VideoControl.getSnapshot() para rellenar una matriz de bytes con los datos JPEG para la fotografíatomada con la cámara.

int[] imageByte = videoControl.getSnapshot(null);

El pasar null a getSnapshot () tiene como resultado la captura de una fotografía que utiliza la configuraciónpredeterminada de la cámara.

Puede ajustar el parámetro para getSnapshot() invocando System.getProperty() para determinar quéconfiguración está disponible para su uso.

Guía de desarrollo Crear una aplicación de dispositivo BlackBerry que reproduzca multimedia

10

Page 13: Blackberry Java Application 5

String encodingString = System.getProperty("video.snapshot.encodings");

Invoque stringToKeywords() para dividir las propiedades en elementos de matriz de String separados.

String[] properties = StringUtilities.stringToKeywords(encodingString);

Hay cuatro propiedades devueltas por System.getProperty() a las que se puede acceder individualmente en la matrizde String devuelta desde stringToKeywords(). Las propiedades son "encoding", "width", "height" y "quality".

Crear una aplicación de dispositivo BlackBerry que envíe audio a un dispositivo con Bluetooth1. Importe las clases necesarias.

import javax.microedition.media.Control;import javax.microedition.media.Manager;import javax.microedition.media.Player;import net.rim.device.api.media.control.AudioPathControl;

2. Invoque Manager.createPlayer(String) pasando la ubicación de un archivo de audio.

Player p = javax.microedition.media.Manager createPlayer("http://mycompany/test.mp3");

3. Invoque Player.realize() para permitir al objeto Player obtener recursos multimedia.

p.realize();

4. Invoque Player.prefetch().

p.prefetch();

5. Invoque Player.getControls() para obtener el AudioPathControl compatible.

AudioPathControl apc = (AudioPathControl)p.getControl( "net.rim.device.api.media.control.AudioPathControl" );

6. Lleve a cabo una de las siguientes tareas:

Tarea Pasos

Envíe el audio a un dispositivo con

Bluetooth® que sea compatible con las

llamadas de voz.

Invoque AudioPathControl.setAudioPath(int) utilizando como

parámetro el atributo AudioPathControl.AUDIO_PATH_BLUETOOTH

para enviar audio al dispositivo Bluetooth.

apc.setAudioPath(AudioPathControl.AUDIO_PATH_BLUETOOTH);

Guía de desarrollo Crear una aplicación de dispositivo BlackBerry que reproduzca multimedia

11

Page 14: Blackberry Java Application 5

Tarea Pasos

Envíe el audio a un dispositivo

Bluetooth que sea compatible con un

dispositivo con Bluetooth, por ejemplo,

unos auriculares estéreo Bluetooth.

Invoque AudioPathControl.setAudioPath(int) utilizando como

parámetro el atributo AudioPathControl.AUDIO_ BLUETOOTH_A2DP

para enviar audio al dispositivo Bluetooth.

apc.setAudioPath(AudioPathControl.AUDIO_ BLUETOOTH_A2DP);

Crear una aplicación Gestor de contenido que reproduzca multimediaEste artículo describe el desarrollo de una aplicación Gestor de contenido que utiliza JSR 211 para permitir a las aplicacionesinvocar otras aplicaciones, incluidas las aplicaciones nativas del dispositivo BlackBerry®, para gestionar tipos de contenidoespecíficos. Al registrar el gestor de contenido para gestionar tipos de contenido de vídeo o imágenes con la acción SEND, porejemplo, aparecerá un elemento de menú siempre que vea un vídeo o imagen en la pantalla de vista previa de la cámara, en elexplorador de archivos, etc. Al hacer clic en este menú, el elemento de menú invocará el gestor de contenido con una acciónSEND y un vínculo al vídeo o imagen.

1. Importe las clases necesarias.

import javax.microedition.content.ContentHandlerServer;import javax.microedition.content.RequestListener;import javax.microedition.content.Registry;import javax.microedition.content.Invocation;import javax.microedition.content.ActionNameMap;

2. Cree una clase que extienda UiApplication e implemente RequestListener.

public final class SendMediaDemo extends UiApplication implements RequestListener {

3. Gestione el inicio de la aplicación.

public static void main(String[] args) throws Exception{ if(args != null && args.length > 0) { if (args[0].equals("startup")) { // Register ourselves as a content handler on startup register(); } } else { // Create a new instance of the application and make the currently // running thread the application's event dispatching thread. SendMediaDemo app = new SendMediaDemo(); app.enterEventDispatcher(); } }

4. Registre la aplicación como un RequestListener.

Guía de desarrollo Crear una aplicación de dispositivo BlackBerry que reproduzca multimedia

12

Page 15: Blackberry Java Application 5

public SendMediaDemo() throws ContentHandlerException { // Get access to the ContentHandlerServer for this application and // register as a listener. ContentHandlerServer contentHandlerServer = Registry.getServer(CLASSNAME); contentHandlerServer.setListener(this); }

5. Cree un método para gestionar el registro del gestor de contenido. Este método utilizará Registry.register() paragarantizar que esta aplicación pueda ser iniciada con opciones de menú externas para enviar vídeo e imágenes a estaaplicación.

private static void register() throws ContentHandlerException { String[] types = {"image/bmp", "image/png", "image/jpeg", "video/3gpp", "video/mp4"}; String[] suffixes = {".bmp", ".png", ".jpg", ".3GP", ".mp4"}; String[] actions = {ContentHandler.ACTION_SEND}; String[] actionNames = {"Send to demo app"}; ActionNameMap[] actionNameMaps = {new ActionNameMap(actions,actionNames,"en")}; // Get access to the registry Registry registry = Registry.getRegistry(CLASSNAME); // Register as a content handler registry.register(CLASSNAME, types, suffixes, actions, actionNameMaps, ID, null); }

6. Implemente RequestListener.invocationRequestNotify(). Este gestor se invocará cuando otra aplicaciónpasa el contenido a esta aplicación.

public void invocationRequestNotify(ContentHandlerServer server) { Invocation invoc = server.getRequest(false); if(invoc != null) { String type = invoc.getType(); if(type.equals("image/bmp") || type.equals("image/png") || type.equals("image/jpeg")) { byte[] data = getData(invoc.getURL()); displayImage(data); } else if(type.equals("video/3gpp") || type.equals("video/mp4")) { initVideo(invoc.getURL()); if(_videoField != null) { displayVideo(); } } else { System.exit(0); } server.finish(invoc, Invocation.OK); }}

Guía de desarrollo Crear una aplicación de dispositivo BlackBerry que reproduzca multimedia

13

Page 16: Blackberry Java Application 5

Código de ejemplo: crear una aplicación Gestor de contenido que reproduzca multimedia

package com.rim.samples.device.sendmediademo;import java.io.*;import javax.microedition.content.*;import javax.microedition.io.*;import javax.microedition.media.*; import javax.microedition.media.control.*;import javax.microedition.io.file.*;import net.rim.device.api.system.*;import net.rim.device.api.ui.*;import net.rim.device.api.ui.component.*;import net.rim.device.api.ui.container.*;public final class SendMediaDemo extends UiApplication implements RequestListener{ private static final String ID = "com.rim.samples.device.sendmediademo"; private static final String CLASSNAME = "com.rim.samples.device.sendmediademo.SendMediaDemo"; private Player _player; private Field _videoField; private VideoControl _vc; /** * Entry point for application * @param args Command line arguments */ public static void main(String[] args) { if(args != null && args.length > 0) { if (args[0].equals("startup")) { // Register ourselves as a content handler on startup register(); } } else { // Create a new instance of the application and make the currently // running thread the application's event dispatching thread. SendMediaDemo app = new SendMediaDemo(); app.enterEventDispatcher(); } } /** * Registers this application as a content handler for image files */ private static void register() { String[] types = {"image/bmp", "image/png", "image/jpeg", "video/3gpp", "video/mp4"};

Guía de desarrollo Crear una aplicación de dispositivo BlackBerry que reproduzca multimedia

14

Page 17: Blackberry Java Application 5

String[] suffixes = {".bmp", ".png", ".jpg", ".3GP", ".mp4"}; String[] actions = {ContentHandler.ACTION_SEND}; String[] actionNames = {"Send to demo app"}; ActionNameMap[] actionNameMaps = {new ActionNameMap(actions,actionNames,"en")}; // Get access to the registry Registry registry = Registry.getRegistry(CLASSNAME); try { // Register as a content handler registry.register(CLASSNAME, types, suffixes, actions, actionNameMaps, ID, null); } catch (ContentHandlerException che) { System.out.print(che.toString()); } catch (ClassNotFoundException cnfe) { System.out.print(cnfe.toString()); } } // Constructor public SendMediaDemo() { try { // Get access to the ContentHandlerServer for this application and // register as a listener. ContentHandlerServer contentHandlerServer = Registry.getServer(CLASSNAME); contentHandlerServer.setListener(this); } catch(ContentHandlerException che) { System.out.println(che.toString()); } } /** * RequestListener implementation * @param server The content handler server from which to request Invocation objects */ public void invocationRequestNotify(ContentHandlerServer server) { Invocation invoc = server.getRequest(false); if(invoc != null) { String type = invoc.getType(); if(type.equals("image/bmp") || type.equals("image/png") || type.equals("image/jpeg")) {

Guía de desarrollo Crear una aplicación de dispositivo BlackBerry que reproduzca multimedia

15

Page 18: Blackberry Java Application 5

byte[] data = getData(invoc.getURL()); displayImage(data); } else if(type.equals("video/3gpp") || type.equals("video/mp4")) { initVideo(invoc.getURL()); if(_videoField != null) { displayVideo(); } } else { System.exit(0); } server.finish(invoc, Invocation.OK); } } /** * Sets the size of the video * @param width Width of the video display * @param height Height of the video display */ private void setVideoSize(int width, int height) { try { if (_vc != null) { _vc.setDisplaySize(width, height); } } catch(MediaException pe) { System.out.println(pe.toString()); } } /** * Creates and initializes a video player * @param url The URL of the video file to play */ private void initVideo(String url) { try { _player = javax.microedition.media.Manager.createPlayer(url); _player.realize(); _vc = (VideoControl) _player.getControl("VideoControl"); if (_vc != null) { _videoField = (Field) _vc.initDisplayMode (VideoControl.USE_GUI_PRIMITIVE, "net.rim.device.api.ui.Field");

Guía de desarrollo Crear una aplicación de dispositivo BlackBerry que reproduzca multimedia

16

Page 19: Blackberry Java Application 5

_vc.setVisible(true); } } catch(MediaException pe) { System.out.println(pe.toString()); } catch (IOException ioe) { System.out.println(ioe.toString()); } } /** * Returns a byte array containing data representing the image at the specified URL * @param url The location of the image to display * @return The image data */ private byte[] getData(String url) { byte[] data = new byte[0]; try { FileConnection file = (FileConnection)Connector.open(url); int fileSize = (int)file.fileSize(); data = new byte[fileSize]; InputStream inputStream = file.openInputStream(); inputStream.read(data); } catch(Exception e) { System.out.println(e.toString()); } return data; } /** * Creates a screen and displays the image * @param data The data representing the image to be rendered */ private void displayImage(byte [] data) { // Create image field Bitmap image = Bitmap.createBitmapFromBytes( data, 0, -1, 5); BitmapField imageField = new BitmapField( image, Field.FIELD_HCENTER); // Create and display screen MainScreen screen = new MainScreen(net.rim.device.api.ui.Manager.NO_VERTICAL_SCROLL); screen.setTitle("Send Media Demo"); screen.add(imageField); pushScreen(screen); }

Guía de desarrollo Crear una aplicación de dispositivo BlackBerry que reproduzca multimedia

17

Page 20: Blackberry Java Application 5

/** * Creates a video screen and starts the video player */ private void displayVideo() { // Create and display screen VideoMainScreen screen = new VideoMainScreen(); screen.setTitle("Send Media Demo"); screen.add(_videoField); pushScreen(screen); try { // Start media player _player.start(); } catch(MediaException pe) { System.out.println(pe.toString()); } } /** * A main screen in which to play video files */ final private class VideoMainScreen extends MainScreen { // Constructor VideoMainScreen() { super(net.rim.device.api.ui.Manager.NO_VERTICAL_SCROLL); } /** * @see net.rim.device.api.ui.Manager#sublayout(int,int) */ protected void sublayout(int width, int height) { setVideoSize(Display.getWidth(), Display.getHeight()); super.sublayout(width, height); } /** * @see net.rim.device.api.ui.Screen#onClose() */ public boolean onClose() { _player.close(); return super.onClose(); } }}

Guía de desarrollo

18

Page 21: Blackberry Java Application 5

Especificación de las características de una aplicación de dispositivoBlackBerry que reproduce multimedia

Consultar las características de reproducción multimedia con las que es compatible unaaplicación de dispositivo BlackBerry

La aplicación del dispositivo BlackBerry® puede consultar una variedad de características de reproducción que incluyen el modode visualización de vídeo, la ubicación del vídeo con respecto al fondo de visualización, las coordenadas x e y del vídeo conrespecto al objeto UI de visualización de vídeo y los niveles de audio.

Especificar los parámetros de reproducción de vídeo dentro de una aplicación de dispositivoBlackBerry1. Importe las clases necesarias.

import javax.microedition.media.Manager;import javax.microedition.media.Player;import javax.microedition.media.control.VideoControl;

2. Inicialice y prepare una instancia de un objeto Player.

Player player = Manager.createPlayer("file:///SDCard/BlackBerry/videos/myvid.mp4"); player.realize();

3. Obtenga el control de vídeo.

VideoControl videoControl = (VideoControl) player.getControl("VideoControl"); videoControl.initDisplayMode(VideoControl.USE_DIRECT_VIDEO, this);

4. Para incrustar el control de vídeo en el fondo especifique las propiedades del control de vídeo.

videoControl.setDisplayLocation(20, 30); videoControl.setDisplaySize(160, 90); videoControl.setVisible(true);

5. La interfaz VideoControl se implementa para proporcionar a la aplicación de dispositivo BlackBerry® una variedad decaracterísticas compatibles con la reproducción de vídeo. Lleve a cabo una de las siguientes acciones:• Controle el modo de visualización de vídeo mediante el uso de USE_GUI_PRIMITIVE o USE_DIRECT_VIDEO.• Controle la ubicación del vídeo con respecto al fondo que muestra el vídeo.• Acceda a las coordenadas x e y del vídeo con respecto al objeto UI que muestra el vídeo o lo oculta.

Guía de desarrollo Especificación de las características de una aplicación de dispositivo BlackBerry que reproduce multimedia

19

Page 22: Blackberry Java Application 5

Especificar el volumen que una aplicación de dispositivo BlackBerry utiliza para reproducirarchivos multimedia1. Importe las clases necesarias.

import net.rim.device.api.ui.Screen;import javax.microedition.lcdui.Canvas;import javax.microedition.media.control.VolumeControl;

2. Especifique el volumen de la aplicación multimedia.

VolumeControl volume = (VolumeControl) player.getControl("VolumeControl"); volume.setLevel(80);

3. Lleve a cabo una de las siguientes tareas:

Tarea Pasos

Capturar eventos de teclas de

volumen en una aplicación

MIDP.

a. Cree una clase que extienda la clase Canvas.

b. Omita el método Canvas.keyPressed().

Capturar eventos de teclas de

volumen en una aplicación de

dispositivo BlackBerry®.

a. Cree una clase que extienda la clase Screen.

b. Omita Screen.keyControl().

Implementar KeyListener

para capturar y gestionar

eventos de teclas en una

aplicación de dispositivo

BlackBerry®.

Cree una clase que implemente KeyListener, así como keyChar(),

keyStatus(), keyDown(), keyRepeat() y keyUp(). Utilice keyDown

() para procesar las pulsaciones de la teclas de volumen en los dispositivos

BlackBerry con teclas multimedia.

Respuesta a la entrada del usuario

Recibir una notificación cuando un usuario pulsa una tecla multimedia en un dispositivoBlackBerryUna aplicación del dispositivo BlackBerry® puede suscribirse a los eventos de teclas gracias a la interfaz KeyListener.KeyListener recibe todos los eventos de claves mientras la aplicación se encuentra en primer término y recibe teclas globalesno gestionadas mientras la aplicación se encuentra en segundo plano.

Guía de desarrollo Respuesta a la entrada del usuario

20

Page 23: Blackberry Java Application 5

Las teclas multimedia incluyen subir volumen, bajar volumen, adelante, atrás y una tecla combinada que se encarga de silenciar,la reproducción y la pausa. Algunos dispositivos BlackBerry tienen teclas multimedia dedicadas adicionales, por ejemplo,Keypad.KEY_FORWARD y Keypad.KEY_BACKWARD. La presencia de estas teclas multimedia se puede detectar medianteKeypad.hasMediaKeys(). Algunos dispositivos BlackBerry también tienen una tecla "Silencio" mientras que otros tienenuna tecla "Altavoz". Ambas de estas teclas se asignan la misma constante de tecla, Keypad.KEY_SPEAKERPHONE. Paradeterminar si al pulsar la tecla de KEY_SPEAKERPHONE se activará la tecla "Silencio" o la tecla "Altavoz" deberá utilizarKeypad.hasMuteKey().

1. Importe las clases e interfaces necesarias.

import net.rim.device.api.ui.Keypad;import net.rim.device.api.ui.container.MainScreen;

2. Cree una clase que extienda MainScreen, implemente KeyListener y registre el oyente con addKeyListener().

class KeyListenerDemo extends MainScreen implements KeyListener { public KeyListenerDemo() { addKeyListener(this); } }

Responder cuando un usuario de dispositivo BlackBerry pulsa una tecla de volumen1. Importe las clases necesarias.

import net.rim.device.api.ui.Screen;import net.rim.device.api.system.Characters;

2. Cree una clase que extienda la clase Screen.

3. Omita Screen.keyControl().

protected boolean keyControl(char c, int status, int time) {

4. Identifique la tecla de volumen que ha cambiado el usuario del dispositivo BlackBerry.

if (c == Characters.CONTROL_VOLUME_UP) {} else if (c == Characters.CONTROL_VOLUME_DOWN) {}

Nota: En la clase net.rim.device.api.media.MediaKeyListener, los métodos keyDown(), keyRepeat() y keyUp() se invocancon Keypad.KEY_VOLUME_UP y Keypad.KEY_VOLUME_DOWN, que demuestran un control granular más fino encomparación con el uso de keyChar().

Responder cuando cambie el estado de un objeto Player1. Importe las clases necesarias.

Guía de desarrollo Respuesta a la entrada del usuario

21

Page 24: Blackberry Java Application 5

import javax.microedition.media.Player;import javax.microedition.media.PlayerListener;import javax.microedition.media.MediaException;import java.io.IOException;

2. Invoque addPlayerListener() para escuchar los cambios en el estado del objeto Player.

private void doPlay() throws IOException, MediaException { Player p = Manager.createPlayer("file:///SDCard/BlackBerry/music/theo.mp3"); p.addPlayerListener(this); p.realize(); p.prefetch(); p.start(); }

3. Omita playerUpdate() para enviar un evento multimedia al PlayerListener registrado.

public void playerUpdate(Player player, final String event, Object eventData) { if (event.equals(VOLUME_CHANGED)) { } else if (event.equals(STARTED )) { } else if (event.equals(STOPPED)) { } else if (event.equals(DURATION_UPDATED)) { } else if (event.equals(END_OF_MEDIA)) { //Add code for actions if the end of media is reached. //Release resources when end of media event is received player.close(); }}

Reproducción de archivos multimedia en una aplicación de dispositivoBlackBerryPara transferir los datos desde un origen remoto a una aplicación de dispositivo BlackBerry®, debe almacenar en el búfer elorigen y controlar cómo la aplicación multimedia lee los datos. Extienda DataSource y cree una implementación personalizadade SourceStream para enviar los datos a la aplicación multimedia.

Archivo de reproducción de vídeo RIMM

El formato de vídeo propio de RIM (archivo de reproducción RIMM) consta de un encabezado, una lista de marcos y un pie depágina.

El archivo también cuenta con un descriptor que almacena metadatos adicionales. La ubicación de este descriptor depende deldestino de la grabación. Si el destino de la grabación es un archivo, el descriptor se ubica al final del encabezado, antes de lalista de marcos. Si el destino de la grabación es un flujo, el descriptor se ubica después de la lista de marcos en el pie de página.

Guía de desarrollo Reproducción de archivos multimedia en una aplicación de dispositivo BlackBerry

22

Page 25: Blackberry Java Application 5

Formato de vídeo propio de RIM (archivo de reproducción RIMM)El formato de vídeo propio de RIM consta de un encabezado, una lista de marcos y un pie de página. Al analizar este archivo,debe traducir los valores del tipo int o short de little-endian a big-endian.

Encabezado

Campo Valor Tamaño

Etiqueta de ID RIMM 4 B

versión 0 3 B

ubicación del

descriptor• 0 si se graba en un archivo

• 1 si graba en un flujo

1 B

descriptor valores del descriptor • 79 B si se graba en un archivo

• 0 B si se graba en un flujo

Marcos

Campo Valor Tamaño

tipo de flujo • 0 si se trata de un marco de audio

• 1 si se trata de un marco de vídeo

1 B

fotograma clave • 1 si se trata de un fotograma clave

• 0 de lo contrario

1 b

marco de

configuración• 1 si se trata de un marco de configuración

• 0 de lo contrario

1 b

tamaño tamaño de marco en bytes 30 b

duración duración del vídeo, en milisegundos 2 B

datos los datos reales del marco <tamaño> B

tipo de flujo • 0 si se trata de un marco de audio

• 1 si se trata de un marco de vídeo

1 B

fotograma clave • 1 si se trata de un fotograma clave

• 0 de lo contrario

1 b

marco de

configuración• 1 si se trata de un marco de configuración

• 0 de lo contrario

1 b

Guía de desarrollo Reproducción de archivos multimedia en una aplicación de dispositivo BlackBerry

23

Page 26: Blackberry Java Application 5

Campo Valor Tamaño

tamaño tamaño de marco en bytes 30 b

duración duración del vídeo, en milisegundos 2 B

Nota: Los campos para el fotograma clave, el marco de configuración y el tamaño se almacenan en un int de 32 bits con loscampos de fotograma clave y de marco de configuración almacenados en los dos primeros bits.

Pie de página

Campo Valor Tamaño

Descriptor valores del descriptor • 79 bytes si graba en un flujo

• 0 bytes si graba en un archivo

Descriptor

Campo Valor Tamaño

marcos de audio número de marcos de audio 4 B

marcos de vídeo número de marcos video 4 B

fotogramas clave de

audio

número de fotogramas clave de audio 4 B

fotogramas clave de

vídeo

número de fotogramas clave de vídeo 4 B

fotogramas de audio

por segundo

número de fotogramas de audio por segundo (el

número de fotogramas por segundo cambia + 1)

4 B

fotogramas de vídeo

por segundo

número de fotogramas de vídeo por segundo (el

número de fotogramas por segundo cambia + 1)

4 B

tamaño de audio tamaño del flujo de audio en bytes 4 B

tamaño de vídeo tamaño del flujo de vídeo en bytes 4 B

fotogramas de vídeo

por segundo

la velocidad inicial de reproducción de vídeo, en

fotogramas por segundo

4 B

tamaño máximo de

marco de vídeo

tamaño del marco de vídeo de mayor tamaño,

en bytes

4 B

duración del audio duración del flujo de audio, en milisegundos 4 B

duración del video duración del flujo de vídeo, en milisegundos 4 B

RESERVADO indefinido 20 B

Guía de desarrollo Reproducción de archivos multimedia en una aplicación de dispositivo BlackBerry

24

Page 27: Blackberry Java Application 5

Campo Valor Tamaño

ancho ancho de vídeo, en píxeles 2 B

altura altura de vídeo, en píxeles 2 B

códec de vídeo • 2 si el códec de vídeo es mpeg4

• 5 si el códec de vídeo es H.263

• 6 si el códec de vídeo es H.264

2 B

códec de audio • 0 si el códec de audio es PCM

• 7 si el códec de audio es AMR

• 0xA si el códec de audio es AAC

1 B

Búfer y reproducción de contenido multimediaPuede utilizar la API multimedia para crear una clase personalizada que extiendajavax.microedition.media.protocol.DataSource para personalizar cómo se leen los datos desde su aplicaciónen el reproductor multimedia del dispositivo BlackBerry®. DataSource proporciona una implementación deSourceStream que utiliza SourceStream.read() para transferir datos.

1. Importe las clases y las interfaces necesarias.

import java.lang.Thread;import java.io.InputStream;import java.io.OutputStream;import javax.microedition.media.protocol.DataSource;import javax.microedition.media.protocol.SourceStream;import javax.microedition.io.ContentConnection;import javax.microedition.io.file.FileConnection;import net.rim.device.api.io.SharedInputStream;

2. Cree una clase personalizada que extienda la clase abstractajavax.microedition.media.protocol.DataSource.

public final class LimitedRateStreamingSource extends DataSource {

3. Declare los campos de instancia que necesitará para su implementación de DataSource. Los campos siguientes se hantomado del proyecto de ejemplo bufferedplaybackdemo.

/** The stream connection over which media content is passed */private ContentConnection _contentConnection;/** An input stream shared between several readers */private SharedInputStream _readAhead;/** A stream to the buffered resource */private LimitedRateSourceStream _feedToPlayer;/** The MIME type of the remote media file */private String _forcedContentType;

Guía de desarrollo Reproducción de archivos multimedia en una aplicación de dispositivo BlackBerry

25

Page 28: Blackberry Java Application 5

/** The thread which retrieves the remote media file */private ConnectionThread _loaderThread;/** The local save file into which the remote file is written */private FileConnection _saveFile;/** A stream for the local save file */private OutputStream _saveStream;

4. Cree a un constructor para su clase personalizada.

LimitedRateStreamingSource(String locator) { super(locator);}

5. Implemente javax.microedition.media.protocol.DataSource.connect(). Este método se utiliza paraabrir una conexión con el origen descrito por el localizador e inicia la comunicación. Consulte el proyecto de ejemplobufferedplaybackdemo para obtener más información.

public void connect() throws IOException {

6. Implemente javax.microedition.media.protocol.DataSource.disconnect(). Este método se utilizapara cerrar la conexión con el origen descrito por el localizador y libera recursos utilizados para mantener la conexión.Consulte el proyecto de ejemplo bufferedplaybackdemo para obtener más información.

public void disconnect() {

7. Implemente javax.microedition.media.protocol.DataSource.getContentType(). Este método seutiliza para recuperar un String que describe el tipo de contenido de los archivos multimedia que proporciona el origen.Consulte el proyecto de ejemplo bufferedplaybackdemo para obtener más información.

public String getContentType() { return _feedToPlayer.getContentDescriptor().getContentType();}

8. Implemente javax.microedition.media.protocol.DataSource.getStreams(). Este método se utilizapara recuperar una recopilación de los flujos que gestiona este origen. Consulte el proyecto de ejemplobufferedplaybackdemo para obtener más información.

public SourceStream[] getStreams() { return new SourceStream[] { _feedToPlayer };}

9. Implemente javax.microedition.media.protocol.DataSource.start(). Este método se utiliza parainiciar la transferencia de datos y debe llamarse antes de que los datos estén disponibles para la lectura. Consulte el proyectode ejemplo bufferedplaybackdemo para obtener más información.

public void start() throws IOException { if (_saveStream != null) { _loaderThread = new ConnectionThread(); _loaderThread.start(); }}

Guía de desarrollo Reproducción de archivos multimedia en una aplicación de dispositivo BlackBerry

26

Page 29: Blackberry Java Application 5

10. Implemente javax.microedition.media.protocol.DataSource.stop(). Este método se utiliza paradetener la transferencia de datos. Consulte el proyecto de ejemplo bufferedplaybackdemo para obtener más información.

public void stop() throws IOException { // Set the boolean flag to stop the thread _stop = true;}

11. Cree una clase que implemente javax.microedition.media.protocol.SourceStream. En este ejemplo, unaclase interna se utiliza para proporcionar un flujo al recurso multimedia en el búfer. Consulte el proyecto de ejemplobufferedplaybackdemo para obtener más información.

private final class LimitedRateSourceStream implements SourceStream {

12. Implemente getSeekType() para saber si los archivos multimedia tienen o no capacidad de búsqueda durante lareproducción.

public int getSeekType() { return SEEKABLE_TO_START;}

13. Dentro de esta clase interna, implemente javax.microedition.media.protocol.SourceStream.read().Este método se utiliza para leer los datos del flujo de entrada en una matriz de bytes. Consulte el proyecto de ejemplobufferedplaybackdemo para obtener más información.

public int read(byte[] bytes, int off, int len) throws IOException {

14. Dentro de esta clase interna, también podría implementar seek(), tell() y close(). Consulte el proyecto de ejemplobufferedplaybackdemo para obtener más información.

15. Bloquee la clase interna y cree otra clase interna que extienda java.lang.Thread. Utilice esto al crear un subprocesopara descargar el archivo remoto y escribirlo en el archivo local. Consulte el proyecto de ejemplo bufferedplaybackdemopara obtener más información.

private final class ConnectionThread extends Thread {

Código de ejemplo: reproducción de archivos multimedia en una aplicación de dispositivoBlackBerry

/** * A thread which downloads the remote file and writes it to the local file * From bufferedplaybackdemo\LimitedRateStreamingSource.java */ private final class ConnectionThread extends Thread { /** * Download the remote media file, then write it to the local file. */ public void run()

Guía de desarrollo Reproducción de archivos multimedia en una aplicación de dispositivo BlackBerry

27

Page 30: Blackberry Java Application 5

{ try { byte[] data = new byte[READ_CHUNK]; int len = 0; // Until we reach the end of the file while (-1 != (len = _readAhead.read(data))) { _totalRead += len; if (!_bufferingComplete && _totalRead > getStartBuffer()) { // We have enough of a buffer to begin playback _bufferingComplete = true; System.out.println("Initial Buffering Complete"); // updateLoadStatus("Buffering Complete"); } if (_stop) { // Stop reading return; } } System.out.println("Downloading Complete"); System.out.println("Total Read: " + _totalRead); // If the downloaded data is not the same size // as the remote file, something is wrong. if (_totalRead != _contentConnection.getLength()) { System.err.println("* Unable to Download entire file *"); } _downloadComplete = true; _readAhead.setCurrentPosition(0); // Write downloaded data to the local file while (-1 != (len = _readAhead.read(data))) { _saveStream.write(data); } } catch (Exception e) { System.err.println(e.toString()); } } }

Código de ejemplo: lectura de datos desde un búferUna vez la aplicación multimedia lee todos los datos en el búfer, la aplicación del dispositivo BlackBerry® puede bloquear lassolicitudes de lectura que realiza la aplicación multimedia hasta almacenar más datos en el búfer. Detenga las operaciones delectura para garantizar que existe la cantidad especificada de datos de audio en el búfer para su reproducción.

public int read(byte[] b, int off, int len) throws IOException { // Read from a SharedInputStream that is shared // with the same Stream that the ConnectionThread // is downloading to. Although both streams handle // the same data, each stream has a separate read location.

Guía de desarrollo Reproducción de archivos multimedia en una aplicación de dispositivo BlackBerry

28

Page 31: Blackberry Java Application 5

// The ConnectionThread works to keep its read location // as far ahead of the current playback position as possible. System.out.println("Read Request for: " + len + " bytes"); // limit bytes read to our readLimit. int readLength = len; if (readLength > getReadLimit()) { readLength = getReadLimit(); } int available; boolean restart_pause = false; for (;;) { /* * A read action is be restricted by the amount of data * available for a read operation. The application needs * to download a specific amount of data before the * application can start to playback audio. * Enough data must be available to perform a full read * operation. In this sample, the application configures * the amount of data that is required to start the playback * of audio and to perform a read operation. The application * uses the ReadLimit value to control the amount of data * the second readerreads during a read operation. * * The application uses the PauseBytes setting to determine * when the second reader has read all the data currently * provided by the first variable reader. When this occurs, * the application pauses until there is enough data in the * buffer for a read operation. * * The application uses the RestartBytes setting to define * when there is enough data in the buffer to perform a * read operation. */ available = _baseSharedStream.available(); if (downloadComplete) { // Ignore all restrictions if downloading is complete System.out.println("Complete, Reading: " + len + " - Available: " + available); return _baseSharedStream.read(b, off, len); } else if (bufferingComplete) { if (restart_pause && available > getRestartBytes()) { //Perform a read operation as there is now enough data in the buffer. System.out.println("Restarting - Available: " + available); restart_pause = false; return _baseSharedStream.read(b, off, readLength); } else if (!restart_pause && (available > getPauseBytes() || available > readLength)) { //Determine if a previous read operation was paused //and if there is enough data in the buffer to perform a read// operation. if (available < getPauseBytes()) { /*

Guía de desarrollo Reproducción de archivos multimedia en una aplicación de dispositivo BlackBerry

29

Page 32: Blackberry Java Application 5

* Perform a read operation, setting the * pause flag so that future reads will pause * until enough data for a read operation is * loaded into the buffer */ restart_pause = true; } System.out.println("Reading: " + readLength + " - Available: " + available); return _baseSharedStream.read(b, off, readLength); } else if (!restart_pause) { // The buffer does not contain enough data for // a read operation. Pause the read operation // until enough data is loaded into the buffer. restart_pause = true; } } else { // Pause the thread to allow the data to download // before performing another read operation. try { Thread.sleep(100); } catch (Exception e) { System.err.println(e.getMessage()); } } } }

Código de ejemplo: reproducción de archivos multimedia desde un archivo en el dispositivoBlackBerryEl siguiente código de ejemplo muestra cómo crear una aplicación de dispositivo BlackBerry® para descargar un archivomultimedia y reproducir los datos desde dicho archivo multimedia. Esto podría reducir la cantidad de tiempo que tarda la aplicaciónmultimedia del dispositivo BlackBerry en almacenar en el búfer y reproducir los datos multimedia.

public void connect() throws IOException { System.out.println("Loading: " + getLocator()); //Open a connection to the remote file s = (ContentConnection) Connector.open(getLocator(), Connector.READ); //Get the length of the remote file. System.out.println("Size: " + s.getLength()); //Get the name of the remote file. int filenameStart = getLocator().lastIndexOf('/'); int paramStart = getLocator().indexOf(';'); if (paramStart < 0) { paramStart = getLocator().length(); } String filename = getLocator().substring(filenameStart, paramStart); System.out.println("Filename: " + filename);

Guía de desarrollo Reproducción de archivos multimedia en una aplicación de dispositivo BlackBerry

30

Page 33: Blackberry Java Application 5

//Open a connection to the file on the local file system. saveFile = (FileConnection) Connector.open ("file:///SDCard/blackberry/music" + filename, Connector.READ_WRITE); //If a file with the same name as the remote file doesn't exist //on the local system, download the file again. if (!saveFile.exists()) { saveFile.create(); } //Configure the local file to be readable. saveFile.setReadable(true); //Create a shared input stream using the an input stream //from the local file. SharedInputStream fileStream = SharedInputStream.getSharedInputStream (saveFile.openInputStream()); fileStream.setCurrentPosition(0); //If the file on the local file system is smaller than the remote file, //download the file again. if (saveFile.fileSize() < s.getLength()) { // didn't get it all before, download again saveFile.setWritable(true); saveStream = saveFile.openOutputStream(); readAhead = SharedInputStream.getSharedInputStream(s.openInputStream()); } else { downloadComplete = true; readAhead = fileStream; s.close(); } if (forcedContentType != null) { feedToPlayer = new LimitedRateSourceStream(readAhead, forcedContentType); } else { feedToPlayer = new LimitedRateSourceStream(readAhead, s.getType()); } }

Código de ejemplo: análisis de un archivo de reproducción de vídeo RIMM

import java.io.*;import java.util.*;import javax.microedition.io.*;import javax.microedition.io.file.*;/** * */public class KeyFrameOutputStream extends OutputStream { // output locations on the sd card private static final String OUT_DIR = "file:///SDCard/securitycam/"; private static final String OUT_FILE = "output.frames"; // some size constants private static final int HEADER_SIZE = 8; private static final int CHUNK_INFO_SIZE = 7;

Guía de desarrollo Reproducción de archivos multimedia en una aplicación de dispositivo BlackBerry

31

Page 34: Blackberry Java Application 5

// parsing states private static final int STATE_HEADER = 0; private static final int STATE_CHUNK_INFO = 1; private static final int STATE_DATA = 2; private static final int STATE_WAIT_FOR_NEXT = 3; // member variables private int _state; private int _pos; private boolean _isVideoFrame; private boolean _isKeyFrame; private boolean _isConfigFrame; private boolean _startSaving; private boolean _saveFrame; private int _dataSize; private int _duration; // temp buffer ref private byte[] _buf; private FileConnection _file; private OutputStream _out; private WriteThread _writer; private boolean _reading; public KeyFrameOutputStream() { _state = STATE_HEADER; _pos = 0; } public void open() { _reading = true; try { // create the file connection for our frame destination FileConnection dir = (FileConnection)Connector.open( OUT_DIR ); if( !dir.exists() ) { dir.mkdir(); } dir.close(); _file = (FileConnection)Connector.open( OUT_DIR + OUT_FILE ); if( !_file.exists() ) { _file.create(); } else { _file.truncate( 0L ); } _out = _file.openOutputStream(); } catch ( Exception e ) { } // start the write thread _writer = new WriteThread( _out ); _writer.start(); } public void startClosing() { // shuts down the write thread _reading = false; if( _writer != null ) _writer.stop(); }

Guía de desarrollo Reproducción de archivos multimedia en una aplicación de dispositivo BlackBerry

32

Page 35: Blackberry Java Application 5

public void write( int b ) throws IOException { if( _reading ) { switch( _state ) { case STATE_HEADER: // read the video stream header _pos++; if( _pos == HEADER_SIZE ) { _state = STATE_CHUNK_INFO; _buf = new byte[CHUNK_INFO_SIZE]; _pos = 0; } break; case STATE_CHUNK_INFO: // parse the information about the next chunk _buf[_pos] = (byte)b; _pos++; if( _pos == CHUNK_INFO_SIZE ) { // 1 indicates video frame, 0 indicates audio _isVideoFrame = (_buf[0] != 0); // key frame and config frame flags are in the top two bits// of the data size value _isKeyFrame = ((_buf[4] & 0x80) != 0); _isConfigFrame = ((_buf[4] & 0x40) != 0); _dataSize = ((int)(_buf[4] & 0x3f) << 24) | ((int)(_buf[3] & 0xff) << 16) | ((int)(_buf[2] & 0xff) << 8) | ((int)(_buf[1] & 0xff)); // duration is stored in the next two bytes _duration = ((int)(_buf[6] & 0xff) << 8) | ((int)(_buf[5] & 0xff)); // we want the config frame to be the first frame in our// output file if( !_startSaving ) { if( _isVideoFrame && _isConfigFrame ) { _startSaving = true; } } // after that only save the key frames _saveFrame = _startSaving && _isVideoFrame && ( _isConfigFrame || _isKeyFrame ); _state = STATE_DATA; if( _saveFrame ) { _buf = new byte[_dataSize]; } _pos = 0; } break; case STATE_DATA: // buffer the frame for writing to file if( _saveFrame ) _buf[_pos] = (byte)b; _pos++; if( _pos == _dataSize ) {

Guía de desarrollo Reproducción de archivos multimedia en una aplicación de dispositivo BlackBerry

33

Page 36: Blackberry Java Application 5

if( _saveFrame ) { _writer.addFrame( _buf ); } _state = STATE_WAIT_FOR_NEXT; _buf = new byte[CHUNK_INFO_SIZE]; _pos = 0; } break; case STATE_WAIT_FOR_NEXT: // skip over the chunk footer _pos++; if( _pos == CHUNK_INFO_SIZE ) { _state = STATE_CHUNK_INFO; _buf = new byte[CHUNK_INFO_SIZE]; _pos = 0; } break; } } } public void close() throws IOException { // shut down the write thread and close our file try { _writer.join(); } catch ( InterruptedException ie ) { } _out.close(); _file.close(); } private static final class WriteThread extends Thread { // writes key frames to a file as they are found by our parser private Vector _frames; private boolean _running; private OutputStream _out; public WriteThread( OutputStream out ) { _frames = new Vector(); _running = true; _out = out; } public void run() { for( ;; ) { ByteArray frame = null; synchronized( this ) { if( _frames.size() > 0 ) { frame = (ByteArray)_frames.elementAt( 0 ); if( frame == null ) break; _frames.removeElementAt( 0 ); } else { if( !_running ) break; try { wait(); if( _running ) continue;

Guía de desarrollo Reproducción de archivos multimedia en una aplicación de dispositivo BlackBerry

34

Page 37: Blackberry Java Application 5

} catch ( InterruptedException ie ) { } } } if( frame == null ) break; try { byte[] bytes = frame.array; _out.write( bytes, 0, bytes.length ); _out.flush(); } catch ( Exception e ) { } } } public synchronized void addFrame( byte[] frame ) { _frames.addElement( new ByteArray( frame ) ); notifyAll(); } public synchronized void stop() { _running = false; notifyAll(); } } private static final class ByteArray { public byte[] array; public ByteArray( byte[] array ) { this.array = array; } }}

Grabación de archivos multimedia a través de una aplicación de dispositivoBlackBerry

Grabar audio en una aplicación de dispositivo BlackBerryUn dispositivo BlackBerry® puede grabar audio en cuatro formatos: Adaptive Multi-Rate (AMR), modulación de código de pulso(PCM) de 8 kHz mono y 16 bits, GSM con dispositivos BlackBerry funcionando en redes GSM y QCP con dispositivos BlackBerryfuncionando en redes CDMA. El formato predeterminado de grabación de audio es AMR.

1. Importe las clases necesarias.

import java.lang.Thread;import javax.microedition.media.Manager;import java.io.ByteArrayOutputStream;import javax.microedition.media.Player;import javax.microedition.media.control.RecordControl;

Guía de desarrollo Grabación de archivos multimedia a través de una aplicación de dispositivo BlackBerry

35

Page 38: Blackberry Java Application 5

2. En una clase que extienda Thread, cree una variable del tipo Player, una variable del tipo RecordControl para grabararchivos multimedia desde un Player, una variable del tipo ByteArrayOutputStream para el flujo de audio y unavariable de matriz de bytes para almacenar datos de OutputStream. Tenga en cuenta que no es necesario que grabe elaudio en un subproceso distinto ya que las operaciones de grabación están encadenadas por defecto.

final class AudioRecorderThread extends Thread { private Player _player; private RecordControl _rcontrol; private ByteArrayOutputStream _output; private byte _data[];

3. Cree una clase de un constructor.

AudioRecorderThread(){}

4. En un bloque try, en su implementación del método run(), invoque Manager.createPlayer(Stringlocator) utilizando como parámetro un valor que especifique el cifrado a utilizar para grabar audio. Puede utilizar lassiguientes Strings de localizador compatibles.• AMR: capture://audio o capture://audio?encoding=amr o capture://audio?encoding=audio/

amr• PCM: capture://audio?encoding=pcm o capture://audio?encoding=audio/basic• GSM: capture://audio?encoding=gsm o capture://audio?encoding=audio/x-gsm• QCP: capture://audio?encoding=audio/qcelp

5. Cree un objeto Player invocando createPlayer() para capturar audio.

public void run() { try { _player = Manager.createPlayer("capture://audio");

6. Invoque Player.realize().

_player.realize();

7. Invoque Player.getControl() para obtener los controles para grabar archivos multimedia desde un Player.

_rcontrol = (RecordControl)_player.getControl("RecordControl");

8. Cree un ByteArrayOutputStream para grabar el flujo de audio. Tenga en cuenta que también puede grabardirectamente en un archivo especificado por una URL.

_output = new ByteArrayOutputStream();

9. Invoque RecordControl.setRecordStream() para establecer el flujo de salida en el que la aplicación del dispositivoBlackBerry grabará los datos.

_rcontrol.setRecordStream(_output);

10. Invoque RecordStore.startRecord() para iniciar la grabación de audio e iniciar la reproducción de archivosmultimedia desde el Player.

Guía de desarrollo Grabación de archivos multimedia a través de una aplicación de dispositivo BlackBerry

36

Page 39: Blackberry Java Application 5

_rcontrol.startRecord(); _player.start();

11. En un bloque catch, especifique las acciones a realizar si ocurre una excepción.

} catch (final Exception e){ //Perform actions }

12. Cree un bloque try en su implementación del método stop y, a continuación, invoque RecordControl.commit() paradetener la grabación de audio.

public void stop() { try { _rcontrol.commit()

13. Invoque ByteArrayOutputStream.toByteArray() para escribir los datos de audio desde OutputStream a unamatriz de bytes.

_data = _output.toByteArray();

14. Invoque ByteArrayOutputStream.close() y Player.close() para cerrar OutputStream y Player.

_output.close(); _player.close();

15. En un bloque catch, especifique las acciones a realizar si ocurre una excepción.

} catch (Exception e) { //Perform actions}

Código de ejemplo: registro de audio desde un objeto Player

final class AudioRecorderThread extends Thread { private Player _player; private RecordControl _rcontrol; private ByteArrayOutputStream _output; private byte _data[]; AudioRecorderThread() {} private int getSize() { return (_output != null ? _output.size() : 0); } private byte[] getAudioBuffer() { return _data; } public void run() { try { // Create a Player that records live audio. _player = Manager.createPlayer("capture://audio"); _player.realize(); // Get the RecordControl, configure the record stream,

Guía de desarrollo Grabación de archivos multimedia a través de una aplicación de dispositivo BlackBerry

37

Page 40: Blackberry Java Application 5

_rcontrol = (RecordControl)_player.getControl("RecordControl"); //Create a ByteArrayOutputStream to record the audio stream. _output = new ByteArrayOutputStream(); _rcontrol.setRecordStream(_output); _rcontrol.startRecord(); _player.start(); } catch (final Exception e) { UiApplication.getUiApplication().invokeAndWait(new Runnable() { public void run() { Dialog.inform(e.toString()); } }); } } public void stop() { try { //Stop recording, record data from the OutputStream, //close the OutputStream and player. _rcontrol.commit(); _data = _output.toByteArray(); _output.close(); _player.close(); } catch (Exception e) { synchronized (UiApplication.getEventLock()) { Dialog.inform(e.toString()); } } }

Grabar vídeo con la aplicación de grabación de vídeo de BlackBerry1. Importe las clases necesarias.

import net.rim.blackberry.api.invoke.CameraArguments;import net.rim.blackberry.api.invoke.Invoke;

2. Cree un objeto CameraArguments.

CameraArguments vidargs = new CameraArguments(CameraArguments.ARG_VIDEO_RECORDER);

3. Invoque invokeApplication() para iniciar la aplicación de grabación de vídeo.

Invoke.invokeApplication( Invoke.APP_TYPE_CAMERA, vidargs );

Utilizar la API multimedia para grabar vídeo1. Importe las clases necesarias.

Guía de desarrollo Grabación de archivos multimedia a través de una aplicación de dispositivo BlackBerry

38

Page 41: Blackberry Java Application 5

import java.io.OutputStream;import net.rim.device.api.ui.Field;import javax.microedition.io.Connector;import javax.microedition.io.file.FileConnection;import javax.microedition.media.Manager;import javax.microedition.media.Player;import javax.microedition.media.control.VideoControl;import javax.microedition.media.control.RecordControl;

2. Extienda MainScreen para crear una pantalla de grabación de vídeo. Tenga en cuenta que también podría utilizar elmarco de la interfaz de usuario de RIM o el marco de la interfaz de usuario de MIDP.

private static final class VideoRecordingScreen extends MainScreen {

3. Cree un reproductor multimedia de video para capturar vídeo. Tenga en cuenta que System.getProperty("video.encodings" ) se puede utilizar para detectar valores de propiedad de cifrado de vídeo y crear un URI quedescriba la captura de contenido de video en forma de "capture://video?" + encoding.

Player _player = javax.microedition.media.Manager.createPlayer( "capture://video?encoding=video/3gpp" );

4. Inicie Player

_player.start();

5. Obtenga un objeto VideoControl para controlar la colocación del visor de vídeo y un objeto RecordControl paracontrolar el estado de grabación.

VideoControl _vc = (VideoControl)_player.getControl( "VideoControl" );RecordControl _rc = (RecordControl)_player.getControl( "RecordControl" );

6. Existen distintas maneras de inicializar el modo de visualización de vídeo. La siguiente técnica muestra cómo gestionar elproceso si desea un Field que represente la región del visor de vídeo para su uso en la interfaz de usuario del dispositivoBlackBerry®.

Field videoField = (Field)_vc.initDisplayMode( VideoControl.USE_GUI_PRIMITIVE, "net.rim.device.api.ui.Field" );add( videoField );

7. Para grabar un flujo de vídeo.

a. Abra un FileConnection en el archivo de reproducción de vídeo.

FileConnection _fc = (FileConnection)Connector.open( "file:///SDCard/BlackBerry/videos/mmapi_stream.sbv" );

b. Cree el archivo de reproducción si no existe.

if( !_fc.exists() ) { _fc.create();}

c. Borre el archivo de reproducción.

Guía de desarrollo Grabación de archivos multimedia a través de una aplicación de dispositivo BlackBerry

39

Page 42: Blackberry Java Application 5

_fc.truncate( 0 );

d. Abra OutputStream, asocie el flujo de grabación con OutputStream e inicie la grabación de dicho flujo. Al grabaren OutputStream, los datos se escribirán en un formato adecuado que facilita el análisis de los marcos de audio y vídeo.

OutputStream _out = _fc.openOutputStream();_rc.setRecordStream( _out ); _rc.startRecord();

e. Una vez se ha capturado el flujo de vídeo, detenga el proceso y finalice la grabación, cierre los flujos.

_rc.stopRecord();_rc.commit();_out.close();_fc.close();

8. Para grabar un vídeo en un archivo.

a. Configure la ubicación de salida donde se grabarán los datos.

RecordControl _rc.setRecordLocation( "file:///SDCard/BlackBerry/videos/mmapi_video.3gp" );

b. Inicie la grabación de vídeo en formato 3GP.

_rc.startRecord();

c. Una vez se ha capturado el vídeo, detenga el proceso y finalice la grabación.

_rc.stopRecord();_rc.commit();

Código de ejemplo: uso de la API multimedia para grabar vídeo

import java.io.*;import javax.microedition.media.*;import javax.microedition.media.control.*;import javax.microedition.io.*;import javax.microedition.io.file.*;import net.rim.device.api.ui.*;import net.rim.device.api.ui.component.*;import net.rim.device.api.ui.container.*;import net.rim.device.api.util.*;import net.rim.device.api.system.*;import net.rim.device.api.media.*;/* * the entry class */public class VideoRecordingApplication extends UiApplication{ /* * working constants hard coded to create video files on the SD media card

Guía de desarrollo Grabación de archivos multimedia a través de una aplicación de dispositivo BlackBerry

40

Page 43: Blackberry Java Application 5

*/ private static final String VIDEO_FILE = "file:///SDCard/BlackBerry/videos/mmapi_rimlet.3GP"; private static final String STREAM_VIDEO_FILE = "file:///SDCard/BlackBerry/videos/mmapi_stream.sbv"; /* * video recording screen object used in several places within */ private static VideoRecordingScreen _vrs; /* * constructor */ private VideoRecordingApplication() { /* * to select the video encoding */ pushScreen( new ChooseEncodingScreen() ); } /* * main() entry point */ public static void main( String[] args ) { /* * fire up the event dispatcher loop */ new VideoRecordingApplication().enterEventDispatcher(); } /* * select video encoding screen * called by the VideoRecordingApplication class constructor */ private static final class ChooseEncodingScreen extends MainScreen { private static ObjectChoiceField _encodings; /* * constructor */ public ChooseEncodingScreen() { super(); setTitle( "Choose an encoding" ); /* * load String[] array with all MMAPI video encoding system property values */ String[] encodings = getEncodings(); /* * prep for display */ _encodings = new ObjectChoiceField( "Encoding:", encodings, 0 );

Guía de desarrollo Grabación de archivos multimedia a través de una aplicación de dispositivo BlackBerry

41

Page 44: Blackberry Java Application 5

/* * add field to this screen's manager */ add( _encodings ); /* * create a menu item to start recording using the selected encoding scheme */ addMenuItem( new MenuItem( "Go", 0, 0 ) { public void run() { /* * create and display the video recording screen, passing the selected video encoding scheme */ _vrs = new VideoRecordingScreen( (String)_encodings.getChoice( _encodings.getSelectedIndex() ) ); UiApplication.getUiApplication().pushScreen( _vrs ); } } ); } /* * returns all MMAPI video encoding system property values */ private String[] getEncodings() { String[] encodings = new String[0]; /* * load String with all video.encodings property values * each value is separated by a space */ String encodingsString = System.getProperty( "video.encodings" ); /* * determine where the first value ends */ int space = encodingsString.indexOf( ' ' ); /* * loop through values, end when a new field separator is not found */ while( space != -1 ) { /* * add a new String array element that contains the system property value */ Arrays.add( encodings, encodingsString.substring( 0, space ) ); /* * remove the last property value from the encoding string */ encodingsString = encodingsString.substring( space + 1 ); /*

Guía de desarrollo Grabación de archivos multimedia a través de una aplicación de dispositivo BlackBerry

42

Page 45: Blackberry Java Application 5

* determine where the first value ends */ space = encodingsString.indexOf( ' ' ); } /* * add a new String array element that contains the final system property value */ Arrays.add( encodings, encodingsString ); /* * return the resulting String[] array */ return encodings; } } /* * video recording screen displayed after the user selects "Go" from the menu */ private static final class VideoRecordingScreen extends MainScreen { private static Player _player; private static VideoControl _vc; private static RecordControl _rc; private static boolean _visible = true; private static boolean _locationSet = false; private static RichTextField _status; private static CheckboxField _stream; private static OutputStream _out; private static FileConnection _fc; private static RichTextField _flashIndicator; /* * constructor passed the chosen video encoding property value */ public VideoRecordingScreen( String encoding ) { super(); try { /* * create a video media player to capture video using the passed encoding value */ _player = javax.microedition.media.Manager.createPlayer( "capture://video?" + encoding ); /* * try to start the player */ _player.start(); _vc = (VideoControl)_player.getControl( "VideoControl" ); _rc = (RecordControl)_player.getControl( "RecordControl" ); /* * Initialize the mode on how the video is displayed. * This method must be called before the video can be displayed.

Guía de desarrollo Grabación de archivos multimedia a través de una aplicación de dispositivo BlackBerry

43

Page 46: Blackberry Java Application 5

* * USE_GUI_PRIMITIVE defines a mode on how the GUI is displayed. * It is used in conjunction with initDisplayMode(int, java.lang.Object). */ Field videoField = (Field)_vc.initDisplayMode( VideoControl.USE_GUI_PRIMITIVE, "net.rim.device.api.ui.Field" ); /* * add field to this screen's manager */ add( videoField ); _status = new RichTextField( "Idle" ); add( _status ); _stream = new CheckboxField( "Use OutputStream", false ); add( _stream ); } catch ( Exception e ) { System.out.println( "Exception in VideoScreen constructor" ); } addMenuItem( new MenuItem( "Start Record", 0, 0 ) { public void run() { startRecord(); } } ); addMenuItem( new MenuItem( "Stop Record", 0, 0 ) { public void run() { stopRecord(); } } ); addMenuItem( new MenuItem( "Commit Record", 0, 0 ) { public void run() { commit(); } } ); addMenuItem( new MenuItem( "Toggle Visibility", 0, 0 ) { public void run() { toggleVisibility(); } } ); addMenuItem( new MenuItem( "Play Recording", 0, 0 ) { public void run() { //InputStream recording = _stream.getChecked() ? new// ByteArrayInputStream( _out.toByteArray() ) : null;

Guía de desarrollo Grabación de archivos multimedia a través de una aplicación de dispositivo BlackBerry

44

Page 47: Blackberry Java Application 5

Application.getApplication().invokeLater( new ShowVideoRunnable( null ) ); } } ); /* * this loads the streamed video into memory then does nothing with it */ addMenuItem( new MenuItem( "Analyze Recording Stream", 0, 0 ) { public void run() { try { /* * get a handle to the streaming video file located on the SDCard (declared near the start of this file) */ _fc = (FileConnection)Connector.open( STREAM_VIDEO_FILE ); /* * determine the file size */ long size = _fc.fileSize(); /* * declare a block of ram to store the file */ byte[] file = new byte[(int)size]; /* * open the stream for read */ InputStream in = _fc.openInputStream(); /* * load the file into memory */ in.read( file ); } catch ( Exception e ) { } } } ); } /* * decipher and act upon shortcut keys */ protected boolean keyChar( char c, int status, int time ) { switch( c ) { case 's': startRecord(); return true; case 'x': stopRecord(); return true; case 'c': commit();

Guía de desarrollo Grabación de archivos multimedia a través de una aplicación de dispositivo BlackBerry

45

Page 48: Blackberry Java Application 5

return true; case 'v': toggleVisibility(); return true; case 'r': reset(); return true; default: return false; } } /* * record captured video */ private void startRecord() { try { /* * _locationSet == false by default */ if( !_locationSet ) { /* * test if "Use OutputStream" CheckboxField is set */ if( _stream.getChecked() ) { try { _fc = (FileConnection)Connector.open( STREAM_VIDEO_FILE ); /* * create streaming file if it does not exist */ if( !_fc.exists() ) { _fc.create(); } /* * zap the file */ _fc.truncate( 0 ); /* * ready to write video stream */ _out = _fc.openOutputStream(); } catch ( Exception e ) { return; } _rc.setRecordStream( _out ); } else { /* * FileConnection: Set the output stream where the data will

Guía de desarrollo Grabación de archivos multimedia a través de una aplicación de dispositivo BlackBerry

46

Page 49: Blackberry Java Application 5

be recorded. * The locator specifying where the recorded media will be saved. * The locator must be specified as a URL. */ _rc.setRecordLocation( VIDEO_FILE ); } _locationSet = true; } /* * Start recording the media. */ _rc.startRecord(); _status.setText( "Recording" ); } catch ( Exception e ) { } } private void stopRecord() { try { /* * Stop recording the media. * stopRecord will not automatically stop the Player. * It only stops the recording, putting the Player in "standby" mode */ _rc.stopRecord(); _status.setText( "Recording stopped" ); } catch ( Exception e ) { } } private void commit() { try { /* * Complete the current recording. * If the recording is in progress, commit will implicitly call stopRecord. */ _rc.commit(); Dialog.alert( "Committed" ); _locationSet = false; _status.setText( "Committed" ); /* * video stream was recorded */ if( _stream.getChecked() ) { /* * close the stream */ try { _out.close();

Guía de desarrollo Grabación de archivos multimedia a través de una aplicación de dispositivo BlackBerry

47

Page 50: Blackberry Java Application 5

_fc.close(); } catch ( Exception e ) { } } } catch ( Exception e ) { } } /* * toggle video visibility */ private void toggleVisibility() { try { _visible = !_visible; /* * show or hide the video */ _vc.setVisible( _visible ); } catch ( Exception e ) { } } /* * Erase the current recording */ private void reset() { try { _rc.reset(); _status.setText( "Reset called, idle" ); } catch ( Exception e ) { } } /* * hide the video */ public void hide() { try { _visible = false; _vc.setVisible( _visible ); } catch ( Exception e ) { } } /* * show the video */ public void show() { try { _visible = true; _vc.setVisible( _visible ); } catch ( Exception e ) {

Guía de desarrollo Grabación de archivos multimedia a través de una aplicación de dispositivo BlackBerry

48

Page 51: Blackberry Java Application 5

} } } /* * ShowVideoRunnable() called within VideoRecordingScreen() through the "Play Recording" menu */ private static final class VideoPlaybackScreen extends MainScreen { private Player _video; private VideoControl _vc; public VideoPlaybackScreen( InputStream vid ) { super(); try { /* * existing video stream passed */ if( vid != null ) { /* * Create a Player to play back media from an InputStream (streamed video) */ _video = javax.microedition.media.Manager.createPlayer( vid, "video/x-rim" ); } else { /* * Create a Player from an input locator (a standard video file in .3GP format) */ _video = javax.microedition.media.Manager.createPlayer( VIDEO_FILE ); } /* * Constructs portions of the Player without acquiring the scarce and exclusive resources. */ _video.realize(); /* * Obtain the object that implements the specified Control interface. */ _vc = (VideoControl)_video.getControl( "VideoControl" ); /* * Initialize the mode on how the video is displayed */ Field vField = (Field)_vc.initDisplayMode( VideoControl.USE_GUI_PRIMITIVE, "net.rim.device.api.ui.Field" ); add( vField ); VolumeControl vol = (VolumeControl)_video.getControl( "VolumeControl" ); vol.setLevel( 30 );

Guía de desarrollo Grabación de archivos multimedia a través de una aplicación de dispositivo BlackBerry

49

Page 52: Blackberry Java Application 5

} catch ( Exception e ) { System.out.println( "Exception while showing video" ); } } protected void onVisibilityChange( boolean visible ) { if( visible ) { try { /* * Starts the Player as soon as possible. */ _video.start(); } catch ( Exception e ) { } } } public boolean onClose() { try { /* * Close the Player and release its resources. */ _video.close(); } catch ( Exception e ) { } _vrs.show(); return super.onClose(); } } /* * called within VideoRecordingScreen() through the "Play Recording" menu */ private static final class ShowVideoRunnable implements Runnable { private InputStream _in; public ShowVideoRunnable( InputStream in ) { _in = in; } public void run() { /* * hide the VideoRecordingScreen */ _vrs.hide(); /* * Retrieves this UI application object. */ UiApplication ui = UiApplication.getUiApplication(); /* * handle video playback */ ui.pushScreen( new VideoPlaybackScreen( _in ) );

Guía de desarrollo Grabación de archivos multimedia a través de una aplicación de dispositivo BlackBerry

50

Page 53: Blackberry Java Application 5

} }}

Reproducir archivos multimedia en la aplicación multimedia del dispositivoBlackBerryEn los dispositivos BlackBerry® que incluyen la aplicación multimedia de dispositivos BlackBerry, una aplicación de dispositivoBlackBerry puede utilizar los paquetes javax.microedition.content y net.rim.device.api.content parainiciar la aplicación multimedia del dispositivo BlackBerry pasando o sin pasar contenido multimedia para cargarlo.

Iniciar la aplicación multimedia con o sin contenido1. Importe la clase necesaria.

import javax.microedition.content;

2. Invoque Registry.getRegistry(classname) donde el parámetro classname es el nombre de la clase en laaplicación del dispositivo BlackBerry® que extiende javax.microedition.midlet.MIDlet,net.rim.device.api.system.Application o net.rim.device.api.ui.UiApplication. Almaceneuna referencia al objeto devuelto en un objeto Registry.

Registry reg = Registry.getRegistry(String classname);

3. Lleve a cabo una de las siguientes tareas:

Tarea Pasos

Iniciar la aplicación

multimedia con o sin

contenido.

Cree una instancia nueva de un objeto Invocation. Almacenar una referencia al objeto

en un objeto Invocation.

Invocation invocation = new Invocation(null, null, BlackBerryContentHandler.ID_MEDIA_CONTENT_HANDLER)

Iniciar la aplicación

multimedia con

contenido

Cree una instancia nueva de un objeto Invocation. Utilice un tipo multimedia compatible

con la aplicación multimedia como parámetro y almacene una referencia al objeto en un

objeto Invocation.

Invocation invocation = new Invocation("file://...")

4. Para iniciar la aplicación multimedia, invoque Registry.invoke(Invocation invocation) pasando un objetoInvocation.

reg.invoke(invocation)

Guía de desarrollo Reproducir archivos multimedia en la aplicación multimedia del dispositivo BlackBerry

51

Page 54: Blackberry Java Application 5

Reproducir audio en BlackBerry Browser1. Importe las clases necesarias.

import net.rim.blackberry.api.browser.Browser;import net.rim.blackberry.api.browser.BrowserSession;

2. Invoque Browser.getDefaultSession().

BrowserSession soundclip = Browser.getDefaultSession();

3. Invoque BrowserSession.displaypage().

soundclip.displayPage("file:///SDCard/BlackBerry/music/yourFile.mp3");

Reproducir un vídeo en BlackBerry Browser.1. Importe las clases necesarias.

import net.rim.blackberry.api.browser.Browser;import net.rim.blackberry.api.browser.BrowserSession;

2. Invoque Browser.getDefaultSession().

BrowserSession videoclip = Browser.getDefaultSession();

3. Invoque BrowserSession.displaypage().

videoclip.displayPage("file:///SDCard/BlackBerry/Video/soccergame avi");

Guía de desarrollo Reproducir archivos multimedia en la aplicación multimedia del dispositivo BlackBerry

52

Page 55: Blackberry Java Application 5

Trabajo con imágenes de la aplicación Cámara 2

Iniciar la cámara desde una aplicación del dispositivo BlackBerryPuede crear una aplicación de dispositivo BlackBerry® que utilice la clase Invoke para iniciar la aplicación Cámara de formaque el usuario del dispositivo BlackBerry pueda tomar una fotografía.

1. Importe la clase necesaria.

import net.rim.blackberry.api.invoke.Invoke;

2. Invoque invokeApplication() para invocar la aplicación Cámara.

Invoke.invokeApplication(Invoke.APP_TYPE_CAMERA, new CameraArguments());

Crear una aplicación Gestor de contenido que reproduzca multimediaEste artículo describe el desarrollo de una aplicación Gestor de contenido que utiliza JSR 211 para permitir a las aplicacionesinvocar otras aplicaciones, incluidas las aplicaciones nativas del dispositivo BlackBerry®, para gestionar tipos de contenidoespecíficos. Al registrar el gestor de contenido para gestionar tipos de contenido de vídeo o imágenes con la acción SEND, porejemplo, aparecerá un elemento de menú siempre que vea un vídeo o imagen en la pantalla de vista previa de la cámara, en elexplorador de archivos, etc. Al hacer clic en este menú, el elemento de menú invocará el gestor de contenido con una acciónSEND y un vínculo al vídeo o imagen.

1. Importe las clases necesarias.

import javax.microedition.content.ContentHandlerServer;import javax.microedition.content.RequestListener;import javax.microedition.content.Registry;import javax.microedition.content.Invocation;import javax.microedition.content.ActionNameMap;

2. Cree una clase que extienda UiApplication e implemente RequestListener.

public final class SendMediaDemo extends UiApplication implements RequestListener {

3. Gestione el inicio de la aplicación.

public static void main(String[] args) throws Exception{ if(args != null && args.length > 0) { if (args[0].equals("startup")) { // Register ourselves as a content handler on startup register(); } } else { // Create a new instance of the application and make the currently

Guía de desarrollo Trabajo con imágenes de la aplicación Cámara

53

Page 56: Blackberry Java Application 5

// running thread the application's event dispatching thread. SendMediaDemo app = new SendMediaDemo(); app.enterEventDispatcher(); } }

4. Registre la aplicación como un RequestListener.

public SendMediaDemo() throws ContentHandlerException { // Get access to the ContentHandlerServer for this application and // register as a listener. ContentHandlerServer contentHandlerServer = Registry.getServer(CLASSNAME); contentHandlerServer.setListener(this); }

5. Cree un método para gestionar el registro del gestor de contenido. Este método utilizará Registry.register() paragarantizar que esta aplicación pueda ser iniciada con opciones de menú externas para enviar vídeo e imágenes a estaaplicación.

private static void register() throws ContentHandlerException { String[] types = {"image/bmp", "image/png", "image/jpeg", "video/3gpp", "video/mp4"}; String[] suffixes = {".bmp", ".png", ".jpg", ".3GP", ".mp4"}; String[] actions = {ContentHandler.ACTION_SEND}; String[] actionNames = {"Send to demo app"}; ActionNameMap[] actionNameMaps = {new ActionNameMap(actions,actionNames,"en")}; // Get access to the registry Registry registry = Registry.getRegistry(CLASSNAME); // Register as a content handler registry.register(CLASSNAME, types, suffixes, actions, actionNameMaps, ID, null); }

6. Implemente RequestListener.invocationRequestNotify(). Este gestor se invocará cuando otra aplicaciónpasa el contenido a esta aplicación.

public void invocationRequestNotify(ContentHandlerServer server) { Invocation invoc = server.getRequest(false); if(invoc != null) { String type = invoc.getType(); if(type.equals("image/bmp") || type.equals("image/png") || type.equals("image/jpeg")) { byte[] data = getData(invoc.getURL()); displayImage(data); } else if(type.equals("video/3gpp") || type.equals("video/mp4")) { initVideo(invoc.getURL()); if(_videoField != null) { displayVideo(); } } else {

Guía de desarrollo Crear una aplicación Gestor de contenido que reproduzca multimedia

54

Page 57: Blackberry Java Application 5

System.exit(0); } server.finish(invoc, Invocation.OK); }}

Código de ejemplo: crear una aplicación Gestor de contenido que reproduzcamultimediapackage com.rim.samples.device.sendmediademo;import java.io.*;import javax.microedition.content.*;import javax.microedition.io.*;import javax.microedition.media.*; import javax.microedition.media.control.*;import javax.microedition.io.file.*;import net.rim.device.api.system.*;import net.rim.device.api.ui.*;import net.rim.device.api.ui.component.*;import net.rim.device.api.ui.container.*;public final class SendMediaDemo extends UiApplication implements RequestListener{ private static final String ID = "com.rim.samples.device.sendmediademo"; private static final String CLASSNAME = "com.rim.samples.device.sendmediademo.SendMediaDemo"; private Player _player; private Field _videoField; private VideoControl _vc; /** * Entry point for application * @param args Command line arguments */ public static void main(String[] args) { if(args != null && args.length > 0) { if (args[0].equals("startup")) { // Register ourselves as a content handler on startup register(); } } else { // Create a new instance of the application and make the currently // running thread the application's event dispatching thread. SendMediaDemo app = new SendMediaDemo(); app.enterEventDispatcher(); }

Guía de desarrollo Código de ejemplo: crear una aplicación Gestor de contenido que reproduzca multimedia

55

Page 58: Blackberry Java Application 5

} /** * Registers this application as a content handler for image files */ private static void register() { String[] types = {"image/bmp", "image/png", "image/jpeg", "video/3gpp", "video/mp4"}; String[] suffixes = {".bmp", ".png", ".jpg", ".3GP", ".mp4"}; String[] actions = {ContentHandler.ACTION_SEND}; String[] actionNames = {"Send to demo app"}; ActionNameMap[] actionNameMaps = {new ActionNameMap(actions,actionNames,"en")}; // Get access to the registry Registry registry = Registry.getRegistry(CLASSNAME); try { // Register as a content handler registry.register(CLASSNAME, types, suffixes, actions, actionNameMaps, ID, null); } catch (ContentHandlerException che) { System.out.print(che.toString()); } catch (ClassNotFoundException cnfe) { System.out.print(cnfe.toString()); } } // Constructor public SendMediaDemo() { try { // Get access to the ContentHandlerServer for this application and // register as a listener. ContentHandlerServer contentHandlerServer = Registry.getServer(CLASSNAME); contentHandlerServer.setListener(this); } catch(ContentHandlerException che) { System.out.println(che.toString()); } } /** * RequestListener implementation * @param server The content handler server from which to request Invocation objects */ public void invocationRequestNotify(ContentHandlerServer server)

Guía de desarrollo Código de ejemplo: crear una aplicación Gestor de contenido que reproduzca multimedia

56

Page 59: Blackberry Java Application 5

{ Invocation invoc = server.getRequest(false); if(invoc != null) { String type = invoc.getType(); if(type.equals("image/bmp") || type.equals("image/png") || type.equals("image/jpeg")) { byte[] data = getData(invoc.getURL()); displayImage(data); } else if(type.equals("video/3gpp") || type.equals("video/mp4")) { initVideo(invoc.getURL()); if(_videoField != null) { displayVideo(); } } else { System.exit(0); } server.finish(invoc, Invocation.OK); } } /** * Sets the size of the video * @param width Width of the video display * @param height Height of the video display */ private void setVideoSize(int width, int height) { try { if (_vc != null) { _vc.setDisplaySize(width, height); } } catch(MediaException pe) { System.out.println(pe.toString()); } } /** * Creates and initializes a video player * @param url The URL of the video file to play */ private void initVideo(String url) { try

Guía de desarrollo Código de ejemplo: crear una aplicación Gestor de contenido que reproduzca multimedia

57

Page 60: Blackberry Java Application 5

{ _player = javax.microedition.media.Manager.createPlayer(url); _player.realize(); _vc = (VideoControl) _player.getControl("VideoControl"); if (_vc != null) { _videoField = (Field) _vc.initDisplayMode (VideoControl.USE_GUI_PRIMITIVE, "net.rim.device.api.ui.Field"); _vc.setVisible(true); } } catch(MediaException pe) { System.out.println(pe.toString()); } catch (IOException ioe) { System.out.println(ioe.toString()); } } /** * Returns a byte array containing data representing the image at the specified URL * @param url The location of the image to display * @return The image data */ private byte[] getData(String url) { byte[] data = new byte[0]; try { FileConnection file = (FileConnection)Connector.open(url); int fileSize = (int)file.fileSize(); data = new byte[fileSize]; InputStream inputStream = file.openInputStream(); inputStream.read(data); } catch(Exception e) { System.out.println(e.toString()); } return data; } /** * Creates a screen and displays the image * @param data The data representing the image to be rendered */ private void displayImage(byte [] data) { // Create image field Bitmap image = Bitmap.createBitmapFromBytes( data, 0, -1, 5); BitmapField imageField = new BitmapField( image, Field.FIELD_HCENTER);

Guía de desarrollo Código de ejemplo: crear una aplicación Gestor de contenido que reproduzca multimedia

58

Page 61: Blackberry Java Application 5

// Create and display screen MainScreen screen = new MainScreen(net.rim.device.api.ui.Manager.NO_VERTICAL_SCROLL); screen.setTitle("Send Media Demo"); screen.add(imageField); pushScreen(screen); } /** * Creates a video screen and starts the video player */ private void displayVideo() { // Create and display screen VideoMainScreen screen = new VideoMainScreen(); screen.setTitle("Send Media Demo"); screen.add(_videoField); pushScreen(screen); try { // Start media player _player.start(); } catch(MediaException pe) { System.out.println(pe.toString()); } } /** * A main screen in which to play video files */ final private class VideoMainScreen extends MainScreen { // Constructor VideoMainScreen() { super(net.rim.device.api.ui.Manager.NO_VERTICAL_SCROLL); } /** * @see net.rim.device.api.ui.Manager#sublayout(int,int) */ protected void sublayout(int width, int height) { setVideoSize(Display.getWidth(), Display.getHeight()); super.sublayout(width, height); } /** * @see net.rim.device.api.ui.Screen#onClose() */ public boolean onClose() { _player.close();

Guía de desarrollo Código de ejemplo: crear una aplicación Gestor de contenido que reproduzca multimedia

59

Page 62: Blackberry Java Application 5

return super.onClose(); } }}

Recibir una notificación de los eventos del sistema de archivosPuede crear una aplicación de dispositivo BlackBerry® que utilice las siguientes clases e interfaz para detectar cuándo se agregao elimina una imagen de un sistema de archivos para un dispositivo BlackBerry. La clase FileSystemJournal actúa comoun diario que efectúa un seguimiento de los cambios en el sistema de archivos. La aplicación del dispositivo BlackBerry puedeconsultar a este diario con el fin de obtener información acerca de los eventos del sistema de archivos.

• net.rim.device.api.io.file.FileSystemJournal• net.rim.device.api.io.file.FileSystemJournalEntry• net.rim.device.api.io.file.FileSystemJournalListener

Detectar cuándo se agrega o elimina una imagen en el sistema de archivosdel dispositivo BlackBerry1. Importe las clases necesarias.

import net.rim.device.api.system.Application;import net.rim.device.api.io.file.FileSystemJournalListener;

2. Implemente la interfaz FileSystemJournalListener.

class FileExplorerDemoJournalListener implements FileSystemJournalListener {

3. Cree una variable de la instancia que representa el último número de la secuencia de actualización.

private long _lastUSN;

4. Implemente FileSystemJournalListener.fileJournalChanged() para recibir notificaciones cuando ocurraun nuevo evento del sistema de archivos.

public void fileJournalChanged() {

5. Dentro de la implementación del archivo JournalChanged(), debe obtener el siguiente USN que utilizará el diario.

long nextUSN = FileSystemJournal.getNextUSN();

6. Cree un bucle for que itere hacia atrás desde el siguiente USN que utilizará el diario. Una práctica recomendada consisteen detener la iteración una vez la aplicación del dispositivo BlackBerry® recupera una entrada del diario.

for (long lookUSN = nextUSN - 1; lookUSN >= _lastUSN && msg == null; --lookUSN) {

Guía de desarrollo Recibir una notificación de los eventos del sistema de archivos

60

Page 63: Blackberry Java Application 5

7. En el bucle for, recupere la entrada del diario que se corresponde con el USN actual.

FileSystemJournalEntry entry = FileSystemJournal.getEntry(lookUSN);

8. Cree una cláusula IF que compruebe si la entrada en el diario es nula. Si es así, la nueva entrada del diario del sistema no existe.

if (entry == null) { break; }

9. En el caso de que exista la entrada del diario, debe obtener la ruta asociada con la entrada.

String path = entry.getPath();

10. Cree una cláusula IF que compruebe si la ruta de la entrada no es nula.

if (path != null) {

11. Cree una cláusula IF que compruebe si el evento del sistema de archivos implica un archivo de imagen.

if (path.endsWith("png") || path.endsWith("jpg") || path.endsWith("bmp") || path.endsWith("gif") ){

12. Lleve a cabo las acciones correspondientes si se ha agregado o eliminado un archivo del sistema de archivos.

switch (entry.getEvent()) { case FileSystemJournalEntry.FILE_ADDED: //either a picture was taken or a picture was added to the BlackBerry device break; case FileSystemJournalEntry.FILE_DELETED: //a picture was removed from the BlackBerry device; break;

13. Invoque Application.addFileSystemJournalListener() para agregar el oyente a la aplicación de dispositivoBlackBerry. En este ejemplo, FileExplorerDemo extiende UIApplication que extiende a su vez Application.

this.addFileSystemJournalListener(new FileExplorerDemoJournalListener());

Recuperar una imagen1. Importe las clases e interfaces necesarias.

import javax.microedition.io.Connector;import javax.microedition.io.file.FileConnection;

2. Implemente la siguiente interfaz.• javax.microedition.io.file.FileConnection

3. Invoque Connector.open() utilizando como parámetro la ubicación de la imagen en el dispositivo BlackBerry® o latarjeta microSD.

Guía de desarrollo Recuperar una imagen

61

Page 64: Blackberry Java Application 5

FileConnection fconn = (FileConnection)Connector.open("file:///store/home/user/pictures/newfile.jpg");FileConnection fconn = (FileConnection)Connector open("file:///SDCard/pictures/newfile.jpg");

Mover una imagen dentro del mismo directorio del sistema de archivosLas imágenes se pueden mover cambiando el nombre de un archivo o directorio seleccionado por un nombre nuevo en el mismodirectorio, siempre que el nombre nuevo no esté ya en uso. El nombre del archivo o directorio cambia inmediatamente en elsistema de archivos real tras la invocación de este método. Tras la llamada a este método el archivo o directorio con el nombreoriginal dejará de existir.

1. Importe las clases e interfaces necesarias.

import javax.microedition.io.Connector;import javax.microedition.io.file.FileConnection;

2. Invoque Connector.open() con un parámetro de la ubicación de la imagen en una tarjeta de microSD.

FileConnection fconn = (FileConnection)Connector.open("file:///SDCard/pictures/newfile.jpg");

3. Invoque FileConnection.rename().

fconn.rename("newfilename.jpg");

Mover una imagen a un directorio diferente del sistema de archivos1. Importe las clases e interfaz necesarias.

import java.io.InputStream;import java.io.OutputStream;import javax.microedition.io.Connector;import javax.microedition.io.file.FileConnection;

2. Almacene el nombre y ubicación del archivo anterior y del archivo nuevo.

String oldFile = "file:///store/home/user/pictures/newfile.jpg"; String newFile = "file:///SDCard/pictures/newfile.jpg";

3. Cree una conexión de archivo para la ubicación anterior y nueva del archivo.

FileConnection source = (FileConnection) Connector.open(oldFile); FileConnection dest = (FileConnection) Connector.open(newFile);

4. Si el archivo no existe en el directorio de destino, créelo.

Guía de desarrollo Mover una imagen dentro del mismo directorio del sistema de archivos

62

Page 65: Blackberry Java Application 5

if (!dest.exists()) { dest.create(); }

5. El archivo en el directorio de destino debe tener permiso de escritura.

dest.setWritable(true);

6. Abra un flujo de salida a la ubicación de destino del archivo.

OutputStream outStream = dest.openOutputStream();

7. Abra un flujo de entrada a la ubicación de origen del archivo.

InputStream inStream = source.openInputStream();

8. Cree una matriz Byte que represente el tamaño del búfer para FileInputStream.

byte[] Buffer = new byte[1024];

9. Cree un bucle While que lea los datos desde InputStream y hasta OutputStream.

int length = -1; while ((length = inStream.read(buffer)) > 0) { outStream.write(buffer, 0 , length); }

10. Elimine el archivo de origen y, a continuación, cierre las conexiones del flujo de entrada y de salida.

inStream.delete(); inStream.close();outStream.close();

Eliminar una imagen del sistema de archivos1. Importe las clases e interfaces necesarias.

import javax.microedition.io.Connector;import javax.microedition.io.file.FileConnection;

2. Invoque Connector.open() utilizando como parámetro la ubicación de la imagen en el dispositivo BlackBerry® o latarjeta microSD.

FileConnection fconn = (FileConnection)Connector.open("file:///store/home/user/pictures/newfile.jpg");

3. Invoque FileConnection.delete().

fconn.delete();

4. Puesto que invocar FileConnection.delete() vacía y cierra automáticamente todos los flujos de entrada y salida,debe invocar FileConnection.close() para evitar que ocurran excepciones.

Guía de desarrollo Eliminar una imagen del sistema de archivos

63

Page 66: Blackberry Java Application 5

fconn.close();

Guía de desarrollo Eliminar una imagen del sistema de archivos

64

Page 67: Blackberry Java Application 5

Dibujar y posicionar imágenes 3

Su aplicación de dispositivo BlackBerry® puede utilizar objetos Graphics para llevar a cabo funciones de dibujo y operacionesde representación. Utilice la clase Graphics para dibujar sobre toda la pantalla o en una clase Field. Si su aplicación nocuenta con ningún campo, omita el método javax.microedition.lcdui.Canvas.paint(Graphics) para realizarel dibujo utilizando el objeto Graphics especificado.

Para dibujar en un objeto Bitmap específico, una aplicación de dispositivo BlackBerry obtiene un contexto gráfico pasando elobjeto Bitmap al constructor Graphics. Para dibujar sobre un objeto Bitmap sin cambiar el contenido de Bitmap, cree unBitmapField y pase el objeto Bitmap al constructor BitmapField. Al dibujar en un campo, el administrador del campopasa un contexto gráfico a los campos cuando éstos se vuelven a dibujar. Para realizar dibujos personalizados en un campo,omita el método paint(Graphics g) cuando extienda la clase Field. La clase Graphics le permite dibujar formas, porejemplo, arcos, líneas, rectángulos y círculos.

Posicionar una imagen1. Importe las clases necesarias.

import net.rim.device.api.system.Bitmap;import net.rim.device.api.ui.component.BitmapField;import net.rim.device.api.ui.Graphics;import net.rim.device.api.ui.container.MainScreen;

2. Realice una de las siguientes tareas:

Tarea Pasos

Utilice un campo para

posicionar la imagena. Invoque el constructor Graphics().

Bitmap surface = new Bitmap(100, 100); BitmapField surfaceField = new BitmapField(surface); Graphics graphics = new Graphics(surface);

b. Agregue BitmapField a la pantalla.

mainScreen.add(surfaceField);

Utilice la pantalla de una

aplicación para posicionar la

imagen

a. Invoque el método Screen.getGraphics().

Graphics graphics = Screen.getGraphics();

b. Especifique que los métodos llevan a cabo las funciones de dibujo dentro de los

límites de la pantalla.

graphics.fillRect(10, 10, 30, 30); graphics.drawRect(15, 15, 30, 30);

Guía de desarrollo Dibujar y posicionar imágenes

65

Page 68: Blackberry Java Application 5

Comprobar que el dispositivo BlackBerry es compatible con una pantalla encolor1. Importe la clase necesaria.

import net.rim.device.api.system.Display;

2. Invoque Display.isColor().

if( Display.isColor() ) { RED = 0xff0000; GREEN = 0x00ff00; BLUE = 0x5555ff; } else { RED = 0xffffff; GREEN = 0xffffff; BLUE = 0xffffff; }

Recuperar el número de colores con los que es compatible la pantalla deldispositivo BlackBerry1. Importe la clase necesaria.

import net.rim.device.api.system.Display;

2. Invoque Display.getNumColors().

switch( Display.getNumColors() ) { case 2: // MONO modes = new int[] { 0, 1 }; break; case 4: // GRAYSCALE modes = new int[] { 0, 1, 4, 5 }; break; case 65536: // COLOR modes = new int[] { 0, 1, 8, 9, 11 }; break; }

Guía de desarrollo Comprobar que el dispositivo BlackBerry es compatible con una pantalla en color

66

Page 69: Blackberry Java Application 5

Configurar la transparencia del píxel en el área de trabajoLa transparencia del píxel se establece en el valor alfa global y actual para dibujar operaciones. Este valor oscila entre 0(completamente transparente) y 255 (completamente opaco). El valor actual se puede recuperar a través deGraphics.getGlobalAlpha() y puede configurarse utilizando Graphics.setGlobalAlpha().

1. Importe la clase necesaria.

import net.rim.device.api.ui.Graphics;

2. Cree una instancia de un objeto Graphics.

private Graphics _g;

3. Realice una de las siguientes tareas:• Para configurar el valor alfa global, invoque _g.setGlobalApha().• Para recuperar el valor alfa global, invoque _g.getGlobalApha().

Consultar las operaciones de malla con las que es compatible la aplicaciónde dispositivo BlackBerryLa aplicación de dispositivo BlackBerry® puede utilizar Graphics.isRopSupported(int rop) para consultar si unaoperación de malla en particular es compatible con el objeto Graphics.

1. Importe la clase necesaria.

import net.rim.device.api.ui.Graphics;

2. Cree una instancia de un objeto Graphics.

private Graphics _g;

3. Invoque Graphics.isRopSupported(int) pasando una constante ROP_* o ROP2_* como parámetro.

if ( _g.isRopSupported(Graphics.ROP_SRC_COPY)) {

Dibujar una ruta sombreada y con relleno1. Importe la clase necesaria.

import net.rim.device.api.ui.Graphics;

2. Invoque Graphics.drawShadedFilledPath().

public void paint(Graphics g) { g.setColor(186895); int x[] = { 71,90,150,100,115,71,30,45,0,55 }; int y[] = { 30,75,75,108,160,130,160,108,75,75 };

Guía de desarrollo Configurar la transparencia del píxel en el área de trabajo

67

Page 70: Blackberry Java Application 5

int col[] = { 186895,186895,186895,186895,186895,186895,186895,186895,186895,1868 5 }; g.drawShadedFilledPath( x, y, null, col, null ); this.getUiEngine().updateDisplay();}

Código de ejemplo: dibujo de una ruta que pase del azul al rojo en la pantallade un dispositivo BlackBerryint _width = Display.getWidth();int _height = Display.getHeight();Bitmap surface = new Bitmap(_width, _height); BitmapField surfaceField = new BitmapField(surface); add(surfaceField); Graphics graphics = new Graphics(surface); int[] X_PTS = { 0, 0, _width, _width }; int[] Y_PTS = { 20, 50, 50, 20 }; int[] drawColors = { 0x0000CC, 0x0000CC, 0xCC0000, 0xCC0000 }; try { graphics.drawShadedFilledPath(X_PTS, Y_PTS, null, drawColors, null); } catch (IllegalArgumentException iae) { System.out.println("Bad arguments."); }

Activar o desactivar un estilo de dibujo1. Importe la clase necesaria.

import net.rim.device.api.ui.Graphics;

2. Cree una instancia de un objeto Graphics.

private Graphics _g;

3. Invoque Graphics.setDrawingStyle(int drawStyle, boolean on) donde el parámetro "on" se ha configuradoen true para activar el estilo de dibujo y en false para desactivar el estilo de dibujo

_g.setDrawingStyle(Graphics.DRAWSTYLE_AAPOLYGONS, true); _g.setDrawingStyle(Graphics.DRAWSTYLE_AAPOLYGONS, false);

Determinar si se ha configurado un estilo de dibujo1. Importe la clase necesaria.

Guía de desarrollo Código de ejemplo: dibujo de una ruta que pase del azul al rojo en la pantalla de un dispositivo BlackBerry

68

Page 71: Blackberry Java Application 5

import net.rim.device.api.ui.Graphics;

2. Invoque Graphics.isDrawingStyleSet(int drawStyle).

if(g.isDrawingStyleSet(Graphics.DRAWSTYLE_FOCUS)) {

Código de ejemplo: determinación de si el estilo de dibujo especificado estáactivadopublic static void paintPanel( Graphics g, int width, int height, boolean isBottomRow, int panelType ) { int[] colors; if(g.isDrawingStyleSet(Graphics.DRAWSTYLE_FOCUS)) { colors = new int[]{ COLOR_BACKGROUND_FOCUS, COLOR_BACKGROUND_FOCUS, COLOR_GRADIENT_END_FOCUS, COLOR_GRADIENT_END_FOCUS }; g.setColor(COLOR_BACKGROUND_FOCUS);] } else { colors = new int[]{ COLOR_BACKGROUND, COLOR_BACKGROUND, COLOR_GRADIENT_END, COLOR_GRADIENT_END }; g.setColor(COLOR_BACKGROUND); } }

Utilizar una imagen de mapa de bits monocromáticos como marcaEl dibujo de una marca en una imagen de mapa de bits permite que los píxeles transparentes sigan siendo transparentes (sólose actualizarán los píxeles opacos).

1. Importe la clase necesaria.

import net.rim.device.api.ui.component.BitmapField;

2. Para utilizar una imagen de mapa de bits monocromáticos como marca mediante la representación en color de la regiónno transparente, debe crear un objeto BitmapField utilizando como parámetro la constante STAMP_MONOCHROME.Deberá utilizar únicamente la constante STAMP_MONOCHROME con imágenes de mapa de bits que tengan una profundidadde bits de 1 con alfa definido.

Guía de desarrollo Código de ejemplo: determinación de si el estilo de dibujo especificado está activado

69

Page 72: Blackberry Java Application 5

BitmapField field = new BitmapField(original, BitmapField.STAMP_MONOCHROME);

Código de ejemplo: demostración del uso de una imagen de mapa de bitsmonocromáticos como marcafinal class DrawDemoScreen extends MainScreen { DrawDemoScreen() { LabelField title = new LabelField("UI Demo", LabelField.USE_ALL_WIDTH); setTitle(title); Bitmap original = Bitmap.getPredefinedBitmap(Bitmap.INFORMATION); Bitmap restored = new Bitmap(original.getType(), original.getWidth(), original.getHeight()); Graphics graphics = new Graphics(restored); // Retrieve raw data from original image. int[] argb = new int[original.getWidth() * original.getHeight()]; original.getARGB(argb, 0, original.getWidth(), 0, 0, original.getWidth(), original.getHeight()); // Draw new image using raw data retrieved from original image. graphics.drawRGB(argb, 0, restored.getWidth(), 0, 0, restored.getWidth(), restored.getHeight()); if(restored.equals(original)) { System.out.println("Success! Bitmap renders correctly with RGB data."); } else if(!restored.equals(original)) { System.out.println("Bitmap rendered incorrectly with RGB data."); } BitmapField field1 = new BitmapField(original, BitmapField.STAMP_MONOCHROME); BitmapField field2 = new BitmapField(restored); add(new LabelField("Original bitmap: ")); add(field1); add(new LabelField("Restored bitmap: ")); add(field2); } }

Crear una imagen de mapa de bits utilizando otra imagen de mapa de bitsUna aplicación de dispositivo BlackBerry® puede manipular directamente los datos de imágenes sin procesar una vez que losdatos de las imágenes sin procesar de una región específica en una imagen de bits se almacenen en una matriz de enteros.

Guía de desarrollo Código de ejemplo: demostración del uso de una imagen de mapa de bits monocromáticos como marca

70

Page 73: Blackberry Java Application 5

Crear una imagen de mapa de bits que contenga contenido con tamañomodificado de otra imagen de mapa de bits1. Importe la clase necesaria.

import net.rim.device.api.system.Bitmap;

2. Recupere una imagen existente de mapa de bits.

Bitmap testBitmap0 = Bitmap.getBitmapResource("rim.png");

3. Cree un área de mapa de bits que contenga la versión escalada de la imagen de mapa de bits original.

Bitmap scaledBitmap1 = new Bitmap(200, 50);

4. Escale la imagen de mapa de bits original y almacénela en otra imagen de mapa de bits.

testBitmap0.scaleInto(scaledBitmap1, Bitmap.FILTER_BILINEAR);

Duplicar una imagen de mapa de bits1. Importe la clase necesaria.

import net.rim.device.api.system.Bitmap;

2. Agregue la imagen de mapa de bits existente a una matriz de bytes.

byte[] data = getNamedResource("image.gif");

3. Cree una nueva imagen de mapa de bits que sea un duplicado exacto de la imagen existente.

Bitmap newBitmap = Bitmap.createBitmapFromBytes(data, 0, -1, 1);

Crear una imagen de mapa de bits que contenga parte del contenido de otraimagen de mapa de bits1. Importe la clase necesaria.

import net.rim.device.api.system.Bitmap;

2. Cargue la imagen de mapa de bits existente en una matriz de bytes.

byte[] data = getNamedResource("image.gif");

3. Cree una nueva imagen de mapa de bits que sea un subconjunto de la imagen existente donde START_OFFSET constituyala compensación inicial en la matriz de bytes y NUM_BYTES sea el número de bytes que se ha de escribir en la nueva imagende mapa de bits.

Guía de desarrollo Crear una imagen de mapa de bits que contenga contenido con tamaño modificado de otra imagen de mapa de bits

71

Page 74: Blackberry Java Application 5

Bitmap newBitmap = Bitmap.createBitmapFromBytes(data, START_OFFSET, NUM_BYTES, 1);

Dibujar una imagen en una imagen de mapa de bits vacía1. Importe las clases necesarias.

import net.rim.device.api.ui.Graphics;import net.rim.device.api.ui.component.BitmapField;

2. Cree una imagen de mapa de bits vacía, copiando el tipo y el tamaño de una imagen de mapa de bits existente.

Bitmap restored = new Bitmap(original.getType(), original.getWidth(), original.getHeight());

3. Cree un objeto Graphics y utilice la imagen de mapa de bits vacía como superficie de dibujo.

Graphics graphics = new Graphics(restored);

4. Invoque Graphics.rawRGB() para dibujar una imagen nueva utilizando datos sin procesar recuperados de la imagenoriginal.

graphics.drawRGB(argb, 0, restored.getWidth(), 0, 0, restored.getWidth(), restored.getHeight());

Filtros de interpolaciónLa interpolación es necesaria para eliminar la apariencia en forma de bloques de una imagen de mapa de bits de nueva escaladebido a los cambios en el número de píxeles. La interpolación vuelve a probar los datos de la imagen de mapa de bits e intentaevitar una apariencia pixelada en forma de bloques. Puesto que el resultado visual de cada filtro puede parecer diferente cuandose aplica a varios tipos de imágenes, el usuario puede optar por elegir un filtro de interpolación adecuado.

Hay tres filtros disponibles para su uso con métodos de escala de imágenes de mapa de bits.

Filtro Descripción

Bitmap.FILTER_LANCZ

OS

El filtro Lanczos es el más lento de los filtros de interpolación disponibles. La interpolación de Lanczos

puede dar lugar a imágenes definidas pero puede introducir artefactos de sonido.

Bitmap.FILTER_BOX El filtro box, también conocido como filtro de valor medio, filtro de alisado y filtro de promedio, puede

generar rápidamente imágenes borrosas.

Bitmap.FILTER_BILINE

AR

El filtro bilinear puede generar rápidamente buenos resultados para imágenes con tamaño

modificado, aunque puede mostrar líneas de transición definidas. Este filtro a menudo se utiliza

para representar vistas previas de la imagen de mapa de bits.

Guía de desarrollo Dibujar una imagen en una imagen de mapa de bits vacía

72

Page 75: Blackberry Java Application 5

Visualización de imágenes 4

Visualización de una imagen acercándola, alejándola y desplazándolaLa clase ZoomScreen le permite acercar, alejar y desplazar una imagen. Si el usuario del dispositivo BlackBerry® hace clic enla bola de desplazamiento o en la pantalla táctil, la pantalla muestra la región central de la imagen ampliada.

Si la imagen se amplia, la pantalla también muestra una superposición que resalta la región sobre la que se ha aplicado el zoom.Al desplazar la rueda de desplazamiento o al deslizar el dedo por la pantalla se desplazará la imagen. Cuando el usuario deja dedesplazar y de acercar o alejar la imagen, la superposición desaparece de la pantalla.

En dispositivos BlackBerry con pantalla táctil, los usuarios pueden definir la región de la imagen a la que aplicar el zoom. Elusuario puede tocar dos puntos en la imagen para definir las esquinas opuestas en diagonal de la región. Cuando se seleccionala región, el usuario puede deslizar un dedo alrededor de la imagen para mover la región del zoom. Para ampliar la región definida,el usuario hace clic en la pantalla. Para alejar la imagen, el usuario pulsa la tecla Escape.

Mostrar una imagen acercándola, alejándola y desplazándola1. Importe las clases y las interfaces necesarias.

import net.rim.device.api.system.*;import net.rim.device.api.ui.*;import net.rim.device.api.ui.component.*;import net.rim.device.api.ui.extension.container.*;

2. Cree el marco de la aplicación ampliando la clase UiApplication. En main(), cree una instancia de la clase nueva einvoque enterEventDispatcher() para activar la aplicación para que reciba eventos. En el constructor, cree unEncodedImage mediante un recurso del proyecto, cree un ZoomScreen con EncodedImage e invoque pushScreen() para mostrar la imagen con el fin de acercarla, alejarla y desplazarla.

public class ZoomableImageApp extends UiApplication{ public static void main(String[] args) { ZoomableImageApp theApp = new ZoomableImageApp(); theApp.enterEventDispatcher(); } public ZoomableImageApp() { EncodedImage myImg = new EncodedImage(“img/myImg.jpg”); ZoomScreen zoomableImg = new ZoomScreen(myImg); pushScreen(zoomableImg); }}

Guía de desarrollo Visualización de imágenes

73

Page 76: Blackberry Java Application 5

Código de ejemplo: visualización de una imagen acercándola, alejándola ydesplazándolaimport net.rim.device.api.system.*;import net.rim.device.api.ui.*;import net.rim.device.api.ui.component.*;import net.rim.device.api.ui.extension.container.*;public class ZoomableImageApp extends UiApplication{ public static void main(String[] args) { ZoomableImageApp theApp = new ZoomableImageApp(); theApp.enterEventDispatcher(); } public ZoomableImageApp() { EncodedImage myImg = new EncodedImage(“img/myImg.jpg”); ZoomScreen zoomableImg = new ZoomScreen(myImg); pushScreen(zoomableImg); }}

Visualización de una fila de imágenes para realizar desplazamientosPuede utilizar la clase PictureScrollField para representar una fila horizontal de imágenes por las que el usuario se puedadesplazar mediante la rueda de desplazamiento o con toques sobre la pantalla.

PictureScrollField le permite definir el estilo para resaltar la imagen seleccionada, el estilo del fondo dePictureScrollField, el texto mostrado bajo la imagen seleccionada, el texto de la sugerencia que aparece cuando unaimagen se selecciona inicialmente y la altura y anchura de las imágenes.

Mostrar una fila de imágenes para realizar desplazamientos1. Importe las clases y las interfaces necesarias.

import net.rim.device.api.system.*;import net.rim.device.api.ui.*;import net.rim.device.api.ui.component.*;import net.rim.device.api.ui.container.*;import net.rim.device.api.ui.decor.*; import net.rim.device.api.ui.extension.component.*;

Guía de desarrollo Código de ejemplo: visualización de una imagen acercándola, alejándola y desplazándola

74

Page 77: Blackberry Java Application 5

2. Cree el marco de la aplicación ampliando la clase UiApplication. En main(), cree una instancia de la clase nueva einvoque enterEventDispatcher() para activar la aplicación para que reciba eventos. En el constructor, invoquepushScreen() para mostrar la pantalla personalizada de la aplicación. La clasePictureScrollFieldDemoScreen, descrita en el paso 3, representa la pantalla personalizada.

public class PictureScrollFieldDemo extends UiApplication{ public static void main(String[] args) { PictureScrollFieldDemo app = new PictureScrollFieldDemo(); app.enterEventDispatcher(); } public PictureScrollFieldDemo() { pushScreen(new PictureScrollFieldDemoScreen()); }}

3. Cree el marco para la pantalla personalizada ampliando la clase MainScreen.

class PictureScrollFieldDemoScreen extends MainScreen {{ public PictureScrollFieldDemoScreen() { }}

4. En el constructor, invoque setTitle() para establecer el texto que aparece en la sección del título de la pantalla.

setTitle(“PictureScrollField Demo”);

5. En el constructor, cree e inicialice tres matrices para almacenar las imágenes para mostrar en PictureScrollField ylas etiquetas y texto de las sugerencias que aparece cuando se selecciona cada una de las imágenes. En este ejemplo,PictureScrollField contiene tres imágenes.

Bitmap[] images = new Bitmap[3];String[] labels = new String[3];String[] tooltips = new String[3];images[0] = Bitmap.getBitmapResource(“img1.jpg”);labels[0] = “Label for image 1”;tooltips[0] = “Tooltip for image 1”;images[1] = Bitmap.getBitmapResource(“img2.jpg”);labels[1] = “Label for image 2”;tooltips[1] = “Tooltip for image 2”;images[2] = Bitmap.getBitmapResource(“img3.jpg”);labels[2] = “Label for image 3”;tooltips[2] = “Tooltip for image 3”;

6. En el constructor, cree e inicializa una matriz de objetos ScrollEntry. Un ScrollEntry representa cada elementode PictureScrollField.

Guía de desarrollo Mostrar una fila de imágenes para realizar desplazamientos

75

Page 78: Blackberry Java Application 5

ScrollEntry[] entries = ScrollEntry[3];for (int i = 0; i < entries.length; i++) { entries[i] = new ScrollEntry(images[i], labels[i], tooltips[i]);}

7. En el constructor, cree e inicializa PictureScrollField con cada imagen de 150 píxeles de ancho y 100 píxeles dealto. Invoque setData() para establecer las entradas en PictureScrollField. El segundo parámetro en setData() especifica qué posición de imagen se selecciona de forma predeterminada.

PictureScrollField pictureScrollField = new PictureScrollField(150, 100);pictureScrollField.setData(entries, 0);

8. En el constructor, configure el estilo de PictureScrollField. Invoque setHighlightStyle() para especificarcómo se resalta la imagen seleccionada. Invoque setHighlightBorderColor() para especificar el color del bordede la imagen seleccionada. Invoque setBackground() para especificar el fondo de PictureScrollField. InvoquesetLabelVisible() para especificar si PictureScrollField muestra la etiqueta de la imagen seleccionada.

pictureScrollField.setHighlightStyle(HighlightStyle.ILLUMINATE);pictureScrollField.setHighlightBorderColor(Color.BLUE);pictureScrollField.setBackground(BackgroundFactory createSolidTransparentBackground(Color.RED, 150));pictureScrollField.setLabelsVisible(true);

9. En el constructor, invoque add() para mostrar PictureScrollField.

add(pictureScrollField);

Código de ejemplo: visualización de una fila de imágenes para realizardesplazamientosimport net.rim.device.api.system.*;import net.rim.device.api.ui.*;import net.rim.device.api.ui.component.*;import net.rim.device.api.ui.container.*;import net.rim.device.api.ui.decor.*; import net.rim.device.api.ui.extension.component.*;public class PictureScrollFieldDemo extends UiApplication{ public static void main(String[] args) { PictureScrollFieldDemo app = new PictureScrollFieldDemo(); app.enterEventDispatcher(); } public PictureScrollFieldDemo() { pushScreen(new PictureScrollFieldDemoScreen());

Guía de desarrollo Código de ejemplo: visualización de una fila de imágenes para realizar desplazamientos

76

Page 79: Blackberry Java Application 5

}}class PictureScrollFieldDemoScreen extends MainScreen {{ public PictureScrollFieldDemoScreen() { setTitle(“PictureScrollField Demo”); Bitmap[] images = new Bitmap[3]; String[] labels = new String[3]; String[] tooltips = new String[3]; images[0] = Bitmap.getBitmapResource(“img1.jpg”); labels[0] = “Label for image 1”; tooltips[0] = “Tooltip for image 1”; images[1] = Bitmap.getBitmapResource(“img2.jpg”); labels[1] = “Label for image 2”; tooltips[1] = “Tooltip for image 2”; images[2] = Bitmap.getBitmapResource(“img2.jpg”); labels[2] = “Label for image 2”; tooltips[2] = “Tooltip for image 2”; ScrollEntry[] entries = ScrollEntry[3]; for (int i = 0; i < entries.length; i++) { entries[i] = new ScrollEntry(images[i], labels[i],tooltips[i]); } PictureScrollField pictureScrollField = new PictureScrollField(150, 100); pictureScrollField.setData(entries, 0); pictureScrollField.setHighlightStyle(HighlightStyle.ILLUMINATE); pictureScrollField.setHighlightBorderColor(Color.BLUE); pictureScrollField.setBackground(BackgroundFactory.createSolidTransparentBackground(Color.RED, 150)); pictureScrollField.setLabelsVisible(true); add(pictureScrollField); }}

Guía de desarrollo Código de ejemplo: visualización de una fila de imágenes para realizar desplazamientos

77

Page 80: Blackberry Java Application 5

Uso de imágenes sin procesar 5

Recuperar los datos de la imagen sin procesar1. Importe la clase necesaria.

import net.rim.device.api.system.Bitmap;

2. Invoque Bitmap.getARGB() para recuperar los datos de la imagen sin procesar de una región de una imagen de mapade bits y almacenar los datos en una matriz de enteros.

Bitmap original = Bitmap.getPredefinedBitmap(Bitmap.INFORMATION); int[] argb = new int[original.getWidth() * original.getHeight()];

Almacenar datos sin procesar de la imagen1. Importe la clase necesaria.

import net.rim.device.api.system.Bitmap;

2. Cree un objeto de Mapa de bits a partir de una imagen de mapa de bits existente.

Bitmap img = Bitmap.getPredefinedBitmap(Bitmap.INFORMATION);

3. Inicialice una matriz de enteros.

int[] argb = new int[img.getWidth() * img.getHeight()];

4. Invoque Bitmap.getARGB() para almacenar los datos de imagen sin procesar desde un mapa de bits nuevo o predefinidoen una matriz de enteros.

img.getARGB(argb, 0, img.getWidth(), 0, 0, img.getWidth(), img.getHeight());

Comparar dos imágenes sin procesar1. Importe la clase necesaria.

import net.rim.device.api.system.Bitmap;

2. Invoque Bitmap.equals().

Guía de desarrollo Uso de imágenes sin procesar

78

Page 81: Blackberry Java Application 5

if(restored.equals(original)) { System.out.println("Success! Bitmap renders correctly with RGB data."); } else (!restored.equals(original)) { System.out.println("Bitmap rendered incorrectly with RGB data."); }

Comparar dos imágenes de mapa de bits para comprobar si son diferentes1. Importe la clase necesaria.

import net.rim.device.api.system.Bitmap;

2. Cree dos objetos Bitmap de las imágenes de mapa de bits para la comparación.

Bitmap _first = Bitmap.getBitmapResource("first.png");Bitmap _last = Bitmap.getBitmapResource("last.png");

3. Cree un objeto XYRect para reflejar las diferencias entre las imágenes de bits.

XYRect diff = new XYRect(0, 0, _first.getWidth(), _first.getHeight());

4. Compare las imágenes de mapa de bits a través del método Bitmap.locateDifference(XYRect diffRect,Bitmap bmp2, int offset_x, int offset_y). Esta comparación se realiza en la referencia XYRect proporcionaday se puede desplazar dentro de la segunda imagen de mapa de bits a una posición alternativa. La diferencia mínima entrelas imágenes de mapa de bits en el área definida se determina, con la referencia XYRect modificada con las nuevascoordenadas que representan este área. Un XYRect vacío no representa una diferencia entre los dos mapas de bits dentrodel área determinada.

_first.locateDifference( diff, _last, 0, 0 );

Guía de desarrollo Comparar dos imágenes de mapa de bits para comprobar si son diferentes

79

Page 82: Blackberry Java Application 5

Uso de imágenes cifradas 6

Acceder a una imagen cifrada a través de un flujo de entrada1. Importe las clases necesarias.

import java.io.InputStream;

2. Guarde la imagen en la carpeta o subcarpeta del proyecto.

3. Agregue la imagen al proyecto en BlackBerry® Integrated Development Environment.

4. Invoque getClass().getResourceAsStream() para recuperar la imagen como un flujo de entrada de bytes.

private InputStream input; ... Class _class = this.getClass();input = _class.getResourceAsStream("/images/example.png");

Cifrar una imagen1. Importe las clases necesarias.

import net.rim.device.api.system.EncodedImage;

2. Invoque EncodedImage.createEncodedImage(). Este método utiliza los datos de imagen sin procesar en la matrizde bytes para crear una instancia de EncodedImage.

3. Busque el IllegalArgumentException que EncodedImage.createEncodedImage() arroja si la matriz debytes que ha proporcionado como parámetro no contiene un formato de imagen reconocido.

// Store the contents of the image file. private byte[] data = new byte[2430]; try { // Read the image data into the byte array input.read(data); } catch (IOException e) { // Handle exception. } try { EncodedImage image = EncodedImage.createEncodedImage(data, 0, data.length); } catch (IllegalArgumentException iae) { System.out.println("Image format not recognized."); }

Guía de desarrollo Uso de imágenes cifradas

80

Page 83: Blackberry Java Application 5

Mostrar una imagen cifrada1. Importe la clase necesaria.

import net.rim.device.api.ui.component.BitmapField;

2. Invoque BitmapField.setImage() para asignar la imagen cifrada a un BitmapField.

3. Invoque add() para agregar BitmapField a la pantalla.

BitmapField field = new BitmapField(); field.setImage(image); add(field);

Especificar el modo de descodificación de una imagen1. Importe la clase necesaria.

import net.rim.device.api.system.EncodedImage;

2. Invoque EncodedImage.setDecodeMode() utilizando uno de los siguientes modos como parámetro:• Utilice DECODE_ALPHA para descodificar un canal alfa, si existe (éste es el modo predeterminado).• Utilice DECODE_NATIVE para forzar la descodificación de la imagen del mapa de bits según el tipo de imagen nativa

de mapa de bits de BlackBerry® Device Software.• Utilice DECODE_READONLY para marcar la imagen de mapa de bits descodificada como de sólo lectura.

Especificar el tamaño de la pantalla de una imagen cifrada1. Importe la clase necesaria.

import net.rim.device.api.system.EncodedImage;

2. Invoque EncodedImage.scaleImage32(int scaleX, int scaleY). Los parámetros del valor de escala pasadosdeben ser los números net.rim.device.api.math.Fixed32 (0 < escala < 1 para escala ascendente y escala > 1para escala descendente). ScaleImage32() crea un nuevo EncodedImage en lugar de modificar el actual.

Guía de desarrollo Mostrar una imagen cifrada

81

Page 84: Blackberry Java Application 5

Uso de contenido SVG en una aplicación del dispositivoBlackBerry

7

El dispositivo BlackBerry® es compatible con una representación binaria de contenido SVG (Gráficos vectoriales escalables) enun formato de archivo .pme.

Puede utilizar BlackBerry® Composer para crear un archivo .pme o utilizar Plazmic SVG Transcoding Utility para convertir unarchivo .svg en un archivo .pme. BlackBerry Composer y Plazmic SVG Transcoding Utility forman parte de BlackBerry® ThemeStudio.

Descargar contenido SVG1. Importe la clase necesaria.

import net.rim.plazmic.mediaengine.MediaManager;

2. Cree un objeto MediaManager.

MediaManager manager = new MediaManager();

3. Invoque MediaManager.createMedia(). La primera vez que invoque MediaManager.createMedia(), la URLdebe ser absoluta, a menos que invoque en primer lugar MediaManager.setProperty("URI_BASE",<base_url>) para establecer una URL base. Al invocar posteriormente createMedia (), la URL anterior se utilizacomo base.

try { Object media = manager.createMedia("http://webserver/sample.pme"); } catch (IOException ioe) { System.out.println("Error: requested content was not downloaded."); } catch (MediaException me) { System.out.println("Error: " + me.getCode()); }

Reproducir contenido multimedia enriquecido1. Importe las clases necesarias.

import net.rim.plazmic.mediaengine.MediaPlayer;import net.rim.plazmic.mediaengine.MediaManager;

2. Cree una clase que extienda MainScreen y un constructor.

final static class MediaSampleScreen extends MainScreen { public MediaSampleScreen() { super();

Guía de desarrollo Uso de contenido SVG en una aplicación del dispositivo BlackBerry

82

Page 85: Blackberry Java Application 5

LabelField title = new LabelField("Media Sample", LabelField.ELLIPSIS | LabelField.USE_ALL_WIDTH); setTitle(title);

3. Cree un objeto MediaPlayer para gestionar la reproducción de tipos multimedia compatibles con Media Engine.

MediaPlayer player = new MediaPlayer();

4. Cree un objeto MediaManager para gestionar la descarga de contenido multimedia de Internet o del almacén local.

MediaManager manager = new MediaManager();

5. Invoque MediaManager.createMedia(String) para recuperar contenido multimedia de un URI determinado.

Object media = manager.createMedia("http://webserver/SVGFILE.pme");

6. Invoque MediaPlayer.setMedia() para especificar los archivos multimedia para la reproducción.

player.setMedia(media);

7. Invoque MediaPlayer.getUI() para recuperar un objeto UI que muestre contenido PME. Asigne el objeto resultantecomo un Field y, a continuación, agréguelo a Screen para su visualización.

add((Field)player.getUI());

8. Invoque MediaPlayer.start() para iniciar la reproducción del contenido PME descargado.

player.start();

Después de terminar: Debe crear una pantalla que no sea compatible con el desplazamiento para mostrar contenido SVG desdePlazmic® Media Engine versión 4.2.

Escuchar eventos al descargar un archivo .pme1. Importe las clases e interfaces necesarias.

import net.rim.plazmic.mediaengine.MediaManager;import net.rim.plazmic.mediaengine.MediaListener;

2. Implemente la interfaz net.rim.plazmic.mediaengine.MediaListener para gestionar todos los posibleseventos multimedia.

public final class MediaListenerImpl implements MediaListener { public void mediaEvent(Object sender, int event, int eventParam, Object data) { switch(event) { case MEDIA_REQUESTED: break; case MEDIA_COMPLETE: break; case MEDIA_REALIZED: break; case MEDIA_IO:

Guía de desarrollo Escuchar eventos al descargar un archivo .pme

83

Page 86: Blackberry Java Application 5

break; } } }

3. Invoque addMediaListener() en los objetos MediaPlayer y MediaManager para registrar el oyente de los eventosmultimedia.

private MediaListenerImpl _listener = new MediaListenerImpl(); private MediaPlayer player = new MediaPlayer(); private MediaManager manager = new MediaManager(); player.addMediaListener(_listener); manager.addMediaListener(_listener);

Responder a eventos al descargar un archivo .pme1. Importe las clases e interfaces necesarias.

import net.rim.plazmic.mediaengine.io.LoadingStatus;import net.rim.plazmic.mediaengine.MediaListener;

2. Implemente la interfaz net.rim.plazmic.mediaengine.MediaListener.

public final class MediaListenerImpl implements MediaListener {

3. En su implementación de MediaListener.mediaEvent(), cuando tenga lugar el evento MEDIA_IO, asigneObject en el parámetro de datos al objeto LoadingStatus.

LoadingStatus s = (LoadingStatus)data;

4. Invoque LoadingStatus.getStatus() para descargar contenido y gestionar el estado del archivo .pme que descargala aplicación.

switch(s.getStatus()) {

5. Para cada estado normal, imprima un mensaje en la consola.

case LoadingStatus.LOADING_STARTED: System.out.println("Loading in progress"); break;case LoadingStatus.LOADING_READING: System.out.println("Parsing in progress"); break;case LoadingStatus.LOADING_FINISHED: System.out.println("Loading completed"); break;

6. Si LoadingStatus.getStatus() devuelve un valor igual a LoadingStatus.LOADING_FAILED, lleve a cabo unao más de las acciones siguientes:• Para recuperar el código de error, invoque LoadingStatus.getCode().• Para recuperar el mensaje detallado, invoque LoadingStatus.getMessage().

Guía de desarrollo Responder a eventos al descargar un archivo .pme

84

Page 87: Blackberry Java Application 5

• Para recuperar la cadena de URL del contenido, invoque LoadingStatus.getSource().

case LoadingStatus.LOADING_FAILED: String errorName = null; int code = s.getCode(); switch (code) { case MediaException.INVALID_HEADER: errorName = "Invalid header"+ "/n" + s.getSource(); break; case MediaException.REQUEST_TIMED_OUT: errorName = "Request timed out" + "\n" + s.getSource(); break; case MediaException.INTERRUPTED_DOWNLOAD: break; case MediaException.UNSUPPORTED_TYPE: errorName = "Unsupported type" + s.getMessage() + "\n" + s.getSource(); break; default: { if (code > 200) { // A code > 200 indicates an HTTP error. errorName = "URL not found"; } else { // Default unidentified error. errorName = "Loading Failed"; } errorName += "\n" + s.getSource() + "\n" + s.getCode() + ": " + s.getMessage(); break; } } System.out.println(errorName); break;

Código de ejemplo: respuesta a eventos cuando una aplicación de dispositivoBlackBerry descarga contenido SVGpackage com.rim.samples.device.mediaenginedemo;import net.rim.plazmic.mediaengine.*;import net.rim.plazmic.mediaengine.io.*;/** * The MediaListener implementation. */public final class MediaListenerImpl implements MediaListener{ public void mediaEvent(Object sender, int event, int eventParam, Object data) { switch(event)

Guía de desarrollo Código de ejemplo: respuesta a eventos cuando una aplicación de dispositivo BlackBerry descarga contenido SVG

85

Page 88: Blackberry Java Application 5

{ case MEDIA_REQUESTED: System.out.println("Media requested"); break; case MEDIA_COMPLETE: System.out.println("Media completed"); break; case MEDIA_REALIZED: System.out.println("Media realized"); break; case MEDIA_IO: { LoadingStatus s = (LoadingStatus)data; switch(s.getStatus()) { case LoadingStatus.LOADING_STARTED: System.out.println("Loading in progress"); break; case LoadingStatus.LOADING_READING: System.out.println("Parsing in progress"); break; case LoadingStatus.LOADING_FINISHED: System.out.println("Loading completed"); break; case LoadingStatus.LOADING_FAILED: String errorName = null; int code = s.getCode(); switch (code) { case MediaException.INVALID_HEADER: errorName = "nvalid header"+ "/n" + s.getSource(); break; case MediaException.REQUEST_TIMED_OUT: errorName = "Request timed out" + "\n" + s.getSource(); break; case MediaException.INTERRUPTED_DOWNLOAD: break; case MediaException.UNSUPPORTED_TYPE: errorName = "Unsupported type" + s.getMessage() + "\n" + s.getSource(); break; default: { if (code > 200) { // A code > 200 indicates an HTTP error. errorName = "URL not found"; } else { // Default unidentified error.

Guía de desarrollo Código de ejemplo: respuesta a eventos cuando una aplicación de dispositivo BlackBerry descarga contenido SVG

86

Page 89: Blackberry Java Application 5

errorName = "Loading Failed"; } errorName += "\n" + s.getSource() + "\n" + s.getCode() + ": " + s.getMessage(); break; } } System.out.println(errorName); break; } // End switch s.getStatus(). break; } } }}

Descargar y reproducir un archivo .pme1. Importe las clases e interfaz necesarias.

import net.rim.plazmic.mediaengine.MediaPlayer;import net.rim.plazmic.mediaengine.MediaManager;import net.rim.plazmic.mediaengine.MediaListener;

2. Implemente la interfaz net.rim.plazmic.mediaengine.MediaListener.

public final class MediaListenerImpl implements MediaListener {

3. Cree un objeto MediaManager y, a continuación, invoque MediaManager.createMediaLater().

MediaManager manager = new MediaManager();manager.createMediaLater("http://webserver/sample.pme");

4. En el método MediaListener.mediaEvent(), agregue código para administrar el evento MEDIA_REALIZED queocurre cuando la aplicación termina de cargar un archivo .pme en el archivo BlackBerry®.

public void mediaEvent(Object sender, int event, int eventParam, Object data) { switch(event) { ... case MEDIA_REALIZED:

5. Invoque MediaPlayer.setMedia(data) para registrar el contenido.

player.setMedia(data);

6. Invoque MediaPlayer.start() para iniciar la reproducción del contenido.

player.start();

Guía de desarrollo Descargar y reproducir un archivo .pme

87

Page 90: Blackberry Java Application 5

Reproducir contenido SVG1. Importe las clases necesarias.

import net.rim.device.api.ui.Screen;import net.rim.plazmic.mediaengine.MediaPlayer;import net.rim.plazmic.mediaengine.MediaException;

2. Cree un objeto MediaPlayer para gestionar la reproducción de tipos multimedia compatibles con Media Engine.

MediaPlayer player = new MediaPlayer();

3. Invoque MediaPlayer.setMedia() para preparar MediaPlayer para reproducir archivos multimedia.

try { player.setMedia(media); } catch (MediaException me) { System.out.println("Error: requested content type is not supported.”); }

4. Cree una instancia de un objeto de pantalla utilizando para ello los campos NO_VERTICAL_SCROLL yNO_HORIZONTAL_SCROLL para permitir a una pantalla mostrar un archivo .pme creado por Plazmic® Media Engineversión 4.2.

Screen screen = new Screen(Screen.NO_VERTICAL_SCROLL | Screen.NO_HORIZONTAL_SCROLL);

5. Invoque MediaPlayer.getUI(), asigne el objeto devuelto a un tipo Field y agréguelo a Screen para mostrarlo.

screen.add((Field)player.getUI());

6. Si el objeto Player se encuentra en el estado REALIZED, invoque MediaPlayer.start() para iniciar la reproduccióndel archivo .pme.

if(player.getState() == MediaPlayer.REALIZED) { try { player.start(); } catch(MediaException me) { System.out.println("Error occurred during media playback: " + me.getCode() + me.getMessage()); } }

Guía de desarrollo Reproducir contenido SVG

88

Page 91: Blackberry Java Application 5

Acceder a contenido SVG a través de una conexión con la que no escompatible MediaManagerPuede crear una aplicación de dispositivo BlackBerry® que pueda descargar contenido SVG de Internet o del almacén local através de una conexión que sea compatible con un protocolo personalizado o que tenga una funcionalidad con la queMediaManager no es compatible o que MediaManager no proporciona.

1. Importe las clases necesarias.

import java.io.*;import net.rim.plazmic.mediaengine.*;import net.rim.plazmic.mediaengine.io.*;

2. Para implementar un conector personalizado, implemente la interfaznet.rim.plazmic.mediaengine.io.Connector.

public class CustomPMEConnector implements Connector { private Connector delegate; private InputStream input; CustomPMEConnector(Connector delegate) { this.delegate = delegate; } public InputStream getInputStream(String uri, ConnectionInfo info) throws IOException, MediaException { if (uri.startsWith("myprotocol://")) { // Perform special tasks. info.setConnection(new MyProtocolConnection()); info.setContentType("application/x-vnd.rim.pme"); // OpenMyInputStream() is a custom method that opens //stream for "myprotocol://" input = openMyInputStream(uri); } else { input = delegate.getInputStream(uri, info); } return input; } private InputStream openMyInputStream(String uri) { InputStream input = null; // @todo: open stream here return input; } // Inner class that defines the connection class. public static class MyProtocolConnection { public MyProtocolConnection() { // ... } public void close() {

Guía de desarrollo Acceder a contenido SVG a través de una conexión con la que no es compatible MediaManager

89

Page 92: Blackberry Java Application 5

// ... } }

3. Para configurar las propiedades del conector personalizado, implemente setProperty(String, String).

public void setProperty(String property, String value) { delegate.setProperty(property, value);}

4. Para iniciar la conexión personalizada, implemente releaseConnection(ConnectionInfo).

public void releaseConnection(ConnectionInfo info) throws IOException, MediaException { Object o = info.getConnection(); if (o instanceof MyProtocolConnection) { ((MyProtocolConnection)o).close(); // Perform cleanup. } else { delegate.releaseConnection(info); }}

Código de ejemplo: implementación de un marco de conector personalizado./* * CustomPMEConnector.java * Copyright (C) 2003-2007 Research In Motion Limited. All rights reserved. */ package com.rim.samples.docs.mediasample;import java.io.*; import net.rim.plazmic.mediaengine.*; import net.rim.plazmic.mediaengine.io.*; public class CustomPMEConnector implements Connector { private Connector delegate; private InputStream input; CustomPMEConnector(Connector delegate) { this.delegate = delegate; } public InputStream getInputStream(String uri, ConnectionInfo info) throws IOException, MediaException { if (uri.startsWith("myprotocol://")) { // Perform special tasks. info.setConnection(new MyProtocolConnection()); info.setContentType("application/x-vnd.rim.pme"); // OpenMyInputStream() is a custom method that opens //stream for "myprotocol://" input = openMyInputStream(uri); } else { input = delegate.getInputStream(uri, info); } return input;

Guía de desarrollo Código de ejemplo: implementación de un marco de conector personalizado.

90

Page 93: Blackberry Java Application 5

} private InputStream openMyInputStream(String uri) { InputStream input = null; // @todo: open stream here return input; } public void releaseConnection(ConnectionInfo info) throws IOException, MediaException { Object o = info.getConnection(); if (o instanceof MyProtocolConnection) { ((MyProtocolConnection)o).close(); // Perform cleanup. } else { delegate.releaseConnection(info); } } public void setProperty(String property, String value) { delegate.setProperty(property, value); } // Inner class that defines the connection class. public static class MyProtocolConnection { public MyProtocolConnection() { // ... } public void close() { // ... } } }

Guía de desarrollo Código de ejemplo: implementación de un marco de conector personalizado.

91

Page 94: Blackberry Java Application 5

Creación de gráficos 2D y 3D con JSR-239 8

Puede crear gráficos 2D y 3D para un dispositivo BlackBerry® utilizando JSR-239 y las API de BlackBerry. JSR-239 incluye Java®Binding para OpenGL® ES. OpenGL ES se basa en la versión de escritorio de OpenGL, pero se ha diseñado para su uso endispositivos inalámbricos.

Para obtener más información acerca de OpenGL, visite www.khronos.org/opengles/.

Paquetes para la compatibilidad con JSR-239

Paquete Descripción

javax.microedition.khronos.opengles Este paquete ofrece un subconjunto de API de OpenGL y los enlaces

para OpenGL® ES 1.0, 1.1 y sus extensiones. Incluye los métodos para

la manipulación de punto fijo y flotante de los valores.

javax.microedition.khronos.egl Este paquete proporciona los enlaces para EGL™ 1.0 y 1.1 para la API

de OpenGL ES. Los contextos de representación compatibles pueden

proporcionar un contenedor para el estado de representación de

OpenGL ES. El paquete se ha diseñado para ser compatible con las

superficies de representación de Windows, Pbuffer y Pixmap.

net.rim.device.api.opengles La clase GLUtils en este paquete proporciona compatibilidad con las

siguientes acciones:

• comprobar que el dispositivo BlackBerry® es compatible con

OpenGL ES

• cargar una matriz de proyección de perspectiva en 3D

• cargar una matriz de transformación de vista

• definir una matriz de proyección ortográfica en 2D

• cargar una textura desde una imagen Bitmap

• liberar la memoria asignada actualmente al búfer directo

java.nio Este paquete proporciona las clases que activan su aplicación para la

lectura y escritura en la entrada/salida bloqueante de alta velocidad.

net.rim.device.api.math Este paquete proporciona las clases diseñadas para ayudarle a mejorar

la versatilidad aritmética y la velocidad de procesamiento de las

aplicaciones del dispositivo BlackBerry que ha creado.

Guía de desarrollo Creación de gráficos 2D y 3D con JSR-239

92

Page 95: Blackberry Java Application 5

Código de ejemplo: representación de un triángulo 2D en varios colores

El siguiente código de ejemplo muestra cómo utilizar JSR-239 para representar un triángulo 2D en varios colores.

import java.nio.*;import javax.microedition.khronos.egl.*;import javax.microedition.khronos.opengles.*;import net.rim.device.api.ui.*;import net.rim.device.api.ui.container.*;import net.rim.device.api.system.*;import net.rim.device.api.opengles.*;public final class OpenGLTest extends UiApplication{ public OpenGLTest() { pushScreen(new OpenGLTestScreen()); } public static void main(String[] args) { new OpenGLTest().enterEventDispatcher(); }}class OpenGLTestScreen extends FullScreen implements Runnable{ private EGL11 _egl; private EGLDisplay _eglDisplay; private EGLConfig _eglConfig; private EGLSurface _eglSurface; private EGLContext _eglContext; private GL10 _gl; private Bitmap _offscreenBitmap; private Graphics _offscreenGraphics; private FloatBuffer _vertexArray; private FloatBuffer _colorArray; private boolean _running; private boolean _paused; OpenGLTestScreen() { super(FullScreen.DEFAULT_MENU | FullScreen.DEFAULT_CLOSE); } private void initialize() { // Get EGL interface _egl = (EGL11)EGLContext.getEGL(); // Get the EGL display _eglDisplay = _egl.eglGetDisplay(EGL11.EGL_DEFAULT_DISPLAY); // Initialize the display for EGL setting the version to null _egl.eglInitialize(_eglDisplay, null);

Guía de desarrollo Código de ejemplo: representación de un triángulo 2D en varios colores

93

Page 96: Blackberry Java Application 5

// Choose an EGL config EGLConfig[] configs = new EGLConfig[1]; int[] numConfigs = new int[1]; int[] attrs = { EGL11.EGL_RED_SIZE, 5, EGL11.EGL_GREEN_SIZE, 6, EGL11.EGL_BLUE_SIZE, 5, EGL11.EGL_NONE }; _egl.eglChooseConfig(_eglDisplay, attrs, configs, 1, numConfigs); _eglConfig = configs[0]; // Create an EGL window surface _eglSurface = _egl.eglCreateWindowSurface (_eglDisplay, _eglConfig, this, null); // Create an EGL context createEGLContext(); // Specify vertices and colors for a triangle float[] vertices = { -0.5f, -0.5f, 0.0f, 0.0f, 0.5f, 0.0f, 0.5f, -0.5f, 0.0f }; float[] colors = { 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f }; _vertexArray = ByteBuffer.allocateDirect(3 * 3 * 4).asFloatBuffer(); _vertexArray.put(vertices); _vertexArray.rewind(); _colorArray = ByteBuffer.allocateDirect(4 * 3 * 4).asFloatBuffer(); _colorArray.put(colors); _colorArray.rewind(); } private void createEGLContext() { // Create an EGL context _eglContext = _egl.eglCreateContext (_eglDisplay, _eglConfig, EGL10.EGL_NO_CONTEXT, null); // Get the GL interface for the new context _gl = (GL10)_eglContext.getGL(); // Make the new context current _egl.eglMakeCurrent (_eglDisplay, _eglSurface, _eglSurface, _eglContext); } private void destroyEGL() { _egl.eglMakeCurrent(_eglDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT);

Guía de desarrollo Código de ejemplo: representación de un triángulo 2D en varios colores

94

Page 97: Blackberry Java Application 5

_egl.eglDestroyContext(_eglDisplay, _eglContext); _egl.eglDestroySurface(_eglDisplay, _eglSurface); } private void handleContextLost() { // Destroy the EGL context _egl.eglMakeCurrent(_eglDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT); _egl.eglDestroyContext(_eglDisplay, _eglContext); _eglContext = EGL10.EGL_NO_CONTEXT; // Re-create the EGL context createEGLContext(); } /** * Main render loop. */ public void run() { initialize(); while (_running) { // Idle if this thread is in the background if (_paused) { synchronized (this) { try { wait(); } catch (InterruptedException x) { } } } updateBackBuffer(); renderFrame(); // Throttle cpu usage try { Thread.sleep(20); } catch (InterruptedException x) { } } destroyEGL(); } private void renderFrame() { // Make the context and surface current and check for EGL_CONTEXT_LOST if (!_egl.eglMakeCurrent(_eglDisplay, _eglSurface, _eglSurface, _eglContext)) { if (_egl.eglGetError() == EGL11.EGL_CONTEXT_LOST) handleContextLost(); }

Guía de desarrollo Código de ejemplo: representación de un triángulo 2D en varios colores

95

Page 98: Blackberry Java Application 5

// Signal that OpenGL rendering is about to begin _egl.eglWaitNative(EGL10.EGL_CORE_NATIVE_ENGINE, _offscreenGraphics); render(_gl); // Signal that OpenGL ES rendering is complete _egl.eglWaitGL(); // Swap the window surface to the display _egl.eglSwapBuffers(_eglDisplay, _eglSurface); } private void render(GL10 gl) { // Set the GL viewport gl.glViewport(0, 0, getWidth(), getHeight()); // Clear the surface gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); // Set the projection matrix gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); GLUtils.gluPerspective (gl, 45.0f, (float)getWidth()/(float)getHeight(), 0.15f, 10.0f); // Draw the triangle gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); gl.glTranslatef(0.0f, 0.0f, -3.0f); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_COLOR_ARRAY); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, _vertexArray); gl.glColorPointer(4, GL10.GL_FLOAT, 0, _colorArray); gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); } /** * Called by the UI system to paint the screen. */ protected void paint(Graphics g) { if (_offscreenBitmap != null) g.drawBitmap(0, 0, _offscreenBitmap.getWidth(), _offscreenBitmap.getHeight(), _offscreenBitmap, 0, 0); } /** * Called when the visibility of the screen changes. * * @param visible true if the screen is being made visible, * false if hidden */ protected void onVisibilityChange(boolean visible) { if (visible) { resume(); } else

Guía de desarrollo Código de ejemplo: representación de un triángulo 2D en varios colores

96

Page 99: Blackberry Java Application 5

{ pause(); } } /** * Called when the screen is closing. */ public void close() { _running = false; synchronized (this) { notifyAll(); } super.close(); } /** * Keeps the back buffer in sync with the screen size. */ private void updateBackBuffer() { if (_offscreenBitmap != null) { if (_offscreenBitmap.getWidth() == getWidth() && _offscreenBitmap.getHeight() == getHeight()) return; // no change needed } _offscreenBitmap = new Bitmap(getWidth(), getHeight()); _offscreenGraphics = Graphics.create(_offscreenBitmap); } private void pause() { _paused = true; } private void resume() { if (_running) { // Pause the render loop _paused = false; synchronized (this) { notifyAll(); } } else { // Start the render thread. _running = true; new Thread(this).start(); } }}

Guía de desarrollo Código de ejemplo: representación de un triángulo 2D en varios colores

97

Page 100: Blackberry Java Application 5

Código de ejemplo: dibujo de un cubo en 3D

Puede utilizar la interfaz GL10 para dibujar un cubo en 3D.

import java.nio.ByteBuffer;import java.nio.FloatBuffer;import javax.microedition.khronos.egl.EGL10;import javax.microedition.khronos.egl.EGL11;import javax.microedition.khronos.egl.EGLConfig;import javax.microedition.khronos.egl.EGLContext;import javax.microedition.khronos.egl.EGLDisplay;import javax.microedition.khronos.egl.EGLSurface;import javax.microedition.khronos.opengles.GL10;import net.rim.device.api.system.Bitmap;import net.rim.device.api.ui.Graphics;import net.rim.device.api.ui.container.FullScreen;class ThreeDCube extends FullScreen implements Runnable{ private EGL11 _egl; private EGLDisplay _eglDisplay; private EGLConfig _eglConfig; private EGLSurface _eglSurface; private EGLContext _eglContext; private GL10 _gl; private Bitmap _offscreenBitmap; private Graphics _offscreenGraphics; private boolean _running; private boolean _paused; private FloatBuffer _cubeVertices, _cubeNormals, _cubeColors; float _angle = 45f; private int _vertexCount; private static final float[] _vertices = { // front -0.5f, 0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, // right 0.5f, 0.5f, 0.5f, 0.5f, -0.5f, 0.5f, 0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, -0.5f, // back 0.5f, 0.5f, -0.5f, 0.5f, -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, // left -0.5f, 0.5f, -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, 0.5f, // top -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, 0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, // bottom

Guía de desarrollo Código de ejemplo: representación de un triángulo 2D en varios colores

98

Page 101: Blackberry Java Application 5

-0.5f, -0.5f, 0.5f, -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, -0.5f }; private static final float[] _normals = { /* front */ 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, /* right */ 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, /* back */ 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, /* left */ -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, /* top */ 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, /* bottom */ 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0 }; private static final float[] _colors = { /* front – white */ 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, /* right – red */ 1,0,0,1, 1,0,0,1, 1,0,0,1, 1,0,0,1, 1,0,0,1, 1,0,0,1, /* back – green */ 0,1,0,1, 0,1,0,1, 0,1,0,1, 0,1,0,1, 0,1,0,1, 0,1,0,1, /* left – blue */ 0,0,1,1, 0,0,1,1, 0,0,1,1, 0,0,1,1, 0,0,1,1, 0,0,1,1, /* top - yellow */ 1,1,0,1, 1,1,0,1, 1,1,0,1, 1,1,0,1, 1,1,0,1, 1,1,0,1, /* bottom - magenta*/ 1,0,1,1, 1,0,1,1, 1,0,1,1, 1,0,1,1, 1,0,1,1, 1,0,1,1 }; ThreeDCube() { super(FullScreen.DEFAULT_MENU | FullScreen.DEFAULT_CLOSE); } private void initialize() { // Get EGL interface _egl = (EGL11)EGLContext.getEGL(); // Get the EGL display _eglDisplay = _egl.eglGetDisplay(EGL11.EGL_DEFAULT_DISPLAY); // Initialize the display for EGL, null since we don't really need the// version. _egl.eglInitialize(_eglDisplay, null); // Choose an EGL config EGLConfig[] configs = new EGLConfig[1]; int[] numConfigs = new int[1]; int[] attrs = { EGL11.EGL_RED_SIZE, 5, EGL11.EGL_GREEN_SIZE, 6, EGL11.EGL_BLUE_SIZE, 5, EGL11.EGL_NONE }; _egl.eglChooseConfig(_eglDisplay, attrs, configs, 1, numConfigs); _eglConfig = configs[0]; // Create an EGL window surface _eglSurface = _egl.eglCreateWindowSurface

Guía de desarrollo Código de ejemplo: representación de un triángulo 2D en varios colores

99

Page 102: Blackberry Java Application 5

(_eglDisplay, _eglConfig, this, null); // Create an EGL context createEGLContext(); _cubeVertices = createVertexBuffer(); _cubeNormals = createNormalBuffer(); _cubeColors = createColorBuffer(); _vertexCount = _vertices.length / 3; } private FloatBuffer createVertexBuffer() { FloatBuffer buffer = ByteBuffer.allocateDirect(_vertices.length * 4).asFloatBuffer(); buffer.put(_vertices); buffer.rewind(); return buffer; } private FloatBuffer createNormalBuffer() { FloatBuffer buffer = ByteBuffer.allocateDirect(_normals.length * 4).asFloatBuffer(); buffer.put(_normals); buffer.rewind(); return buffer; } private FloatBuffer createColorBuffer() { FloatBuffer buffer = ByteBuffer.allocateDirect(_colors.length * 4).asFloatBuffer(); buffer.put(_colors); buffer.rewind(); return buffer; } private void createEGLContext() { // Create an EGL context _eglContext = _egl.eglCreateContext (_eglDisplay, _eglConfig, EGL10.EGL_NO_CONTEXT, null); // Get the GL interface for our new context _gl = (GL10)_eglContext.getGL(); // Make our new context current _egl.eglMakeCurrent (_eglDisplay, _eglSurface, _eglSurface, _eglContext); } private void destroyEGL() { _egl.eglMakeCurrent(_eglDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT); _egl.eglDestroyContext(_eglDisplay, _eglContext); _egl.eglDestroySurface(_eglDisplay, _eglSurface); } private void handleContextLost() {

Guía de desarrollo Código de ejemplo: representación de un triángulo 2D en varios colores

100

Page 103: Blackberry Java Application 5

// Destroy our EGL context _egl.eglMakeCurrent(_eglDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT); _egl.eglDestroyContext(_eglDisplay, _eglContext); _eglContext = EGL10.EGL_NO_CONTEXT; // Re-create our EGL context createEGLContext(); } /** * Main render loop. */ public void run() { initialize(); int throttle = 0; while (_running) { throttle = (int)System.currentTimeMillis(); // Idle If we are in the background if (_paused) { synchronized (this) { try { wait(); } catch (InterruptedException x) { } } } updateBackBuffer(); renderFrame(); ++_angle; if (_angle >= 360f) { _angle = 0f; } //Determine how long the frame took to render. throttle = (int)System.currentTimeMillis() - throttle; //Throttle to 30 FPS to control CPU usage. throttle = 33 - throttle; if (throttle > 0) { // Throttle cpu usage try { Thread.sleep(throttle); } catch (InterruptedException x) { } } } destroyEGL();

Guía de desarrollo Código de ejemplo: representación de un triángulo 2D en varios colores

101

Page 104: Blackberry Java Application 5

} private void renderFrame() { // Make our context and surface current and check for EGL_CONTEXT_LOST if (!_egl.eglMakeCurrent(_eglDisplay, _eglSurface, _eglSurface, _eglContext)) { if (_egl.eglGetError() == EGL11.EGL_CONTEXT_LOST) handleContextLost(); } // Signal that we are about to begin OpenGL rendering _egl.eglWaitNative(EGL10.EGL_CORE_NATIVE_ENGINE, _offscreenGraphics); render(_gl); // Signal that OpenGL ES rendering is complete _egl.eglWaitGL(); // Swap the window surface to the display _egl.eglSwapBuffers(_eglDisplay, _eglSurface); } private void render(GL10 gl) { // Set our GL viewport gl.glViewport(0, 0, getWidth(), getHeight()); // Clear the surface gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); net.rim.device.api.opengles.GLUtils.gluPerspective(gl, 45.0f, (float)getWidth()/(float)getHeight(), 0.15f, 100.0f); gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); // Setup drawing state gl.glEnable(GL10.GL_DEPTH_TEST); gl.glEnable(GL10.GL_LIGHTING); gl.glEnable(GL10.GL_LIGHT0); gl.glEnable(GL10.GL_COLOR_MATERIAL); // Draw our cube gl.glTranslatef(0, 0, -3.5f); gl.glRotatef(_angle, 1.0f, 1.0f, 0.0f); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_NORMAL_ARRAY); gl.glEnableClientState(GL10.GL_COLOR_ARRAY); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, _cubeVertices); gl.glNormalPointer(GL10.GL_FLOAT, 0, _cubeNormals); gl.glColorPointer(4, GL10.GL_FLOAT, 0, _cubeColors); gl.glDrawArrays(GL10.GL_TRIANGLES, 0, _vertexCount); } /** * Called by the UI system to paint the screen. */ protected void paint(Graphics g) { if (_offscreenBitmap != null)

Guía de desarrollo Código de ejemplo: representación de un triángulo 2D en varios colores

102

Page 105: Blackberry Java Application 5

g.drawBitmap(0, 0, _offscreenBitmap.getWidth(), _offscreenBitmap.getHeight(), _offscreenBitmap, 0, 0); } /** * Called when the visibility of our screen changes. * * @param visible true if our screen is being made visible, * false if it's being hidden */ protected void onVisibilityChange(boolean visible) { if (visible) { resume(); } else { pause(); } } /** * Called when the screen is closing. */ public void close() { _running = false; synchronized (this) { notifyAll(); } super.close(); } /** * Keeps the back buffer in sync with the screen size. */ private void updateBackBuffer() { if (_offscreenBitmap != null) { if (_offscreenBitmap.getWidth() == getWidth() && _offscreenBitmap.getHeight() == getHeight()) return; // no change needed } _offscreenBitmap = new Bitmap(getWidth(), getHeight()); _offscreenGraphics = Graphics.create(_offscreenBitmap); } private void pause() { _paused = true; } private void resume() { if (_running) { // Pause the render loop

Guía de desarrollo Código de ejemplo: representación de un triángulo 2D en varios colores

103

Page 106: Blackberry Java Application 5

_paused = false; synchronized (this) { notifyAll(); } } else { // Start the render thread. _running = true; new Thread(this).start(); } }}

Código de ejemplo: dibujo de un cubo en 3D

Puede utilizar la interfaz GL10 para dibujar un cubo en 3D.

import java.nio.ByteBuffer;import java.nio.FloatBuffer;import javax.microedition.khronos.egl.EGL10;import javax.microedition.khronos.egl.EGL11;import javax.microedition.khronos.egl.EGLConfig;import javax.microedition.khronos.egl.EGLContext;import javax.microedition.khronos.egl.EGLDisplay;import javax.microedition.khronos.egl.EGLSurface;import javax.microedition.khronos.opengles.GL10;import net.rim.device.api.system.Bitmap;import net.rim.device.api.ui.Graphics;import net.rim.device.api.ui.container.FullScreen;class ThreeDCube extends FullScreen implements Runnable{ private EGL11 _egl; private EGLDisplay _eglDisplay; private EGLConfig _eglConfig; private EGLSurface _eglSurface; private EGLContext _eglContext; private GL10 _gl; private Bitmap _offscreenBitmap; private Graphics _offscreenGraphics; private boolean _running; private boolean _paused; private FloatBuffer _cubeVertices, _cubeNormals, _cubeColors; float _angle = 45f; private int _vertexCount; private static final float[] _vertices = { // front -0.5f, 0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f,

Guía de desarrollo Código de ejemplo: dibujo de un cubo en 3D

104

Page 107: Blackberry Java Application 5

// right 0.5f, 0.5f, 0.5f, 0.5f, -0.5f, 0.5f, 0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, -0.5f, // back 0.5f, 0.5f, -0.5f, 0.5f, -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, // left -0.5f, 0.5f, -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, 0.5f, // top -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, 0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, // bottom -0.5f, -0.5f, 0.5f, -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, -0.5f }; private static final float[] _normals = { /* front */ 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, /* right */ 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, /* back */ 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, /* left */ -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, /* top */ 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, /* bottom */ 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0 }; private static final float[] _colors = { /* front – white */ 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, /* right – red */ 1,0,0,1, 1,0,0,1, 1,0,0,1, 1,0,0,1, 1,0,0,1, 1,0,0,1, /* back – green */ 0,1,0,1, 0,1,0,1, 0,1,0,1, 0,1,0,1, 0,1,0,1, 0,1,0,1, /* left – blue */ 0,0,1,1, 0,0,1,1, 0,0,1,1, 0,0,1,1, 0,0,1,1, 0,0,1,1, /* top - yellow */ 1,1,0,1, 1,1,0,1, 1,1,0,1, 1,1,0,1, 1,1,0,1, 1,1,0,1, /* bottom - magenta*/ 1,0,1,1, 1,0,1,1, 1,0,1,1, 1,0,1,1, 1,0,1,1, 1,0,1,1 }; ThreeDCube() { super(FullScreen.DEFAULT_MENU | FullScreen.DEFAULT_CLOSE); } private void initialize() { // Get EGL interface _egl = (EGL11)EGLContext.getEGL(); // Get the EGL display _eglDisplay = _egl.eglGetDisplay(EGL11.EGL_DEFAULT_DISPLAY); // Initialize the display for EGL, null since we don't really need the// version. _egl.eglInitialize(_eglDisplay, null); // Choose an EGL config

Guía de desarrollo Código de ejemplo: dibujo de un cubo en 3D

105

Page 108: Blackberry Java Application 5

EGLConfig[] configs = new EGLConfig[1]; int[] numConfigs = new int[1]; int[] attrs = { EGL11.EGL_RED_SIZE, 5, EGL11.EGL_GREEN_SIZE, 6, EGL11.EGL_BLUE_SIZE, 5, EGL11.EGL_NONE }; _egl.eglChooseConfig(_eglDisplay, attrs, configs, 1, numConfigs); _eglConfig = configs[0]; // Create an EGL window surface _eglSurface = _egl.eglCreateWindowSurface (_eglDisplay, _eglConfig, this, null); // Create an EGL context createEGLContext(); _cubeVertices = createVertexBuffer(); _cubeNormals = createNormalBuffer(); _cubeColors = createColorBuffer(); _vertexCount = _vertices.length / 3; } private FloatBuffer createVertexBuffer() { FloatBuffer buffer = ByteBuffer.allocateDirect(_vertices.length * 4).asFloatBuffer(); buffer.put(_vertices); buffer.rewind(); return buffer; } private FloatBuffer createNormalBuffer() { FloatBuffer buffer = ByteBuffer.allocateDirect(_normals.length * 4).asFloatBuffer(); buffer.put(_normals); buffer.rewind(); return buffer; } private FloatBuffer createColorBuffer() { FloatBuffer buffer = ByteBuffer.allocateDirect(_colors.length * 4).asFloatBuffer(); buffer.put(_colors); buffer.rewind(); return buffer; } private void createEGLContext() { // Create an EGL context _eglContext = _egl.eglCreateContext (_eglDisplay, _eglConfig, EGL10.EGL_NO_CONTEXT, null); // Get the GL interface for our new context _gl = (GL10)_eglContext.getGL();

Guía de desarrollo Código de ejemplo: dibujo de un cubo en 3D

106

Page 109: Blackberry Java Application 5

// Make our new context current _egl.eglMakeCurrent (_eglDisplay, _eglSurface, _eglSurface, _eglContext); } private void destroyEGL() { _egl.eglMakeCurrent(_eglDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT); _egl.eglDestroyContext(_eglDisplay, _eglContext); _egl.eglDestroySurface(_eglDisplay, _eglSurface); } private void handleContextLost() { // Destroy our EGL context _egl.eglMakeCurrent(_eglDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT); _egl.eglDestroyContext(_eglDisplay, _eglContext); _eglContext = EGL10.EGL_NO_CONTEXT; // Re-create our EGL context createEGLContext(); } /** * Main render loop. */ public void run() { initialize(); int throttle = 0; while (_running) { throttle = (int)System.currentTimeMillis(); // Idle If we are in the background if (_paused) { synchronized (this) { try { wait(); } catch (InterruptedException x) { } } } updateBackBuffer(); renderFrame(); ++_angle; if (_angle >= 360f) { _angle = 0f; } //Determine how long the frame took to render. throttle = (int)System.currentTimeMillis() - throttle;

Guía de desarrollo Código de ejemplo: dibujo de un cubo en 3D

107

Page 110: Blackberry Java Application 5

//Throttle to 30 FPS to control CPU usage. throttle = 33 - throttle; if (throttle > 0) { // Throttle cpu usage try { Thread.sleep(throttle); } catch (InterruptedException x) { } } } destroyEGL(); } private void renderFrame() { // Make our context and surface current and check for EGL_CONTEXT_LOST if (!_egl.eglMakeCurrent(_eglDisplay, _eglSurface, _eglSurface, _eglContext)) { if (_egl.eglGetError() == EGL11.EGL_CONTEXT_LOST) handleContextLost(); } // Signal that we are about to begin OpenGL rendering _egl.eglWaitNative(EGL10.EGL_CORE_NATIVE_ENGINE, _offscreenGraphics); render(_gl); // Signal that OpenGL ES rendering is complete _egl.eglWaitGL(); // Swap the window surface to the display _egl.eglSwapBuffers(_eglDisplay, _eglSurface); } private void render(GL10 gl) { // Set our GL viewport gl.glViewport(0, 0, getWidth(), getHeight()); // Clear the surface gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); net.rim.device.api.opengles.GLUtils.gluPerspective(gl, 45.0f, (float)getWidth()/(float)getHeight(), 0.15f, 100.0f); gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); // Setup drawing state gl.glEnable(GL10.GL_DEPTH_TEST); gl.glEnable(GL10.GL_LIGHTING); gl.glEnable(GL10.GL_LIGHT0); gl.glEnable(GL10.GL_COLOR_MATERIAL); // Draw our cube gl.glTranslatef(0, 0, -3.5f); gl.glRotatef(_angle, 1.0f, 1.0f, 0.0f); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

Guía de desarrollo Código de ejemplo: dibujo de un cubo en 3D

108

Page 111: Blackberry Java Application 5

gl.glEnableClientState(GL10.GL_NORMAL_ARRAY); gl.glEnableClientState(GL10.GL_COLOR_ARRAY); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, _cubeVertices); gl.glNormalPointer(GL10.GL_FLOAT, 0, _cubeNormals); gl.glColorPointer(4, GL10.GL_FLOAT, 0, _cubeColors); gl.glDrawArrays(GL10.GL_TRIANGLES, 0, _vertexCount); } /** * Called by the UI system to paint the screen. */ protected void paint(Graphics g) { if (_offscreenBitmap != null) g.drawBitmap(0, 0, _offscreenBitmap.getWidth(), _offscreenBitmap.getHeight(), _offscreenBitmap, 0, 0); } /** * Called when the visibility of our screen changes. * * @param visible true if our screen is being made visible, * false if it's being hidden */ protected void onVisibilityChange(boolean visible) { if (visible) { resume(); } else { pause(); } } /** * Called when the screen is closing. */ public void close() { _running = false; synchronized (this) { notifyAll(); } super.close(); } /** * Keeps the back buffer in sync with the screen size. */ private void updateBackBuffer() { if (_offscreenBitmap != null) { if (_offscreenBitmap.getWidth() == getWidth() && _offscreenBitmap.getHeight() == getHeight()) return; // no change needed

Guía de desarrollo Código de ejemplo: dibujo de un cubo en 3D

109

Page 112: Blackberry Java Application 5

} _offscreenBitmap = new Bitmap(getWidth(), getHeight()); _offscreenGraphics = Graphics.create(_offscreenBitmap); } private void pause() { _paused = true; } private void resume() { if (_running) { // Pause the render loop _paused = false; synchronized (this) { notifyAll(); } } else { // Start the render thread. _running = true; new Thread(this).start(); } }}

Utilidades de matemáticas 3DPuede utilizar los métodos proporcionados en el paquete net.rim.device.api.math para mejorar la versatilidadmatemática y la velocidad de procesamiento de las aplicaciones del dispositivo BlackBerry® que haya creado.

Código de ejemplo: uso de aritmética de punto fijo

La clase math.Fixed32 es una recopilación de métodos aritméticos de punto fijo que utiliza la convención 16.16 para corregirel punto decimal. Esta convención designa los 16 bits más significativos del valor int de 32 bits como el componente de puntofijo del valor y el resto como el componente decimal

El siguiente código de ejemplo muestra cómo se puede y no se puede utilizar la clase Fixed32 para la suma, resta, multiplicación,división, conversión del valor y trigonometría.

import net.rim.device.api.math.*;public class demoFixed32{ demoFixed32() { // convert an integer to fixed-point int n = Fixed32.toFP(7); // 7.0

Guía de desarrollo Utilidades de matemáticas 3D

110

Page 113: Blackberry Java Application 5

// convert a quantity in ten-thousandths to fixed-point int m = Fixed32.tenThouToFP(70625); // 7.0625 // convert from fixed-point, truncate fractional component int trunc = Fixed32.toInt(m); // 7 // multiply by ten thousand int mult = Fixed32.toIntTenThou(m); // 70625 // add, subtract, negate, and compare int result = m - n; // 7.0625 - 7.0 == 0.0625 result = -result; // -0.0625 result -= n; // -0.0625 - 7.0 == -7.0625 boolean b = (result == -m); // true boolean bb = (m < n); // false // do not use increment and decrement operators result = Fixed32.toFP(2); ++result; // WRONG! result will NOT be 3 result = Fixed32.toFP(2); result += Fixed32.toFP(1); // Correct: result will be 3 // Use * and / when multiplying or dividing by an integer scalar // Use mul to multiply 2 fixed-point numbers // Use div to divide 2 fixed-point numbers m = Fixed32.tenThouToFP(12500); // 1.25 m *= 3; // OK: 1.25 * 3 == 3.75 m /= 2; // OK: 3.75 / 2 == 1.875 m = Fixed32.mul(m, Fixed32.tenThouToFP(15000)); // 1.875 * 1.5000 == 2.8125 m = Fixed32.div(m, m); // 2.8125 / 2.8125 == 1.0 // mul, div, sqrt, sind, cosd, tand, and atand2 // all work with 16.16 fixed-point numbers m = Fixed32.tenThouToFP(172500); // 17.2500 n = Fixed32.sqrt(m); // sqrt(17.25) n = Fixed32.sind(m); // sine of 17.25 degrees n = Fixed32.cosd(m); // cosine of 17.25 degrees result = Fixed32.atand2(-m, -m); // -135.0 degrees in fixed-point }}

Guía de desarrollo Utilidades de matemáticas 3D

111

Page 114: Blackberry Java Application 5

Glosario 9

APIApplication Programming Interface (Interfaz de programación de aplicaciones)

CLDCConnected Limited Device Configuration (Configuración de dispositivos con conexión limitada)

EVDOEvolution Data Optimized (Datos de evolución optimizada)

GSMGlobal System for Mobile communications® (Sistema global para comunicaciones móviles)

HTTPHypertext Transfer Protocol (Protocolo de transferencia de hipertexto)

HTTPSHypertext Transfer Protocol over Secure Sockets Layer (Protocolo de transferencia de hipertexto a través de un nivel desocket seguro)

E/Sentrada/salida

JSRJava® Specification Request

JVMJava® Virtual Machine

MIDPMobile Information Device Profile (Perfil de dispositivo móvil de información)

PCMpulse code modulation (modulación de código de pulso)

RAPCRIM Application Program Compiler (Compilador de programas de aplicaciones de RIM)

RMSSistema de administración de registros (Record Management System)

RTSP

Guía de desarrollo Glosario

112

Page 115: Blackberry Java Application 5

Real Time Streaming Protocol (Protocolo de streaming en tiempo real)

SVGScalable Vector Graphics (Gráficos vectoriales escalables)

TCPTransmission Control Protocol (Protocolo de control de transmisión)

TLSTransport Layer Security (Seguridad de capa de transporte)

Guía de desarrollo Glosario

113

Page 116: Blackberry Java Application 5

Comentarios 10

Para ofrecer comentarios acerca de este documento, visite www.blackberry.com/docsfeedback.

Guía de desarrollo Comentarios

114

Page 117: Blackberry Java Application 5

Historial de revisión del documento 11

Fecha Descripción

14 de agosto de 2009 Se añadieron los temas siguientes:

• Visualización de una imagen acercándola, alejándola y desplazándola

• Mostrar una imagen acercándola, alejándola y desplazándola

• Código de ejemplo: visualización de una imagen acercándola, alejándola y

desplazándola

• Visualización de una fila de imágenes para realizar desplazamientos

• Mostrar una fila de imágenes para realizar desplazamientos

• Código de ejemplo: visualización de una fila de imágenes para realizar

desplazamientos

Guía de desarrollo Historial de revisión del documento

115

Page 118: Blackberry Java Application 5

Aviso legal 12

©2010 Research In Motion Limited. Todos los derechos reservados. BlackBerry®, RIM®, Research In Motion®, SureType®,SurePress™ y las marcas comerciales, nombres y logotipos relacionados son propiedad de Research In Motion Limited y estánregistrados y/o se utilizan en EE.UU. y en diferentes países del mundo.

Bluetooth es una marca comercial de Bluetooth SIG. Java y Javadoc son marcas comerciales de Sun Microsystems, Inc. Plazmices una marca comercial de Plazmic Inc. Todas las demás marcas comerciales son propiedad de sus respectivos propietarios.

Esta documentación, incluida cualquier documentación que se incorpore mediante referencia como documento proporcionadoo disponible en www.blackberry.com/go/docs, se proporciona o se pone a disposición "TAL CUAL" y "SEGÚN SUDISPONIBILIDAD" sin ninguna condición, responsabilidad o garantía de ningún tipo por Research In Motion Limited y susempresas afiliadas ("RIM") y RIM no asume ninguna responsabilidad por los errores tipográficos, técnicos o cualquier otraimprecisión, error u omisión contenidos en esta documentación. Con el fin de proteger la información confidencial y propia deRIM, así como los secretos comerciales, la presente documentación describe algunos aspectos de la tecnología de RIM en líneasgenerales. RIM se reserva el derecho a modificar periódicamente la información que contiene esta documentación, si bien tampocose compromete en modo alguno a proporcionar cambios, actualizaciones, ampliaciones o cualquier otro tipo de información quese pueda agregar a esta documentación.

Esta documentación puede contener referencias a fuentes de información, hardware o software, productos o servicios, incluidoscomponentes y contenido como, por ejemplo, el contenido protegido por copyright y/o sitios Web de terceros (conjuntamente,los "Productos y servicios de terceros"). RIM no controla ni es responsable de ningún tipo de Productos y servicios de terceros,incluido, sin restricciones, el contenido, la exactitud, el cumplimiento de copyright, la compatibilidad, el rendimiento, la honradez,la legalidad, la decencia, los vínculos o cualquier otro aspecto de los Productos y servicios de terceros. La inclusión de unareferencia a los Productos y servicios de terceros en esta documentación no implica que RIM se haga responsable de dichosProductos y servicios de terceros o de dichos terceros en modo alguno.

EXCEPTO EN LA MEDIDA EN QUE LO PROHÍBA ESPECÍFICAMENTE LA LEY DE SU JURISDICCIÓN, QUEDAN EXCLUIDAS PORLA PRESENTE TODAS LAS CONDICIONES, APROBACIONES O GARANTÍAS DE CUALQUIER TIPO, EXPLÍCITAS O IMPLÍCITAS,INCLUIDA, SIN NINGÚN TIPO DE LIMITACIÓN, CUALQUIER CONDICIÓN, APROBACIÓN, GARANTÍA, DECLARACIÓN DEGARANTÍA DE DURABILIDAD, IDONEIDAD PARA UN FIN O USO DETERMINADO, COMERCIABILIDAD, CALIDAD COMERCIAL,ESTADO DE NO INFRACCIÓN, CALIDAD SATISFACTORIA O TITULARIDAD, O QUE SE DERIVE DE UNA LEY O COSTUMBREO UN CURSO DE LAS NEGOCIACIONES O USO DEL COMERCIO, O RELACIONADO CON LA DOCUMENTACIÓN O SU USOO RENDIMIENTO O NO RENDIMIENTO DE CUALQUIER SOFTWARE, HARDWARE, SERVICIO O CUALQUIER PRODUCTO OSERVICIO DE TERCEROS MENCIONADOS AQUÍ. TAMBIÉN PODRÍA TENER OTROS DERECHOS QUE VARÍAN SEGÚN ELESTADO O PROVINCIA. ES POSIBLE QUE ALGUNAS JURISDICCIONES NO PERMITAN LA EXCLUSIÓN O LA LIMITACIÓN DEGARANTÍAS IMPLÍCITAS Y CONDICIONES. EN LA MEDIDA EN QUE LO PERMITA LA LEY, CUALQUIER GARANTÍA IMPLÍCITAO CONDICIONES EN RELACIÓN CON LA DOCUMENTACIÓN NO SE PUEDEN EXCLUIR TAL Y COMO SE HA EXPUESTOANTERIORMENTE, PERO PUEDEN SER LIMITADAS, Y POR LA PRESENTE ESTÁN LIMITADAS A NOVENTA (90) DÍAS DESDEDE LA FECHA QUE ADQUIRIÓ LA DOCUMENTACIÓN O EL ELEMENTO QUE ES SUJETO DE LA RECLAMACIÓN.

EN LA MEDIDA MÁXIMA EN QUE LO PERMITA LA LEY DE SU JURISDICCIÓN, EN NINGÚN CASO RIM ASUMIRÁRESPONSABILIDAD ALGUNA POR CUALQUIER TIPO DE DAÑOS RELACIONADOS CON ESTA DOCUMENTACIÓN O SU USO,O RENDIMIENTO O NO RENDIMIENTO DE CUALQUIER SOFTWARE, HARDWARE, SERVICIO O PRODUCTOS Y SERVICIOS

Guía de desarrollo Aviso legal

116

Page 119: Blackberry Java Application 5

DE TERCEROS AQUÍ MENCIONADOS INCLUIDOS SIN NINGÚN TIPO DE LIMITACIÓN CUALQUIERA DE LOS SIGUIENTESDAÑOS: DIRECTOS, RESULTANTES, EJEMPLARES, INCIDENTALES, INDIRECTOS, ESPECIALES, PUNITIVOS O AGRAVADOS,DAÑOS POR PÉRDIDA DE BENEFICIOS O INGRESOS, IMPOSIBILIDAD DE CONSEGUIR LOS AHORROS ESPERADOS,INTERRUPCIÓN DE LA ACTIVIDAD COMERCIAL, PÉRDIDA DE INFORMACIÓN COMERCIAL, PÉRDIDA DE LA OPORTUNIDADDE NEGOCIO O CORRUPCIÓN O PÉRDIDA DE DATOS, IMPOSIBILIDAD DE TRANSMITIR O RECIBIR CUALQUIER DATO,PROBLEMAS ASOCIADOS CON CUALQUIER APLICACIÓN QUE SE UTILICE JUNTO CON PRODUCTOS Y SERVICIOS DE RIM,COSTES DEBIDOS AL TIEMPO DE INACTIVIDAD, PÉRDIDA DE USO DE LOS PRODUCTOS Y SERVICIOS DE RIM O PARTE DEÉL O DE CUALQUIER SERVICIO DE USO, COSTE DE SERVICIOS SUSTITUTIVOS, COSTES DE COBERTURA, INSTALACIONESO SERVICIOS, COSTE DEL CAPITAL O CUALQUIER OTRA PÉRDIDA MONETARIA SIMILAR, TANTO SI DICHOS DAÑOS SE HANPREVISTO O NO, Y AUNQUE SE HAYA AVISADO A RIM DE LA POSIBILIDAD DE DICHOS DAÑOS.

EN LA MEDIDA MÁXIMA EN QUE LO PERMITA LA LEY DE SU JURISDICCIÓN, RIM NO TENDRÁ NINGÚN OTRO TIPO DEOBLIGACIÓN O RESPONSABILIDAD CONTRACTUAL, EXTRACONTRACTUAL O CUALQUIER OTRA, INCLUIDA CUALQUIERRESPONSABILIDAD POR NEGLIGENCIA O RESPONSABILIDAD ESTRICTA.

LAS LIMITACIONES, EXCLUSIONES Y DESCARGOS DE RESPONSABILIDAD SE APLICARÁN: (A) INDEPENDIENTEMENTE DELA NATURALEZA DE LA CAUSA DE LA ACCIÓN, DEMANDA O ACCIÓN SUYA, INCLUIDA PERO NO LIMITADA ALINCUMPLIMIENTO DEL CONTRATO, NEGLIGENCIA, AGRAVIO, EXTRACONTRACTUAL, RESPONSABILIDAD ESTRICTA OCUALQUIER OTRA TEORÍA DEL DERECHO Y DEBERÁN SOBREVIVIR A UNO O MÁS INCUMPLIMIENTOS ESENCIALES O ALINCUMPLIMIENTO DEL PROPÓSITO ESENCIAL DE ESTE CONTRATO O CUALQUIER SOLUCIÓN CONTENIDA AQUÍ; Y (B) ARIM Y A SUS EMPRESAS AFILIADAS, SUS SUCESORES, CESIONARIOS, AGENTES, PROVEEDORES (INCLUIDOS LOSPROVEEDORES DE SERVICIOS DE USO), DISTRIBUIDORES AUTORIZADOS POR RIM (INCLUIDOS TAMBIÉN LOSPROVEEDORES DE SERVICIOS DE USO) Y SUS RESPECTIVOS DIRECTORES, EMPLEADOS Y CONTRATISTASINDEPENDIENTES.

ADEMÁS DE LAS LIMITACIONES Y EXCLUSIONES MENCIONADAS ANTERIORMENTE, EN NINGÚN CASO NINGÚNDIRECTOR, EMPLEADO, AGENTE, DISTRIBUIDOR, PROVEEDOR, CONTRATISTA INDEPENDIENTE DE RIM O CUALQUIERAFILIADO DE RIM ASUMIRÁ NINGUNA RESPONSABILIDAD DERIVADA DE O RELACIONADA CON LA DOCUMENTACIÓN.

Antes de instalar, usar o suscribirse a cualquiera de los Productos y servicios de terceros, es su responsabilidad asegurarse deque su proveedor de servicios de uso ofrezca compatibilidad con todas sus funciones. Puede que algunos proveedores de serviciosde uso no ofrezcan las funciones de exploración de Internet con una suscripción al servicio BlackBerry® Internet Service. Consultecon su proveedor de servicios acerca de la disponibilidad, arreglos de itinerancia, planes de servicio y funciones. La instalacióno el uso de los Productos y servicios de terceros con productos y servicios de RIM puede precisar la obtención de una o máspatentes, marcas comerciales, derechos de autor u otras licencias para evitar que se vulneren o violen derechos de terceros.Usted es el único responsable de determinar si desea utilizar Productos y servicios de terceros y si se necesita para ello cualquierotra licencia de terceros. En caso de necesitarlas, usted es el único responsable de su adquisición. No instale o utilice Productosy servicios de terceros hasta que se hayan adquirido todas las licencias necesarias. Cualquier tipo de Productos y servicios deterceros que se proporcione con los productos y servicios de RIM se le facilita para su comodidad "TAL CUAL" sin ningunacondición expresa e implícita, aprobación, garantía de cualquier tipo por RIM y RIM no sume ninguna responsabilidad en relacióncon ello. El uso de los Productos y servicios de terceros se regirá y estará sujeto a la aceptación de los términos de licenciasindependientes aplicables en este caso con terceros, excepto en los casos cubiertos expresamente por una licencia u otro acuerdocon RIM.

Algunas funciones mencionadas en esta documentación requieren una versión mínima del software de BlackBerry® EnterpriseServer, BlackBerry® Desktop Software y/o BlackBerry® Device Software.

Guía de desarrollo Aviso legal

117

Page 120: Blackberry Java Application 5

Los términos de uso de cualquier producto o servicio de RIM se presentan en una licencia independiente o en otro acuerdo conRIM que se aplica en este caso. NINGUNA PARTE DE LA PRESENTE DOCUMENTACIÓN ESTÁ PENSADA PARA PREVALECERSOBRE CUALQUIER ACUERDO EXPRESO POR ESCRITO O GARANTÍA PROPORCIONADA POR RIM PARA PARTES DECUALQUIER PRODUCTO O SERVICIO DE RIM QUE NO SEA ESTA DOCUMENTACIÓN.

Research In Motion Limited295 Phillip StreetWaterloo, ON N2L 3W8Canadá

Research In Motion UK Limited Centrum House 36 Station Road Egham, Surrey TW20 9LF Reino Unido

Publicado en Canadá

Guía de desarrollo Aviso legal

118