Sun SPOT

28 setembro 2009 0 comentários
Sun SPOT (Sun Small Programmable Object Technology) é um dispositivo de comunicação eletrônico, desenvolvido pela Sun, que utiliza redes sem fio para a comunicação. É baseado na máquina virtual Java ME e, totalmente montado, cabe na palma de uma mão.

O projeto Sun SPOT foi criado para encorajar o desenvolvimento de novas aplicações e dispositivos. Ele permite que desenvolvedores que nunca trabalharam com dispositivos embarcados pensem além do mouse e teclado e escrevam programas que interagem com outros dispositivos.

O Sun SPOT é muito mais que um microprocessador embarcado que roda Java. Ele abriga uma série de tecnologias necessárias para conectar objetos.

Estrutura do SPOT:

Placa Mãe
-> Micro controlador Atmel AT91RM9200 baseado no Processador ARM920T Core 32 bits, com 180 MHz, 512 KB RAM e 4MB de Flash;
-> Antena de rádio Integrada na placa, padrão IEEE 802.15.04 de 2.4 GHz (O rádio é um CC2420 TI);
-> Cada processador tem uma interface USB (que serve de alimentação para a bateria);
-> Há um micro controlador 8-bits ATmega88 Atmel usado como um controlador de potência.

Placa de Sensores
-> Acelerômetro 2G/6G 3-axis;
-> Sensor de Temperatura;
-> Sensor de Luz;
-> 8 LEDs tri-coloridos;
-> 6 entradas analógicas por ADC;
-> 2 sensores de movimento (switches);
-> 5 Pinos I/O de própósito geral e 4 pinos de alta corrente de saída;

Bateria
-> Bateria recarregável de lítio-ion de 3.6 V e 750 mAh;
-> Modo de inatividade (ou sleep) profundo a 48 uA;
-> Gerenciamento automático de bateria provido pelo software.

Sua máquina virtual baseada em Java ME chama-se Squawk e roda diretamente no processador, sem utilizar o sistema operacional. Esta VM executa plenamente códigos J2ME CLDC 1.1, diretamente na memória flash.

As ferramentas para desenvolvimento de aplicações são IDE’s padrão (Eclipse, NetBeans), acompanhadas de um plugin.

O Sun SPOT possui ainda um emulador no qual poderão ser testadas as aplicações que futuramente rodarão no dispositivo. Além de todas as funcionalidades do spot, destacamos o fato de poderem ser simulados vários spots na ferramenta.

O software é compatível com Windows XP, Mac OS X 10.4 e com as distribuições mais comuns do Linux.

Quanto a segurança, ele possui implementações altamente otimizadas dos algoritmos RSA e ECC (Criptografia de Curvas Elípticas).

Entre as vantagens de se utilizar o SPOT, estão:
- Totalmente baseado em Java, tornando fácil a programação e a integração em aplicações em rede;
- Diferentes aplicações podem ser executadas ao mesmo tempo sem precisar de várias máquinas virtuais;
- O desenvolvedor pode iniciar, parar ou executar aplicações a partir de um dispositivo para outro;
- Possui um consumo de energia muito baixo;
- Trabalha análogo ao Java em relação à coleta de lixo (garbage collection);
- É um dispositivo bastante poderoso com um processador de 32 bits com lotes de fácil acesso I/O para experimentação;

Entre as desvantagens estão:
- O preço, cerca de U$750,00.
- Dificuldade de obter o kit. Por enquanto não estão disponíveis para venda no Brasil. Porém através de universidades é possível conseguir alguns kits.

Veja alguns vídeos muito interessantes do uso de Sun SPOTS

SUN SPOT Game Controller for Counter Strike



Sun SPOT Telerobotics



Para quem estiver interessado em começar a brincar com o Sun SPOT veja os links:
- [Tutorial] Aprendendo a Mexer com o Sun SPOTS
- Iniciando SUN Spot com NetBeans 6.1

Referências
http://www.sunspotworld.com/
http://blogs.sun.com/cindydalfovo/entry/tutorial_aprendendo_a_mexer_com

Scrum

24 setembro 2009 0 comentários

Quando o assunto é gerenciamento de projetos, Scrum, trata-se de uma metodologia ágil, porém surgiu a partir de um jogo conhecido como Rugby. Neste jogo, o scrum é uma jogada que envolve oito jogadores de cada time, onde eles se "encaixam", para se tornar uma muralha. O grande ponto dessa jogada é a vital importância do trabalho em equipe. Se um membro falhar na formação, já era, o outro time se sobressai.

É justamente pela importância desse trabalho integrado do time, que esta palavra foi utilizada como nome da metodologia. O fundamental é o time trabalhar junto! As pessoas são importantes e é por isso que resultados fantásticos são alcançados com essa metodologia. A função primária do Scrum é ser utilizado para o gerenciamento de projetos de desenvolvimento de software. Ele tem sido usado com sucesso para isso, assim como Extreme Programming e outras metodologias de desenvolvimento.

No Scrum, os projetos são dividos em ciclos (tipicamente mensais) chamados de Sprints. O Sprint representa um Time Box dentro do qual um conjunto de atividades deve ser executado. Metodologias ágeis de desenvolvimento de software são iterativas, ou seja, o trabalho é dividido em iterações, que são chamadas de Sprints no caso do Scrum.

As funcionalidades a serem implementadas em um projeto são mantidas em uma lista que é conhecida como Product Backlog. No início de cada Sprint, faz-se um Sprint Planning Meeting, ou seja, uma reunião de planejamento na qual o Product Owner prioriza os itens do Product Backlog e a equipe seleciona as atividades que ela será capaz de implementar durante o Sprint que se inicia. As tarefas alocadas em um Sprint são transferidas do Product Backlog para o Sprint Backlog.

A cada dia de uma Sprint, a equipe faz uma breve reunião (normalmente de manhã), chamada Daily Scrum. O objetivo é disseminar conhecimento sobre o que foi feito no dia anterior, identificar impedimentos e priorizar o trabalho do dia que se inicia.

Ao final de um Sprint, a equipe apresenta as funcionalidades implementadas em uma Sprint Review Meeting. Finalmente, faz-se uma Sprint Retrospective e a equipe parte para o planejamento do próximo Sprint. Assim reinicia-se o ciclo.

Veja:


Um pouco mais de Scrum


1) Product Owner: É a pessoa que define os itens que compõem o Product Backlog e os prioriza nas Sprint Planning Meetings.

O Scrum Team olha para o Product Backlog priorizado, seleciona os itens mais prioritários e se compromete a entregá-los ao final de um Sprint (iteração). Estes itens transformam-se no Sprint Backlog.

A equipe se compromete a executar um conjunto de atividades no Sprint e o Product Owner se compromete a não trazer novos requisitos para a equipe durante o Sprint. Requisitos podem mudar (e mudanças são encorajadas), mas apenas fora do Sprint. Uma vez que a equipe comece a trabalhar em um Sprint, ela permanece concentrada no objetivo traçado para o Sprint e novos requisitos não são aceitos.

2) Sprint Planning Meeting: É uma reunião na qual estão presentes o Product Owner, o Scrum Master e todo o Scrum Team, bem como qualquer pessoa interessada que esteja representando a gerência ou o cliente.

Durante o Sprint Planning Meeting, o Product Owner descreve as funcionalidades de maior prioridade para a equipe. A equipe faz perguntas durante a reunião de modo que seja capaz de quebrar as funcionalidades em tarefas técnicas, após a reunião. Essas tarefas irão dar origem ao Sprint Backlog.

O Product Owner não precisa descrever todos os itens que estão no Product Backlog. Dependendo do tamanho do Product Backlog e da velocidade da equipe, pode ser suficiente descrever apenas os itens de maior prioridade, deixando a discussão dos itens de menor prioridade para o próximo Sprint Planning Meeting.

Coletivamente, o Scrum Team e o Product Owner definem um objetivo para o Sprint, que é uma breve descrição daquilo que se tentará alcançar no Sprint. O sucesso do Sprint será avaliado mais adiante no Sprint Review Meeting em relação ao objetivo traçado para o Sprint.

Depois do Sprint Planning Meeting, a equipe Scrum se encontra separadamente para conversar sobre o que eles escutaram e decidir quanto eles podem se comprometer a fazer no Sprint que será iniciado. Em alguns casos, haverá negociação com o Product Owner, mas será sempre responsabilidade da equipe determinar o quanto ela será capaz de se comprometer a fazer.

3) Product Backlog: É uma lista contendo todas as funcionalidades desejadas para um produto. O conteúdo desta lista é definido pelo Product Owner. O Product Backlog não precisa estar completo no início de um projeto. Pode-se começar com tudo aquilo que é mais óbvio em um primeiro momento. Com o tempo, o Product Backlog cresce e muda à medida que se aprende mais sobre o produto e seus usuários.

Durante o Sprint Planning Meeting, o Product Owner prioriza os itens do Product Backlog e os descreve para a equipe. A equipe então determina que itens será capaz de completar durante a Sprint que está por começar. Tais itens são, então, transferidos do Product Backlog para o Sprint Backlog. Ao fazer isso, a equipe quebra cada item do Product Backlog em uma ou mais tarefas do Sprint Backlog. Isso ajuda a dividir o trabalho entre os membros da equipe. Podem fazer parte do Product Backlog tarefas técnicas ou atividades diretamente relacionadas às funcionalidades solicitadas.

4) Sprint Backlog: É uma lista de tarefas que o Scrum Team se compromete a fazer em um Sprint. Os itens do Sprint Backlog são extraídos do Product Backlog, pela equipe, com base nas prioridades definidas pelo Product Owner e a percepção da equipe sobre o tempo que será necessário para completar as várias funcionalidades.

Cabe a equipe determinar a quantidade de itens do Product Backlog que serão trazidos para o Sprint Backlog, já que é ela quem irá se comprometer a implementá-los.

Durante um Sprint, o Scrum Master mantém o Sprint Backlog atualizando-o para refletir que tarefas são completadas e quanto tempo a equipe acredita que será necessário para completar aquelas que ainda não estão prontas. A estimativa do trabalho que ainda resta a ser feito no Sprint é calculada diariamente e colocada em um gráfico, resultando em um Sprint Burndown Chart.

5) A cada dia do Sprint a equipe faz uma reunião diária, chamada Daily Scrum. Ela tem como objetivo disseminar conhecimento sobre o que foi feito no dia anterior, identificar impedimentos e priorizar o trabalho a ser realizado no dia que se inicia.

Os Daily Scrums normalmente são realizadas no mesmo lugar, na mesma hora do dia. Idealmente são realizados na parte da manhã, para ajudar a estabelecer as prioridades do novo dia de trabalho.

Todos os membros da equipe devem participar do Daily Scrum. Outras pessoas também podem estar presentes, mas só poderão escutar. Isso torna os Daily Scrums uma excelente forma para uma equipe disseminar informações sobre o estado do projeto.

O Daily Scrum não deve ser usado como uma reunião para resolução de problemas. Questões levantadas devem ser levadas para fora da reunião e normalmente tratadas por um grupo menor de pessoas que tenham a ver diretamente com o problema ou possam contribuir para solucioná-lo. Durante o Daily Scrum, cada membro da equipe provê respostas para cada uma destas três perguntas:

* O que você fez ontem?
* O que você fará hoje?
* Há algum impedimento no seu caminho?

Concentrando-se no que cada pessoa fez ontem e no que ela irá fazer hoje, a equipe ganha uma excelente compreensão sobre que trabalho foi feito e que trabalho ainda precisa ser feito. O Daily Scrum não é uma reunião de status report na qual um chefe fica coletando informações sobre quem está atrasado. Ao invés disso, é uma reunião na qual membros da equipe assumem compromissos perante os demais.

Os impedimentos identificados no Daily Scrum devem ser tratados pelo Scrum Master o mais rapidamente possível.

6) Sprint Review Meeting: Feito ao final de cada Sprint, nesta reunião, o Scrum Team mostra o que foi alcançado durante o Sprint. Tipicamente, isso tem o formato de um demo das novas funcionalidades.

Os participantes do Sprint Review tipicamente incluem o Product Owner, o Scrum Team, o Scrum Master, gerência, clientes e engenheiros de outros projetos.

Durante o Sprint Review, o projeto é avaliado em relação aos objetivos do Sprint, determinados durante o Sprint Planning Meeting. Idealmente, a equipe completou cada um dos itens do Product Backlog trazidos para fazer parte do Sprint, mas o importante mesmo é que a equipe atinja o objetivo geral do Sprint.

7) Sprint Retrospective: Ocorre ao final de um Sprint e serve para identificar o que funcionou bem, o que pode ser melhorado e que ações serão tomadas para melhorar.


8) Quem usa Scrum?

- Google
- Microsoft
- Yahoo
- Nokia
- Siemens
- UOL
- Philips
- Electronic Arts
- BBC
entre outros...

Referências:
http://blogs.abril.com.br/scrum/2008/08/que-scrum-metodologia-agil.html
http://improveit.com.br/scrum
http://www.slideshare.net/tatix/batepapo-sobre-scrum-e-design-looping-rbs
http://www.mountaingoatsoftware.com/system/hidden_asset/file/52/PortugueseScrum.pdf

Veja mais na InfoQ:
http://www.infoq.com/br/bycategory/newsbycategory.action?idx=15&alias=scrum

Just Java 2009: Uma visão móvel

22 setembro 2009 0 comentários
O Java Móvel esteve presente no Just Java 2009, que aconteceu nos dias 15, 16 e 17 de setembro, e neste post fica nossas considerações sobre mobilidade e desenvolvimento em Java ME, TV Digital, desenvolvimento ágil e assuntos que nos chamou mais atenção.


Já no inicio do evento Daniel Ambrósio, representante da UOL, mostrou o sucesso do Scrum na empresa, implantado a cerca de um ano, pra quem não conhece essa metodologia, no próximo post vamos explorar o tema.

A palestra Java ME 360 graus - Do Sun Spot à TV Digital, de Antonio Marin Neto (Instituto Nokia) e Igor Medeiros(JavaCard man), mostrou que o java me vai muito além do desenvolvimento para celulares, podendo ser utilizado na robótica, telemetria, TV Digital e a novidade que trouxeram, a caneta que roda Java. Comentaram um pouco de JavaCard, que correspondem a 95% dos SIM Cards (chips de celular).
Mostraram que em um fururo breve serão usados e-CPF e RG Digital com Java Card, o que torna a área ainda mais promissora. Ainda foi comentado que a comunicação do javacard será via HTTP, utilizando servlets para tal tarefa.
Eles ainda apresentaram uma brincadeira com o SunSpot e comentaram sobre o LWUIT, enfatizando seu uso em aplicações para TV Digital.

Falando em TV Digital, Aguinaldo Boquimpani comentou sobre a interatividade na TV Digital. Nos bastidores do evento, comentamos sobre quem poderia realmente comercializar aplicações para TV. E se as aplicações serão disponibilizadas pelas emissoras de TV, então quem venderá tais aplicações senão elas? Os desenvolvedores serão apenas internos da empresa ou terceiros poderão verder suas aplicações também? Fica aí a força do Middleware Aberto do Sistema Brasileiro de TV Digital - Ginga.

Este contexto tráz uma nova visão, os conhecimentos técnicos não bastam para os candidatos a trabalhar com TV digital. Eles terão que ter também muita criatividade e a consciência de que estarão lidando com um meio – e um público – bastante diferente.

Segundo Aguinaldo Boquimpani, a verdadeira batalha desse mercado será criar aplicações que ganhem o coração do telespectador. Para isso, os desenvolvedores deverão ter em mente que estão lidando com um mundo novo. O ambiente da TV é totalmente diferente do ambiente no PC ou mesmo no celular . Quem achar que a TV digital será uma Internet na TV não será bem-sucedido. Os profissionais de TI, principalmente de software e design, terão obrigatoriamente que se reciclar para entender as imensas diferenças e o enorme potencial desse novo ambiente.

Neto Marin também palestrou sobre aplicativos Java ME para Devices touch Screen, mostrando dicas sobre usabilidade, como:

- Criar interfaces intuitivas;
- Estimulos visuais ao usuário (cores, botões e slides);
- Evitar inputs por digitação;
- Evitar ícones e textos pequenos;
- Mostrar um feedback visual para teclados virtuais;
- Enfim, é importante desenvolver aplicativos com interfaces simples para atingir usuários que não dominam tecnologia.

Surge aí mais uma vez a importância do LWUIT, que já trata o pressionamento de teclas em dispositivos touch screen, sem a necessida de trabalhar com Canvas - baixo nível.

Com Maurício Leal, Gerente de Programas SDN (Sun Developer Networks) para a América Latina da Sun Microsystems, foi mostrado a importância do JavaFX, plataforma para criação de conteúdo para aplicações RIA. O JavaFX script atende Desktop, Mobile e Web com o mesmo fonte. Apresentou uma aplicação onde é usado um plugin no Photoshop para o designer da aplicação, onde cada camada se torna uma figura separada para ser tratada no código. Pelo que tudo indica o JavaFX (eféx, rs) é o futuro das aplicações RIA!

Na palestra Do with LWUIT de Roger Brinkley, Líder Comunitário da Comunidade Móvel & Embarcados da Sun Microsystems (EUA), foi mostrado as características do LWUIT, como: roda em CDC/CLDC, suporte a touch Screen, transições, temas, etc. Lembrando que a SUN incluiu o LWUIT recentemente como uma biblioteca padrão, e mostra o framework para todo o mundo ver a importância que ele tem tanto para aplicaçôes em java ME quanto para TV Digital.

Robison Cris Brito ministrou uma palestra sobre Desenvolvimento de Jogos para celular com o Game Builder do NetBeans, mostrando o quanto a ferramenta facilita o desenvolvimento. Com a ferramenta ainda é necessário a codificação da lógica, porém o layout não precisa ser feito a mão. O Robison fez a demonstração de um game que já vem no netbeans (Karel x Thomas), explicando os métodos principais e fazendo uma nova fase para o jogo, depois demostrou rapidamente a criação de um jogo de nave, este iniciado do zero. Vale ressaltar que o Game Builder vem apartir do Netbeans 6.0 e é desenvolvido com o perfil MIDP 2.0. Enfim, é uma ótima ferramenta para os interessados em desenvolvimento de jogos para celular.

José Donizetti de Brito e Paulo Silveira da CAELUM ministraram a palestra Desmistificando o TDD na prática, (TDD - Test Driven Development) onde defenderam a idéia de escrever testes antes de criar o código (ao estilo do XP), pois escrevendo os testes antes tornam-se visíveis quais métodos são realmente necessários. Fizeram um exemplo prático com ajuda do público e mostraram as várias falhas que o sistema possuía e que quase ninguém notou. Criaram vários testes de Unidade com o framework JUnit, onde podemos enxergar o porque as falhas ocorriam, fatos que não são facilmente observados durante a programação. Com JUnit, o programador tem uma ferramenta que o ajudará a eliminar os erros de seu código de maneira mais atraente.

Concluímos dizendo que o evento foi realmente interessante! Esperamos ter ajudado a quem não pode ir no evento e está interessado em mobilidade e desenvolvimento em Java ME e outros assuntos relacionados.

Android 1.6 está pronto para desenvolvedores

20 setembro 2009 0 comentários

O Google disponibilizou uma nova versão do Android, destinada aos desenvolvedores de
aplicativos, no formato SDK (Software Developer Kit).

O pacote oferece updates e novas ferramentas aos programadores, como:

- capacidade de reconhecer gestos com o aparelho. Desenvolvedores poderão produzir aplicativos sensíveis às diferentes formas de toque na tela do aparelho.
- upgrade no sistema de fotografia e filmagem. Ativar uma câmera em um aparelho deve ficar 39% mais rápido. O tempo de espera entre a aquisição de fotos deve cair para 28%.
- A resolução dos aplicativos não está mais presa ao hardware e pode ser ajustada pelos programadores.

Outras alterações incluem o recurso Text-to-Speech, alteração da Market UI e renovação do
indicador de bateria. Agora é possível ver quais aplicativos estão consumindo mais energia do aparelho e desligá-los.

Referência
http://info.abril.com.br/noticias/ti/android-1.6-esta-pronto-para-desenvolvedores-16092009-
4.shl

Sansung estreia Android no Brasil

0 comentários

A HTC havia informado que seria a primeira a trazer aparelhos com Android para o mercado brasileiro. Porém a Sansung passou a frente e já iniciou a distribuição do primeiro celular com Android a ser vendido no Brasil, o Galaxy i7500.

O dispositivo tem tela de 3.2´ sensível ao toque, suporta redes 3G e conexão Wi-Fi. Além disso, o Galaxy conta com câmera de 5 MP e memória interna de 8 GB, expansível até 32GB, mesma capacidade de armazenamento do modelo mais avançado da Apple, o iPhone 3GS de 32 GB.



O preço de R$ 1799 sugerido pela Samsung pode variar um pouco e, na prática, ficar mais em conta dependendo do plano de dados contratado e do subsídio oferecido pela operadora.

Os aparelhos chegam aos fornecedores esta semana e estarão disponiveis aos compradores na segunda quinzena de outubro. A primeira operadora que irá disponibiliza-los será a TIM.

Referência
http://info.abril.com.br/noticias/tecnologia-pessoal/samsung-estreia-android-no-brasil-17092009-26.shl

Usando a PIM API para acessar listas do Mobile

11 setembro 2009 5 comentários

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

Propriedades do sistema com MIDP

07 setembro 2009 1 comentários

Olá! este breve post é simplesmente para mostrar um documento que a Nokia diponibilizou, apresentando funções que enumeram as propriedades do sistema que podem ser recuperadas usando o método System.getProperty().
O pacote também inclui uma documentação e um pequeno MIDlet para verificação das propriedades do sistema afim de saber o que o dispositivo suporta.


Seguem as Classes


Classe SysPropForm.java

import javax.microedition.lcdui.*;
import javax.bluetooth.LocalDevice;

public class SysPropForm extends Form implements CommandListener {
private Command backCommand;
private Command exitCommand;
private SystemProperties midlet;

public SysPropForm(String title, SystemProperties midlet, String[] list) {
super(title);
this.midlet = midlet;
backCommand = new Command("Back", Command.BACK, 1);
exitCommand = new Command("Exit", Command.EXIT, 1);
addCommand(backCommand);
addCommand(exitCommand);
setCommandListener(this);

for (int i = 0; i < c ="=" bt =" false;" c ="=">

Classe SystemProperties.java

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

public class SystemProperties extends MIDlet implements CommandListener {
private static final String[] SYSPROPLISTS = {
"CLDC&MIDP", "Optional packages", "MMAPI", "Bluetooth API",
"FileConnection API", "WMA", "SATSA", "Other"};
private static final String[] CLDC_MIDPPROPS = {
"microedition.profiles", "microedition.configuration", "microedition.locale",
"microedition.platform", "microedition.encoding", "microedition.commports",
"microedition.hostname", "microedition.jtwi.version"};
private static final String[] OPT_SYSPROPS = {
"microedition.media.version", "microedition.pim.version",
"microedition.io.file.FileConnection.version", "microedition.m3g.version",
"microedition.location.version", "microedition.global.version",
"microedition.chapi.version", "microedition.sip.version"};
private static final String[] MMAPI_SYSPROPS = {
"supports.mixing", "supports.audio.capture", "supports.video.capture",
"supports.recording", "audio.encodings", "video.encodings",
"video.snapshot.encodings", "streamable.contents"};
private static final String[] BT_SYSPROPS = {
"bluetooth.api.version", "bluetooth.l2cap.receiveMTU.max",
"bluetooth.connected.devices.max", "bluetooth.connected.inquiry",
"bluetooth.connected.page", "bluetooth.connected.inquiry.scan",
"bluetooth.connected.page.scan", "bluetooth.master.switch",
"bluetooth.sd.trans.max", "bluetooth.sd.attr.retrievable.max"};
private static final String[] FILE_API_SYSPROPS = { "fileconn.dir.photos",
"fileconn.dir.videos", "fileconn.dir.tones", "fileconn.dir.memorycard",
"fileconn.dir.private", "fileconn.dir.photos.name", "fileconn.dir.videos.name",
"fileconn.dir.tones.name", "fileconn.dir.memorycard.name", "file.separator"};
private static final String[] WMA_SYSPROPS = {
"wireless.messaging.sms.smsc"};
private static final String[] SATSA_SYSPROPS = {
"microedition.smartcardslots"};
private static final String[] OTHER_SYSPROPS = {
"com.nokia.mid.dateformat", "com.nokia.mid.timeformat",
"com.nokia.network.access", "com.nokia.mid.imei"};
private List list;
private SysPropForm cldcmidpform;
private SysPropForm optform;
private SysPropForm mmapiform;
private SysPropForm btform;
private SysPropForm fileapiform;
private SysPropForm wmaform;
private SysPropForm satsaform;
private SysPropForm otherform;
private Command exitCommand;
protected boolean bt = false;

public SystemProperties() {
list = new List("System properties", List.IMPLICIT, SYSPROPLISTS, null);
exitCommand = new Command("Exit", Command.EXIT, 1);
list.addCommand(exitCommand);
list.setCommandListener(this);
Display.getDisplay(this).setCurrent(list);
}

protected void startApp() throws MIDletStateChangeException {
}

protected void pauseApp() {
}

protected void destroyApp(boolean p1) {
}

public void commandAction(Command c, Displayable d) {
if (c == List.SELECT_COMMAND) {
int index = list.getSelectedIndex();
if (index == 0) {
cldcmidpform = new SysPropForm(SYSPROPLISTS[0], this, CLDC_MIDPPROPS);
Display.getDisplay(this).setCurrent(cldcmidpform);
}
if (index == 1) {
optform = new SysPropForm(SYSPROPLISTS[1], this, OPT_SYSPROPS);
Display.getDisplay(this).setCurrent(optform);
}
if (index == 2) {
mmapiform = new SysPropForm(SYSPROPLISTS[2], this, MMAPI_SYSPROPS);
Display.getDisplay(this).setCurrent(mmapiform);
}
if (index == 3) {
bt = true;
btform = new SysPropForm(SYSPROPLISTS[3], this, BT_SYSPROPS);
Display.getDisplay(this).setCurrent(btform);
}
if (index == 4) {
fileapiform = new SysPropForm(SYSPROPLISTS[4], this, FILE_API_SYSPROPS);
Display.getDisplay(this).setCurrent(fileapiform);
}
if (index == 5) {
wmaform = new SysPropForm(SYSPROPLISTS[5], this, WMA_SYSPROPS);
Display.getDisplay(this).setCurrent(wmaform);
}
if (index == 6) {
satsaform = new SysPropForm(SYSPROPLISTS[6], this, SATSA_SYSPROPS);
Display.getDisplay(this).setCurrent(satsaform);
}
if (index == 7) {
otherform = new SysPropForm(SYSPROPLISTS[7], this, OTHER_SYSPROPS);
Display.getDisplay(this).setCurrent(otherform);
}
}
if (c == exitCommand) {
quitApp();
}
}

public void quitApp() {
destroyApp(true);
notifyDestroyed();
}

protected void showList() {
Display.getDisplay(this).setCurrent(list);
}
}


Links:
http://www.forum.nokia.com/info/sw.nokia.com/id/37086440-dcce-4fb4-aa3e-8d8c16d62b33/MIDP_System_Properties_v1_2_en.zip.html

http://www.forum.nokia.com/info/sw.nokia.com/id/bd70d77a-f82f-47ce-a4f8-ca3d868e60a8/MIDP_System_Properties_v1_1.zip.html