Usando a PIM API para acessar listas do Mobile

11 setembro 2009

Como já vimos em posts anteriores, a JSR 75 especifica dois pacotes obrigatórios para a plataforma Java ME.
Um deles é o PIM - Pacote que permite desenvolvedores realizar CRUD (criar, recuperar, atualizar e excluir), acessando os dados de PIM do aparelho, tais como agenda, livro de endereços e listas de tarefas, que existe na maioria dos dispositivos móveis.
É importante saber que nem todos os dispositivos suportam a PIM API e que alguns podem ter mais de um banco de dados pessoal.

Os objetivos principais deste pacote opcional são:

-Proporcionar o acesso aos dados pessoais em formatos nativos, o que poderá residir no dispositivo, em mídia removível, ou em algum lugar sobre a rede;
-Suporte à importação e exportação de endereços do catálogo em formato vCard e agenda, e fazer cadastros em formato vCalendar;
-Não impõe campos ou atributos obrigatórios;
-Garantir a segurança na utilização destas APIs.

O pacote opcional PIM define três tipos de dados de PIM, conhecido como listas PIM:

-As listas de contatos, que contêm nomes, endereços, números de telefone e outras informações sobre negócios e contatos pessoais;
-Lista de eventos, compromissos, lembretes, data e outros itens específicos;
-Listas de tarefas, as tarefas que o usuário precisa realizar.

As APIs do PIM estão definidas no pacote javax.microedition.io.pim. Este pacote é composto por oito interfaces e seis classes, incluindo quatro tipos de exceção:

Descrição das Interfaces

-PIMItem: A superinterface comum de um item a ser armazenado em uma lista do PIM;
-PIMList: A superinterface comum de ContactList, EventList e ToDoList, cada um dos quais pode conter zero ou mais PIMItems;
-Contact: uma única entrada em um banco de contato, os campos estáticos nesta interface são um subconjunto dos campos definido pela especificação vCard;
-ContactList: Uma lista de itens de Contato;
-Event: Entrada única no banco de eventos;
-EventList: Uma lista de itens do evento;
-ToDo: Entrada única no banco de afazeres;
-ToDoList: Uma lista de itens para fazer.

Descrição das Classes

-PIM: Fornece um conjunto de métodos estáticos para encontrar informações e para acessar PIMLists;
-RepeatRule: A descrição de um padrão de repetição de um item do evento, para especificar quando o evento associado ocorrerá (os campos estáticos dessa classe são um subconjunto dos recursos do campo RRULE em VEVENT, definido pela especificação vCalendar 1.0);
-FieldEmptyException: acionada quando uma tentativa é feita para acessar um campo que não tem dados com valores a ele associados;
-FieldFullException: acionada quando uma tentativa é feita para adicionar dados a um campo cujos valor dos dados disponíveis já foram atribuídos;
-PIMException: geradas pelas classes PIM;
-UnsupportedException: Acionada quando o campo de referência não é suportado na lista PIM que um elemento pertence.

O pacote PIM poderá não estar disponíveil em todas as plataformas Java ME. Para saber se algum dispositivo implementa tal pacote opcional, chame o método System.getProperty(microedition.pim.version). O método irá retornar o número da versão da API se é suportado, ou nulo se não é.

Para exemplificar segue a implementação de duas classes:

PIMMidlet.java


import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class PIMMidlet extends MIDlet {
ReadPIM readPim;
Display display;

public void startApp(){
display = Display.getDisplay(this);
readPim = new ReadPIM(this);
display.setCurrent(readPim);
}

public void pauseApp(){
}

public void destroyApp(boolean uc){
}
}
ReadPIM.java

import javax.microedition.lcdui.*;
import javax.microedition.pim.*;
import java.util.*;

public class ReadPIM extends Form implements Runnable, CommandListener{
PIM pim;
PIMList pimlist;
Contact contact=null;
Enumeration enumeration;
PIMMidlet midlet;

String contactName="";
String contactNo="";

Thread thread=null;
Command exitCmd = new Command("Sair",Command.EXIT,1);

public ReadPIM(PIMMidlet midlet){
super("Lendo Contatos");
this.midlet = midlet;

pim = PIM.getInstance();

thread = new Thread(this);
thread.start();
addCommand(exitCmd);
setCommandListener(this);

}

public void run(){
readContacts();
}

public void readContacts(){

String[] lists = pim.listPIMLists(PIM.CONTACT_LIST);

for (int i = 0; i < pimlist =" pim.openPIMList(PIM.CONTACT_LIST,PIM.READ_WRITE);" enumeration =" pimlist.items();" contact =" (Contact)enumeration.nextElement();">0))
contactName = contact.getString(Contact.FORMATTED_NAME,0);

if(pimlist.isSupportedField(Contact.TEL) &&(contact.countValues(Contact.TEL) >0))
contactNo = contact.getString(contact.TEL,0)+"\n\n";
append("\nNome: "+contactName+"\nTelefone: "+contactNo);
}

}catch( Exception e){}
}
}

public void commandAction(Command c , Displayable d){
if(c == exitCmd){
midlet.destroyApp(true);
midlet.notifyDestroyed();
}
}
}
Referências
http://developers.sun.com/mobility/apis/articles/pim/index.html

5 comentários:

  • Unknown

    Utilizando a PIM API a sua aplicação pode explorar mais os recursos do dispositivo móvel. Se o dispositivo dê suporte a PIM API vale a pena utilizá-la.
    Essa dica para quem está iniciando é ótima dica.

  • Daniel

    Esse código da ReadPIM acredito que esteja faltando parte e/ou está com algum erro... não estou conseguindo rodá-lo

  • javamovel.com

    O código está correto Daniel, mas é preciso rodar no celular ;)

  • Daniel

    Olá, boa tarde.
    Sou novo no mundo do Java ME, mas tenho muito interesse em aprender e desenvolver algo para celulares que possuem a tecnologia Java, em especial e como modelo de testes, o meu Hiphone F030 que executa perfeitamente qualquer aplicação em Java com touchscreen.
    Instalei o NetBeans IDE 6.9.1 (já com o JDK atualizado) em meu PC e já consegui criar um projeto de iniciante como o 'Hello World', e instalar o .jar do mesmo neste celular citado acima. Show !
    Porém, na tentativa de fazer o mesmo com este exemplo do post (PIMMidlet e ReadPIM), pensando em acessar meus contatos, ao tentar 'construir o projeto' no NetBeans, erros são apontados na saída (build) do processo, solicitando a inclusão de ';' e/ou ')' na linha 39 do ReadPIM.java. O que aborta o processo da geração do .jar (compilado), o qual apenas ele seria possível executar em meu celular. Pode me ajudar com mais alguma dica ? Nao consigo executar/instalar o .java no celular. Obrigado pela atenção. Att. Daniel Corrêa - Bauru(SP) - danielcorrea76@gmail.com (MSN).

  • Daniel

    Olá novamente Rodolfo,

    Para complementar minhas dúvidas anteriores, implementei o exemplo abaixo e o mesmo retornou '1.0' como deveria:

    String v = System.getProperty("microedition.io.file.FileConnection.version");

    if( v != null ){
    System.out.println(v);
    } else {
    //FCOP não encontrada
    }

  • Postar um comentário