Esse artigo faz parte da revista Java Magazine edição 61. Clique aqui para ler todos os artigos desta edição

AN style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: red; FONT-FAMILY: Verdana; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">

N-US style="FONT-SIZE: 10pt; COLOR: windowtext; FONT-FAMILY: Verdana">ALIGN: left" align=left>Uso da plataforma Java ME como base para o desenvolvimento de um MP3 Player. Neste artigo, as principais partes da aplicação foram descritas e explicadas, além de introduzir para o leitor, as JSR’s 75 e 135, as quais deram o suporte para o desenvolvimento desta aplicação.

 

Para que serve:

Proporcionar um melhor entendimento das API’s FileConnection e MMAPI, através da apresentação do desenvolvimento de uma aplicação, a qual as principais funcionalidades são totalmente baseadas nestas duas API’s. Além disso, mostrar o amadurecimento da plataforma Java ME em relação a funcionalidades multimídia.

 

Em que situação o tema é útil:

Existem momentos em que a sua aplicação precisa utilizar arquivos que estão fora do pacote (arquivo JAR) da aplicação, sendo necessário acessar o sistema de arquivos a fim de encontrá-los e utilizá-los. Muitas vezes, as aplicações também precisam emitir sons, a fim de tornar a sua interação mais interessante e divertida para o usuário. Há situações, por exemplo, que a reprodução de áudio é o principal objetivo da aplicação, como o MP3 Player desenvolvido neste artigo.

 

MP3 Player ME – Resumo DevMan:

A plataforma Java ME tem permitido a construção de aplicações práticas e interessantes com acesso à Internet, gráficos 3D, multimídia, assim como diversos outros recursos. Baseado em algumas dessas tecnologias, um MP3 Player será desenvolvido, com a finalidade de reproduzir qualquer arquivo, no formato MP3, que esteja armazenado tanto na memória principal, quanto em um cartão de memória de um dispositivo móvel qualquer.

Dessas tecnologias, vamos apresentar a JSR 135 – Mobile Media API, que será utilizada para desenvolver o core do MP3 Player. Mostraremos como trabalhar com as principais classes e interfaces (Player e VolumeControl) que fazem a reprodução do MP3. Além da JSR 135, também apresentaremos a FileConnection API. Uma API que faz parte da JSR 75 – PDA Optional Packages, que será utilizada na implementação de um navegador de arquivos. A FileConnection API, especificamente, será utilizada na busca dos sistemas de arquivos disponíveis no dispositivo móvel, assim como no acesso aos seus diretórios e arquivos.

O desenvolvimento mostrará como é simples construir uma aplicação funcional com a Java ME, quando se possui conhecimento, prática e criatividade. É a isto que o artigo se propõe: introduzir as APIs e mostrar exemplos práticos, através do desenvolvimento de uma aplicação.

Por fim, mostraremos algumas considerações, dicas e novidades, que vão incentivar o leitor a se aprofundar ainda mais em todo o assunto abordado no artigo.

 

Já foi a época em que o único aparelho eletrônico que algumas pessoas carregavam era uma pequena calculadora. Um aparelho muito útil, desde uma ida ao supermercado até necessidades profissionais de engenheiros ou financistas. Entretanto, passam-se os anos, a tecnologia evolui, e novos “brinquedinhos” aparecem a cada dia para ocupar os nossos bolsos e bolsas.

Antes mesmo do celular, ainda passamos pela época da agenda eletrônica, que armazenavam nossos contatos, livrando-nos das agendas ou cadernetas. Depois surgiram os PDAs, com utilitários mais variados, mas de popularidade inicialmente limitada. Finalmente veio o celular, um sucesso mundial, atualmente companheiro inseparável de quase todo mundo.

Depois do celular, ai não teve mais jeito. Surgiram os tocadores de música digital, pen drivers, vídeo games portáteis, palmtops, câmera digitais, e por ai vai. Haja bolso para pôr todos eles. No entanto, para um aparelho destes continuar presente no bolso das pessoas, como o celular, ele tem que se tornar popular. Dentre os tipos de aparelhos citados, outro que conseguiu cadeira cativa no bolso de muita gente foi o tocador de música digital: o MP3 Player, como é comumente conhecido.

É difícil andar pelas ruas das cidades sem encontrar alguém com fones nos ouvidos, escutando música. A conveniência do MP3 Player assemelha-se bastante à do celular. Talvez seja este o fator de sucesso destes dois tipos de aparelho. Sem falar que também é muito comum encontrar ambos num aparelho só.

Neste artigo, vamos mostrar como podemos inserir a plataforma Java ME nesta estória. Vamos criar um cenário onde o seu dispositivo móvel não possui um tocador de MP3, mas você gostaria de ter um para poder ouvir as suas canções favoritas. Para isto, vamos mostrar o desenvolvimento de um tocador de MP3 simples, utilizando-se da JSR 75 – PDA Optional Packages e da JSR 135 – Mobile Media API (MMAPI). Explorando-as desde os conceitos até a prática, com exemplos de código.

Definindo o escopo

Para evitarmos “problemas com o cliente” ao final do projeto, vamos definir bem o escopo da nossa aplicação, deixando claro o que vamos e o que não vamos fazer. Como falado anteriormente, iremos desenvolver um MP3 Player simples, ou seja, não vamos desenvolver um iPod.

O intuito desta aplicação é mostrarmos as JSR’s 75 e 135 in action. As funcionalidades desta aplicação ficarão restritas ao que estas API’s podem fazer: acessar o sistema de arquivos e executar arquivos de áudio, respectivamente. Então, podemos enumerar os requisitos desta aplicação da seguinte forma:

·       Listar todas as unidades de armazenamento disponíveis (i.e. memória principal e cartão de memória, se disponível) no dispositivo móvel;

·       Possibilitar a navegação nas unidades de armazenamento, assim como nos seus respectivos diretórios;

·       Listar somente os arquivos de extensão MP3 encontrados nas pastas navegadas, assim como os seus subdiretórios;

·       Possibilitar a reprodução de um determinado arquivo MP3 encontrado;

·       Possibilitar as funções de parar ou pausar a reprodução do arquivo MP3, aumentar ou diminuir volume, assim como interromper completamente o som.

Antes de começarmos a mostrar como a aplicação foi desenvolvida, vamos, nas seções seguintes, fazer uma rápida introdução sobre cada uma das API’s que iremos utilizar. Esta introdução é importante, pois irá nos ajudar a entender de forma fácil, tudo o que foi implementado.

JSR 75 – PDA Optional Packages

Para dar suporte ao desenvolvimento dos três primeiros requisitos da nossa aplicação, os quais estão diretamente relacionados à manipulação de arquivos, iremos utilizar a JSR 75 – PDA Optional Packages. Esta JSR, por sua vez, é dividida em duas outras API’s: FileConnection e Personal Information Management (PIM). A primeira provê acesso ao sistema de arquivos, já a segunda, a informações como contatos, compromissos e tarefas, comuns a qualquer dispositivo móvel.

A partir da nova especificação Java ME, a JSR 248 – Mobile Service Architecture (MSA), a JSR 75 passou a ser uma API obrigatória. Dispositivos ainda compatíveis com a especificação anterior, a JSR 185 – Java Technology for the Wireless Industry (JTWI), ainda precisam se preocupar se a API está presente ou não, a fim de poderem utilizá-la em suas aplicações. Veja “Programação Java ME – Parte 2” na Edição 45 para detalhes sobre estas especificações.

Para esta aplicação, utilizaremos somente a FileConnection API. Vamos mostrar que, através desta API, podemos acessar todos os sistemas de arquivos disponíveis no dispositivo móvel, seja o da memória principal ou de um cartão de memória. Além disso, podemos manipular os dados de qualquer arquivo existente, assim como criar, apagar, mudar atributos e renomear tanto arquivos quanto diretórios (veja na seção Links mais informações sobre a FileConnection API).

Encontrando os Sistemas de Arquivos

Um sistema de arquivos, dentro da FileConnection API, é referenciado como root. Fazendo um paralelo com o desktop do Windows, root é a mesma coisa que um drive como “c:\”. Para que uma aplicação consiga identificar quais são os sistemas de arquivos disponíveis no dispositivo móvel, ela deverá utilizar a classe FileSystemRegistry, presente no pacote javax.microedition.io.file. O método a ser chamado para executar esta tarefa é o listRoots(), o qual retornará uma coleção do tipo Enumeration de strings, com todos os roots disponíveis.

Alguns dispositivos ainda permitem que os seus usuários insiram e removam cartões de memória a qualquer momento, mesmo quando os dispositivos estão ligados. Então, as aplicações que desejam ser notificadas sobre este evento, e.g. para mostrar alguma mensagem para o usuário, podem se registrar através do método FileSystemRegistry.addFileSystemListener(). Para isto, basta passar para este método, um objeto que implemente a interface FileSystemListener. Pois quando este tipo de evento acontecer, o método rootChanged(int state, String rootName) deste objeto será executado. O parâmetro state pode conter os valores FileSystemListener.ROOT_ADDED e FileSystemListener.ROOT_REMOVED.

A seguir, vamos aprender como acessar os diretórios encontrados num determinado sistema de arquivos, assim como os seus arquivos.

Trabalhando com Arquivos e Diretórios

Para se obter acesso a um determinado root, diretório ou arquivo, primeiramente é necessário saber o caminho do recurso. Na FileConnection API, todo caminho começa com o prefixo file://. O restante do caminho segue o mesmo padrão utilizado por qualquer sistema operacional, com barras separando diretórios, subdiretórios e arquivos. Para ser exato, segue o padrão de URI de arquivo utilizado por browsers, no qual o separador é sempre a barra normal (‘/’), evitando a abominação da barra reversa do Windows. Veja o quadro “Acessando Fotos, Músicas, Ring Tones, etc.”.

O prefixo file:// serve para informar ao Generic Connection Framework (GCF) que, aquele recurso sendo acessado é referente ao sistema de arquivos. Pois quando este caminho é passado para o método Connector.open(String url), um objeto do tipo FileConnection é retornado (veja o quadro “Considerações de Segurança”). É através deste objeto que o recurso é manipulado. Por exemplo, para se efetuar a leitura e gravação de alguma informação em um determinado arquivo, os métodos openInputStream() e openOutputStream() devem ser utilizados para executar tais tarefas.

A interface FileConnection, ao mesmo tempo, disponibiliza métodos tanto para interagir com arquivos quanto com diretórios. Então, o desenvolvedor tem que estar atento ao tipo de recurso referenciado pelo objeto FileConnection. Por exemplo, suponha que você possua uma referência para o arquivo “picture.jpg”, e por engano chame o método mkdir(), utilizado para criar um diretório. A implementação vai verificar que esta é uma operação ilegal, já que não é possível criar um diretório dentro de um arquivo, lançando uma exceção.

Além dos três métodos já mencionados, a interface FileConnection ainda conta com uma série de outros métodos. Veja abaixo alguns dos principais:

·       create(): Cria o arquivo fisicamente no sistema de arquivos;

· ...

Quer ler esse conteúdo completo? Tenha acesso completo