Location information has become fairly easy to access nowadays, even on mobile devices. The widespread availability of GPS chipsets such as the SiRF chipsets, which are accurate to within a few meters, as well as the significantly lower costs of these products, have contributed to the accessibility. The Location API for J2ME (JSR 179) even makes it very easy for developers to integrate location information into mobile applications.
This article illustrates how to combine JSR 179 and Scalable Vector Graphics (SVG) to provide navigation for a GPS-enabled mobile device. The application will employ the Scalable 2D Vector Graphics API for J2ME (JSR 226) and a MIDlet. As an example, the article provides and refers to a sample NetBeans project for a college “campus navigation” application.
Há alguns meses, o blog Mobilidade é Tudo promoveu uma promoção onde foram sorteadas 5 assinaturas digitais da revista Java Magazine. Bem, para participar da promoção os leitores deste blog poderiam enviar sugestões de post, sendo que, uma delas já foi cumprida, veja o post “Um Pouco Sobre Tablets“.
Bem, hoje vou falar sobre um tema que foi idéia do meu amigo Marcel, do blog Mobideia. Transcrevo aqui a dica do Marcel: Gostaria de ver um tutorial aqui de JavaME para acessar serviços REST (um bom exemplo seria acessar o Twitter) com o JavaME. Outro tutorial legal seria uso de JavaFX mobile, para quem está começando! E por fim um tutorial que eu gostaria de ver o uso de JavaME para jogos multiplayer (com mais de 2 de jogadores)!
Vamos por partes :). Sobre o JavaFX, aconselho a leitura do artigo “Conhecendo a Plataforma JavaFX Mobile“, que escrevi para a revista Mundo Java, na edição de Maio de 2009. Mas quem sabe posteriormente vamos colocar uns posts no blog sobre esta linguagem.
Sobre os jogos multiplayer a dica é a mesma. Nas edições 21 e 22 da revista WebMobile, eu e o Robison, ensinamos como criar um jogo Bluetooth entre celular e PC. Mas, também pretendo criar alguns posts sobre este tema daqui um tempo.. :).
Sobrou o assunto dos serviços REST e do twitter. Infelizmente o Java ME não tem um suporte muito legal para serviços REST, isso porque, na grande maioria das implementações do protocolo HTTP na JVM, não existe suporte as quatro operações do protocolo: POST, GET, PUT e DELETE. O REST (Representational State Transfer), que pode ser resumido como um padrão usado em webservices, que fazem uso exclusivo protocolo HTTP para a comunicação. Porém, podemos encontrar algumas implementações de terceiros para uso de serviços REST em Java ME. Dentre os que encontrei, talvez o mais completo seja o descrito no texto “J2ME REST Client“.
Segundo o autor:
Unfortunately J2ME does not provide the best basis for writing a REST Web Service. As I already mentioned in previous posts the J2ME reference implementation does not support all HTTP methods. To overcome this restriction I wrote a J2ME Rest Client that uses HTTP method emulation like Rails does. Even though I heard that some J2ME platforms support PUT and DELETE I decided to use the standard. Method emulation may become a challenge if you’re not talking to your own services since it require a suitable server implementation like I posted for Grails earlier.
————————————————————
Mas, para twiter eu tive mais sorte na minha pesquisa. Encontrei a biblioteca Twitter API ME, criação de Ernandes Mourão Júnior, mantenedor do blog j2megroup. A biblioteca é simplesmente fantástica, você pode baixar uma aplicação de teste aqui. Pra comprovar que funciona coloquei duas capturas de tela.
A primeira, mostra o twitter do Rubinho Barrichello.. capturada as 20:00 do dia 04/12/2009.
A segunda imagem é a tela do emulador executando na IDE NetBeans.
No aplicativo exemplo eu criar um parser para buscar somente os textos com a palavra “amanha” e, do usuário rubarrichello.
Esta aplicação exemplo traz uma aplicação um pouco mais complexa, porém, vejam que barbada que é pra usar a API:
Now let’s show some code. This example demostrates how to search for all the tweets sent by a given user (e.g. me) and that contains the word “F1″ (we will get a lot of results :-)):
…
SearchDevice sd = SearchDevice.getInstance();
Query q1 = QueryComposer.from(”ernandesmjr”);
Query q2 = QueryComposer.contain(”F1″);
Query q3 = QueryComposer.append(q1, q2);
Tweet[] result = sd.searchTweets(q3);
for (int i = 0; i < 0; i++) {
list.append(result[i].getString(MetadataSet.TWEET_CONTENT), null);
}
...
Let’s search for tweets that references or mentions a certain person. In additional, we will request to Twitter Search API to return up to 5 tweets:
…
SearchDevice sd = SearchDevice.getInstance();
Query q1 = QueryComposer.reference(”ernandesmjr”);
Query q2 = QueryComposer.resultCount(5);
Query q3 = QueryComposer.append(q1, q2);
Tweet[] result = sd.searchTweets(q3);
for (int i = 0; i < 0; i++) {
System.out.println(result[i].getString(MetadataSet.TWEET_CONTENT));
System.out.println(result[i].getString(MetadataSet.TWEET_PUBLISH_DATE));
}
...
O único porém é que, nesta versão da API ainda não é possível enviar mensagens pro twitter, mas, na próxima versão essa funcionalidade já estará presente também..
————————————————————
Marcel e todos leitores, espero que tenham gostado.. e parabéns pro Ernandes Mourão Júnior pela sua biblioteca..
Os três primeiros parágrafos já dão uma ótima idéia do que é tratado no texto:
Explicarei nesse artigo como preparar sua aplicação para usar conexões com a Internet de forma funcional, decidindo se deve usar transporte por BES (BlackBerry Enterprise Server), BIS (BlackBerry Internet Server), WAP, conexão direta pelo device TCP (APN), ou Wi-fi.
A grande maioria dos desenvolvedores BlackBerry já passaram por esse problema. Inicialmente todos desenvolvedores pensam que basta criar uma conexão normalmente, e tudo estará resolvido. Até que começar a ter os erros ” Invalid Tunnel ” ou ” Can ‘ t Open Connection “, ou erros semelhantes. Esses erros ocorrem pois a conexão não foi configurada corretamente na aplicação, e ela está tentando usar uma conexão indisponível no device.
Nos outros celulares, quando fazemos uma conexão com a Internet em nossa aplicação, o próprio celular pergunta ao usuário qual conexão ele deseja usar, se WAP, ConnectFast, Wi-fi, etc. No BlackBerry não é assim, em cada conexão você precisa definir qual será o meio de transporte dos dados.
A troca de informações entre um aplicativo móvel e servidores é uma parte essencial na grande maioria dos software produzidos. Porém, nós programadores, estamos sofrendo com a utilização de formatos de troca de dados como o XML, isso devido ao seu tamanho um pouco saturado para o ambiente restrito da computação móvel. O artigo que indiquei fala justamente de uma opção chamada json, que é mais leve e mais simples, tornando-se uma ótima pedida para Java ME (e outras plataformas móveis)..
Segundo Ortiz.. An alternative to consider is the JavaScript Object Notation or JSON, a lightweight data-interchange format. In this article I introduce JSON for data interchange in the Java Platform, Micro Edition (Java ME).
JSON is defined as part of JavaScript (ECMAScript) scripting language. Being native to JavaScript, JSON is ideal for browser-based applications. But JSON is not limited to JavaScript, and its lightweight characteristics make it very attractive for mobile and embedded applications in general.
Aliás.. quem usa json no lugar de xml para troca de informações entre Java ME e servidores diz que tomou uma decisão acertadíssima.
Eu também não acreditei muito ao ler o texto, quero testar ainda hoje isso, mas o fato é que a Sony diz que é possível escolher um aplicativo Java ME como wallpaper do device. Ou seja, no lugar de uma foto, uma MIDet.
With the new Sony Ericsson Java Platform 7 (JP-7) phones such as the K610, K800, K790 and W850, a new feature that lets the developer enable a MIDlet as a standby application is introduced. This functionality will be included in JP-7 phones after the initial market release. Just as the end-user can assign pictures and themes as wallpaper it is now also possible to select Java applications for this purpose. This standby MIDlet is handled by the application manager, and is started when the phone enters the standby mode. It is stopped when the user selects another wallpaper, theme or picture.
Não acredita ainda?
Eu ainda vou testar pra ter certeza.. mas se funcionar, muito legal essa funcionalidade..
Encontrei um excelente artigo chamado “Getting Started with BlackBerry J2ME Development“, que mostra uma introdução na programação Java ME para BlackBerry e para as RIMlets, que são aplicativos mobile usando a BlackBerry API.
Para quem ainda não conhece a API é uma ótima pedida, para quem já possui um conhecimento, o material é pouco básico demais. Porém, para mim, que sou ainda iniciante na API, fiquei impressionado com a diferença entre a forma de persistência da MIDP padrão (também suportada nos BlackBerry´s) e da BlackBerry API.
Leia o artigo e baixe os códigos fonte de exemplo para ver isso também. Por hora, posso dizer que usando a BB API, você pode salvar objetos de forma direta (semelhante ao Hibernate por exemplo), eliminando boa parte do trabalho massante e chato dos RMS. Além disso, não existe limite de tamanho. Muito legal..
Aqui no blog Mobilidade é Tudo já falamos muito sobre o Java ME para BlackBerry. . Esta API traz varias mudanças em relação a Java ME que está presente na grande maioria dos telefones celulares, e hoje acabei descobrindo uma interface que seria muito útil para os programadores de aplicativos mobile Java ME.
Em uma lista de discussão fiquei sabendo da Interface PhoneListener. Implement this interface if you intend to listen for and act on phone events.
A lista de eventos que são capturados me impressionou:
callAdded(int callId): Invoked when a call gets added to a conference call.
callAnswered(int callId): Invoked when the user answers a call (user driven).
callConferenceCallEstablished(int callId): Invoked when a conference call has been established.
callConnected(int callId): Invoked when the network indicates a connected event (network driven).
callDirectConnectConnected(int callId): Invoked when a direct-connect call is connected.
callDirectConnectDisconnected(int callId): Invoked when a direct-connect call is disconnected.
callDisconnected(int callId): Invoked when a Call is disconnected.
callEndedByUser(int callId): Invoked when the user ends the call.
callFailed(int callId, int reason): Invoked when a call fails.
callHeld(int callId): Invoked when a call goes into the ‘held’ state.
callIncoming(int callId): Invoked when a new call is arriving.
callInitiated(int callid): Invoked when a call has been initiated by the device (outbound).
callRemoved(int callId): Invoked when a call gets removed from a conference call.
callResumed(int callId): Invoked when a call goes from ‘held’ to ‘resumed’ state.
callWaiting(int callid): Invoked when a call is waiting.
conferenceCallDisconnected(int callId)
Uma pena não podemos usar esta API nos nossos Nokias, Sonys, Motorolas, LG´s, etc e etc..
Nos dias 15, 16 e 17 está rolando o JustJava 2009 em São Paulo, infelizmente não poderei participar de todos os dias, na verdade só consegui ir até lá ontem. Felizmente, o pouco tempo que participei já valeu para ver a palestra “Java ME 360o - Do Sun SPOT a TV Digital”, ministrada por Antonio Marin Neto e Igor Medeiros. Os dois falaram sobre várias tecnologias muito legais que usavam alguma VM Java. Mas confesso que fiquei interessado mesmo foi pela caneta Java.
Para me ajudar a falar sobre esta interessantíssima criação, vou usar o post “A caneta de 1 milhão de dólares que roda Java“, do Blog do Spot. Bem, primeiramente, a caneta custa bem menos que 1 milhão, exatamente USD 149,00 para a versão com 1GB de RAM e USD 199,00 para a versão com 2GB. O título foi apenas uma brincadeira do blog.
Um pouco sobre a caneta: A caneta chamada Pulse SmartPen, que foi desenvolvida pela empresa chamada Livescribe, ganhou no JavaOne 2008 o prêmio Duke’s Choice Award como um dos projetos de inovação que utiliza a tecnologia Java. Esta caneta tem um processador ARM embutido de 32 bits, 150MHz e uma JVM com suporte a Java ME e CLDC 1.1 com Media Profile. Torna-se possível escrever programas em Java e fazer o upload via USB para a memória interna da caneta.
Algumas das possibilidades da caneta mágica:
a) Além de ser um mini-computador numa caneta, ela tem uma câmera de infravermelho de alta velocidade que permite capturar tudo aquilo que o usuário escrever num papel de um caderno especial.
Tudo aquilo que o usuário escreve é registrado na memória da caneta. Através de um programa instalado no computador é possivel transferir todas as páginas escritas para o computador e visualizar este conteúdo exatamente como foi escrito. Após a transferência do conteúdo para o computador, torna-se possível fazer o upload deste conteúdo para um site de compartilhamento da própria Livescribe em formato flash que pode ser exportado para PDF.
b) O recurso mais interessante é que a caneta tem um gravador de áudio embutido que permite gravar uma reunião, uma aula ou uma apresentação. Todo o áudio gravado é sincronizado com aquilo que é escrito e no momento no qual é escrito no caderno! Assim, torna-se possível depois da gravação, posicionar a caneta sobre uma palavra escrita no caderno para iniciar a reprodução do áudio gravado no momento que o texto foi escrito. O flash gerado também contem o áudio. O legal é quando o flash é reproduzido, toca o áudio e mostra o contéudo sendo escrito em sincronismo com o áudio como se fosse um filminho.
c) Um recurso bem legal é o fone de ouvido que tem em cada fone um microfone embutido que simula os ouvidos do usuário e o seu ponto de vista. Quando este fone é colocado nos ouvidos do usuário e ligado à caneta, simula os ouvidos do usuário através do microfone e permite gravar o áudio do ponto de vista do usuário. A tecnologia de gravação do áudio é chamada de Binaural que grava a posição espacial de onde o som vem (um exemplo bem legal desta tecnologia é o áudio chamado Virtual Barber Shop, que só funciona ouvindo com um fone de ouvido estéreo).
d) A caneta tem alguns aplicativos, como um tradutor para várias línguas. Ao posicionar a caneta sobre uma palavvra em inglês por exemplo, a caneta por falar a tradução para espanhol, por exemplo. Os aplicativos são trocados em uma espécia de menu 2D situado no próprio caderno.
Veja alguns vídeos:
E que tal transformar a caneta em um piano, preste atenção:
Demais essa caneta.. já to separando 500R$ pra comprar uma…
Continuando a tentativa de pagar minhas promessas em relação a promoção que o Mobilidade é Tudo fez, agora vou escrever o resultado de um breve estudo que fiz sobre a impressão de documentos em Java ME, acessando uma impressora sem fios. A idéia foi do Jonas: “Gostaria de ver um tutorial sobre tratamento e impressões de arquivos pdf em J2ME”.
Bem, quanto o tratamento de arquivos PDF em Java ME só entendendo a codificação PDF e fazendo um parser, oque vai dar bastante trabalho. Aliás, nem sei se dá para fazer isso. Referente a impressão, o trabalho também não vai ser mole não.
Infelizmente não há uma maneira simples de imprimir documentos em uma impressora através do Java ME. Nessa discussão, um usuário diz o seguinte:
I am developing this app in J2ME. Since, there are no APIs in J2ME that help in printing pages via a printer, I think, I will have to send PCL commands to the printer to print both text and image. I read a lot of documents, including PCL5 Technical Reference, for the sequence of PCL commands. But I haven’t succeeded in printing image, though the text is printing( unformatted ).
Tem mais sobre comandos PCL aqui e aqui. PCL é uma linguagem de comando para impressoras.
Nesta outra discussão, o usuário Sagatiba diz o seguinte: Eu ja trabalhei com um Nokia 2630 (o celular tinha que ser o mais barato) e uma impressora bluetooth com perfil serial. Elas emulam ESC/POS. Eh so tacar caractere nas bixinhas e ta bom d+. 24 colunas ou 42 colunas para impressao. De novo, o tratamento será em nível de impressora mesmo, tento que entender alguns protocolos utilizados por ela.
Nesta outra discussão, um usuário fala o seguinte: I’ve had some fun looking all that up, but have to run, so for a start, you might want to look at the BPP specs at http://www.bluetooth.com/NR/rdonlyres/28EC09DC-1598-4889-9B7E-3E8D9803FFBA/2940/BPP_SPEC_V12r01.pdf. I haven’t found out if anyone’s done a J2ME package for this. Novamente o programador terá que entender e programar um protocolo baixo nível.
Mas, nem tudo está perdido, encontrei o Java Driver for Brother MW-140BT mobile bluetooth printer. Segundo o site oficial, the goal of this project is to use the Brother MW-140BT printer (which is connected via bluetooth) from within a java environment (especially J2ME). O site oficial traz inclusive um .jad e um .jar de exemplo. Infelizmente não tenho impressora Bluetooth, nem adaptador, sendo assim, não consegui testar.
Como falei anteriormente, não pude completar os estudos por não ter como testar, mas acho que a última solução pode ajudar bastante, ou, prepare a xícara de café e comece a aprender alguns protocolos novos :). Isso daria um belo framework hein.