APIs Java ME recientemente desaprobados en el Motorola i876
El nuevo equipo Motorola i876 incluye varios cambios al entorno Java ME. Eso incluye algunas APIs que fueron desaprobadas y ya no serán incluidas por ser redundantes o porque existen APIs estándares Java (conocidos como JSRs) con más funcionalidad.
Las APIs eliminadas en el i876 son las siguientes:
| Antigua API | Nueva API |
|---|---|
| MidiPlayer API | JSR 135 - Mobile Media API |
| VoiceNotes | JSR 135 - Mobile Media API |
| Crypto API | JSR 77 - Security and Trust Services API (SATSA) |
| Lightweight Windowing Toolkit (LWT) | No reemplazado |
| Math | CLDC 1.1 |
| 3D API | JSR 184 - Mobile 3d Graphics API for J2ME |
| File I/O | JSR 75 - PDA Optional Packages for the J2ME Platform |
| DateBook API | JSR 75 - PDA Optional Packages for the J2ME Platform |
| PhoneBook API | JSR 75 - PDA Optional Packages for the J2ME Platform |
Si sus aplicaciones existentes usan algunas de esas APIs, tendrá que hacerles algunas modificaciones. A continuación les ofrecemos algunas recomendaciones sobre cómo adecuar sus aplicaciones para que funcionen.
MidiPlayer API
El paquete com.motorola.midi ha sido eliminado por completo y se reemplaza con el JSR 135 Mobile Media API, que es el estándar para multimedios in Java ME. Esto permite mayor portabilidad del código a diferentes equipos y la utilización del mismo código para reproducir audio en formatos MIDI, WAV, MP3 y otros con mucha más funcionalidad.
VoiceNotes API
El paquete com.mot.iden.voicenote ha sido eliminado por completo y se reemplaza con el JSR 135 Mobile Media API, que es el estándar para multimedios in Java ME. Esto permite mayor portabilidad del código a diferentes equipos y la utilización del mismo código para grabar audio en varios formatos.
Para grabar con el JSR 135 usando los mismos formato VSELP, AMBE o AMR usados por el VoiceNotes API, basta pasar el url file:///./nombre.vnf en el parámetro pasado al Player.createPlayer()para grabar un archivo en formato Voice Notes (que por defecto es un archivo en formato AMBE grabado con un bitrate de 2400).
Crypto API
El paquete com.motorola.iden.crypto ha sido eliminado por completo y se reemplaza con el JSR 177 - Security and Trust Services API (SATSA). SATSA es el estándar en MIDP para el manejo de criptografía, y ofrece una interfaz muchísimo más poderosa que el Crypto API para administrar encripción, seguridad, firmas digitales, y demás.
Lightweight Windowing Toolkit (LWT)
El Lightweight Windowing Toolkit (LWT) que se incluía en los equipos para ofrecer funcionalidades de GUI más avanzadas en equipos MIDP 1.0 se elimina por completo. La metodología en MIDP 2.0 de manejo de formularios y/o manejo de canvases ofrece funcionalidad equivalente sin introducir fragmentación.
Math API
El paquete com.mot.iden.math se introdujo en los equipos MIDP 1.0 de hace varios años para permitir cálculos de punto flotante. Desde la introducción de CLDC 1.1 hace varios años, esta funcionalidad se vuelve redundante, y por lo tanto se elimina por completo ese paquete en el i876.
3D API
El paquete com.motorola.iden.micro3d se elimina y se reemplaza con JSR 184 Mobile 3D Graphics API. Este API está disponible en todos los equipos iDEN con pantalla grande, y en los equipos i290 e i335.
File I/O
El cambio de File I/O a el uso de JSR 75 es el de más impacto, pues afecta a todas las aplicaciones que guardan datos en el equipo usando archivos (en vez de RMS).
Modo antiguo:
(StreamConnection) Connector.open("file://archivo");
//para guardar un archivo seguro
(StreamConnection) Connector.open("sfile://archivo;PASSWORD=1234");
Modo nuevo:
(FileConnection) Connector.open("file:///./archivo");
//para guardar un archivo seguro en la memoria del equipo
(FileConnection) Connector.open("sfile:///./archivo;PASSWORD=1234);
//para guardar un archivo en la tarjeta de memoria MicroSD
(FileConnection) Connector.open("file:///Storage Card/archivo");
//para guardar un archivo seguro en la tarjeta de memoria MicroSD
(FileConnection) Connector.open("sfile:///Storage Card/archivo;PASSWORD=1234");
DateBook y PhoneBook API
El paquete com.motorola.iden.udm.* ha sido eliminado por completo y se reemplaza con el API PIM estándar, lo que permite mayor portabilidad del código a diferentes equipos.
Modo antiguo para uso de calendario:
{
/* Abrir un calendario para ver o modificar. */
calendars = UDM.openDateBook(UDM.READ_WRITE);
Enumeration e;
for ( e = calendars.elements(); e.hasMoreElements(); )
{
dateEvent = (DateBookEvent)e.nextElement();
int[] type;
type = dateEvent.getFields();
/* Obtener detalles del evento. */
StringItem userName = new StringItem("subject",
dateEvent.getString(DateBookEvent.SUMMARY));
}
/* Crear un evento */
long currentTime = 0;
dateEvent = calendars.createDateBookEvent();
dateEvent.setString(DateBookEvent.SUMMARY,
"Non-Repeat Event");
currentTime = System.currentTimeMillis()+ 60*60000;
dateEvent.setDate(DateBookEvent.START, currentTime);
dateEvent.setDate(DateBookEvent.END, currentTime + 600000);
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
Métodología nueva para usar el calendario:
/* Abrir un calendario para ver o modificar. */
EventList listaDeEventos =
(EventList)PIM.getInstance().openPIMList(PIM.EVENT_LIST, PIM.READ_WRITE);
Enumeration e = listaDeEventos.items();
// Leer todos los campos de un evento y agregar el resumen si éste existe
while (e.hasMoreElements() );
{
Event evento = (Event)e.nextElement();
campos[] = evento.getFields()
StringBuffer valores = new StringBuffer();
for (int numeroCampo = 0; numeroCampo < campos.length; numeroCampo++) {
int dataType = listaDeEventos.getFieldDataType(campos[numeroCampo]); //revisamos el tipo que tiene el campo
int numIndices = listaDeEventos.countValues(campos[numeroCampo]); //cada campo puede tener más de un valor, representado por un índice
if (dataType == PIMItem.STRING) //caso que el campo contenga texto
{
for (int indice=0; indice < numIndices; indice++) {
valores.append(evento.getFieldLabel(campos[numeroCampo])).append(" ").append(numeroCampo).append(": ").append(evento.getString(campos[numeroCampo], indice);
}
}
else if (dataType == PIMItem.DATE) //caso que el campo contenga una fecha
{
for (int indice=0; indice < numIndices; indice++) {
Date fecha = new Date(evento.getDate(campos[numeroCampo], indice));
valores.append(evento.getFieldLabel(campos[numeroCampo])).append(" ").append(numeroCampo).append(": ").append(fecha);
}
}
else if (dataType == PIMItem.INT) //caso que el campo contenga un valor numérico
{
for (int indice=0; indice < numIndices; indice++) {
valores.append(evento.getFieldLabel(campos[numeroCampo])).append(" ").append(numeroCampo).append(": ").append(evento.getInt(campos[numeroCampo], indice);
}
}
else if (dataType == PIMItem.BOOLEAN) //caso que el campo contenga un valor lógico
{
for (int indice=0; indice < numIndices; indice++) {
valores.append(evento.getFieldLabel(campos[numeroCampo])).append(" ").append(numeroCampo).append(": ").append(evento.getBoolean(campos[numeroCampo], indice);
}
}
//modificar el primer valor del campo de resumen. Es necesario revisar si el campo que se quiere modifricar existe,
//pues no todas las implementaciones de este JSR incluyen todos los campos
if (listaDeEventos.isSupportedField(Event.SUMMARY)) {
evento.setString(Event.SUMMARY,0,Event.ATTR_NONE,"Modificado durante la pasada #" + numeroCampo);
Date ahora = new Date();
evento.setDate(Event.REVISION,0,Event.ATTR_NONE,ahora.getTime()); //para indicar que se modificó el Evento
}
evento.commit(); //para guardar el valor en memoria persistente
}
}
//crear un nuevo evento de una hora para el 20 de octubre del 2008 a las 13h locales con personal de mantenimiento
//con una notificación con 30 minutos de anterioridad
Event eventoNuevo = listaDeEventos.createEvent();
/* es necesario revisar que el campo que se pide existe, pues no es seguro que un campo en particular
* exista en alguna implementación particular de esta JSR. Los campos que existen para Event en equipos Motorola
* son los siguientes:
* LOCATION (PIMItem.STRING) = lugar del evento
* NOTE (PIMItem.STRING)= notas o comentarios
* SUMMARY (PIMItem.STRING) = resumen del evento
* UID (PIMItem.STRING) = número único del evento
* END (PIMItem.DATE) = fecha y hora de fin
* START (PIMItem.DATE) = fecha y hora de inicio
* REVISION (PIMItem.DATE) = fecha y hora de la última modificación (útil para sincronizar con otro calendario en caso necesario)
* ALARM (PIMItem.INT) = número de segundos antes de la fecha de inicio donde se debe generar una alarma
* CLASS (PIMItem.INT) = puede ser Event.CLASS_PUBLIC, Event.CLASS_PRIVATE, o Event.CLASS_CONFIDENTIAL)
*/
Calendar horario = Calendar.getInstance();
horario.set( Calendar.MONTH, Calendar.OCTOBER );
horario.set( Calendar.DAY_OF_MONTH, 20 );
horario.set( Calendar.YEAR, 2008 );
horario.set( Calendar.HOUR_OF_DAY, 13 );
horario.set( Calendar.MINUTE, 00 );
horario.set( Calendar.SECOND, 00 );
horario.set( Calendar.MILLISECOND, 0 );
Date horaInicio = horario.getTime();
horario.set( Calendar.MONTH, Calendar.OCTOBER );
horario.set( Calendar.DAY_OF_MONTH, 20 );
horario.set( Calendar.YEAR, 2008 );
horario.set( Calendar.HOUR_OF_DAY, 14 );
horario.set( Calendar.MINUTE, 00 );
horario.set( Calendar.SECOND, 00 );
horario.set( Calendar.MILLISECOND, 0 );
Date horaFin = horario.getTime();
Date horaRevision = new Date();
if (listaDeEventos.isSupportedField(Event.SUMMARY))
eventoNuevo.addString(Event.SUMMARY, PIMItem.ATTR_NONE, "Reunión con mantenimiento");
if (listaDeEventos.isSupportedField(Event.START))
eventoNuevo.addDate(Event.START, PIMItem.ATTR_NONE, horaInicio.getTime());
if (listaDeEventos.isSupportedField(Event.END))
eventoNuevo.addDate(Event.END, PIMItem.ATTR_NONE, horaFin.getTime());
if (listaDeEventos.isSupportedField(Event.ALARM))
eventoNuevo.addInt(Event.ALARM, PIMItem.ATTR_NONE, horaInicio.getTime() - (30 * 60)); //30 intervalos de 60 segundos
if (listaDeEventos.isSupportedField(Event.NOTE))
eventoNuevo.addString(Event.NOTE, PIMItem.ATTR_NONE, "Convocada por Carlos");
if (listaDeEventos.isSupportedField(Event.REVISION))
eventoNuevo.addString(Event.REVISION, PIMItem.ATTR_NONE, horaRevision.getTime());
eventoNuevo.commit();
}
catch (UnsupportedFieldException e) {
//este no debería ocurrir si usamos isSupportedField() antes de modificar o agregar campos, pero vale la pena usarlo
...
}
catch (FieldFullException e) {
//se genera cuando ya no hay más lugar para agregar índices adicionales al campo
...
}
catch (FieldEmptyException e){
//se genera al dar acceso a un campo que no tiene datos asignados
}
catch (PIMException e){
//Cualquier error dentro de las clases del paquete PIM.
/*la razón del error puede ser una de varias:
*
* PIMException.FEATURE_NOT_SUPPORTED -- la funcionalidad no existe en la implementación del JSR
* PIMException.GENERAL_ERROR -- un error genérico
* PIMException.LIST_CLOSED -- se intentó accesar un EventList, ContactList, ToDoList o PIMList cuando éste estaba cerrado
* PIMException.LIST_NOT_ACCESSIBLE -- el EventList, ContactList, ToDoList o PIMLIst no están disponibles (por ejemplo, si se borró la base de
* datos correspondiente)
* PIMException.MAX_CATEGORIES_EXCEEDED -- se intentó agregar una categoría más de las que se pueden agregar
* PIMException.UNSUPPORTED_VERSION -- los datos están guardados en una version del PIM que no tiene soporte en la plataforma
* PIMException.UPDATE_ERROR -- no se pudo actualizar la información
*/
int i = e.getReason();
}
La metodología para la modificación del acceso a la lista de contactos es similar.
- Inicie sesión o regístrese para enviar comentarios
- 5817 lecturas
