terça-feira, 2 de agosto de 2011

Recuperando e Lendo Arquivos de um Cartão de Memória - PARTE 2

01. @Override
02. public final void onItemSelected(AdapterView<?> arg0, android.view.View arg1, int posItem, long arg3)
03. {
04.     nomeArqSelecionado = null;
05.     nomeArqSelecionado (String)lista.getItemAtPosition(posItem);
06.
07.     if(nomeArqSelecionado.endsWith(".mp3") ||
08.       (nomeArqSelecionado.endsWith(".mid")))
09.     {
10.         formatoSelecionado = MUSICA;
11.     }
12.     else if(nomeArqSelecionado.endsWith(".png") ||
13.             (nomeArqSelecionado.endsWith(".jpg") ||
14.             (nomeArqSelecionado.endsWith(".gif"))))
15.     {
16.          formatoSelecionado = IMAGEM;
17.     }
18.     else if(nomeArqSelecionado.endsWith(".txt"))
19.     {
20.         formatoSelecionado = TEXTO;
21.     }
22.     else if(nomeArqSelecionado.endsWith(".3gp") ||
23.             (nomeArqSelecionado.endsWith(".mp4")))
24.     {
25.         formatoSelecionado = VIDEO;
26.     }
27. }

Em seguida, um passeio pelo método onItemSelected(AdapterView<?> arg0,
View arg1,int posItem, long arg3), que será invocado cada vez que um item da lista for
selecionado. Iremos nos ater apenas ao terceiro parâmetro do método, que guarda a
posição do item que estiver selecionado no momento. A linha 05 aponta que é
possível recuperar um elemento da lista em uma dada posição.
    Nesta aplicação, cada item da lista corresponde ao nome de um arquivo recuperado do cartão de memória. O próximo passo é checar se o nome do arquivo termina com alguma
extensão aceita pelo aplicativo e sendo o caso, avisar à variável formatoSelecionado. Quando o usuário chamar o menu da aplicação, o título do item direito irá mudar de acordo com o
elemento selecionado na lista.


CRIANDO O MENU DA ACTIVITY PRINCIPAL

01. @Override
02. public final boolean onCreateOptionsMenu(Menu menu)
03. {
04.     SubMenu voltar = menu.addSubMenu("Sair");
05.     voltar.getItem().setOnMenuItemClickListener(this);
06.
07.     SubMenu lerArquivo = menu.addSubMenu("Ler Arquivo");
08.     lerArquivo.getItem().setOnMenuItemClickListener(this);
09.
10.     return super.onCreateOptionsMenu(menu);
11. }

    O método onCreateOptionsMenu(Menu menu) é chamado apenas uma vez, quando sua
Activity é criada. Como o próprio nome diz, ele cria um menu que será incorporado a Activity.
Analisando o corpo do método, vemos que cada um dos sub-menus é criado através dainstância da classe Menu com métodos bem intuitivos. Basicamente, damos a cada sub-menu um título e o preparamos para responder a eventos de clique/toque. Você também podeassociar a um sub-menu um ícone ao invés de um nome, assim como construir o menucompleto em um arquivo XML, mas isso não será abordado neste tutorial.


DEFININDO DINAMICAMENTE O TÍTULO DO MENU

01. @Override
02. public final boolean onPrepareOptionsMenu(Menu menu)
03. {
04.     final int LER_ARQUIVO = 1;
05.
06.     MenuItem lerArq = menu.getItem(LER_ARQUIVO);
07.
08.     switch(formatoSelecionado)
09.     {
10.     case MUSICA:
11.         lerArq.setTitle("Tocar Musica");
12.
13.         break;
14.     case VIDEO:
15.         lerArq.setTitle("Reproduzir Video");
16.
17.         break;
18.     case TEXTO:
19.         lerArq.setTitle("Visuazliar Texto");
20.
21.         break;
22.     case IMAGEM:
23.         lerArq.setTitle("Exibir Imagem");
24.
25.     break;
26.     }
27.
28.     return super.onCreateOptionsMenu(menu);
29. }

    Quando se seleciona a tecla menu, seja no emulador ou em um smarthphone, é chamado o método onPrepareOptionsMenu(Menu menu), que então exibe o menu completo na parte inferior da tela.  Aqui o título do sub-menu direito irá mudar de acordo com o item da lista que estiver selecionado.


ESCOLHENDO O ARQUIVO A REPRODUZIR

01. @Override
02. public final boolean onMenuItemClick(MenuItem item)
03. {
04.     if(item.getTitle() == "Sair")
05.     {
06.         finish();
07.     }
08.     else
09.     {
10.         Bundle arquivo = new Bundle();
11.
12.         arquivo.putInt("Formato", formatoSelecionado);
13.         arquivo.putString("DirArquivo", sdcard + "/" + nomeArqSelecionado);Selecionado);
14.
15.         startActivity(new android.content.Intent("REPRODUZIR_ARQUIVO").putExtras(arquivo));xtras(arquivo));
16.     }
17.
18.     return false;
19. }

É hora de entender o que ocorre quando se seleciona um dos itens do menu da tela
principal. Em primeiro lugar, é chamado o método onMenuItemClick(MenuItem item), que
recebe como parâmetro à referência ao item de menu selecionado. Para saber qual item de menu foi ativado pelo usuário, utilizamos o seu título, definido durante a criação do menu e alterado cada vez que um item da lista é selecionado.
    No código, vemos que se o título for igual ‘Sair’, é encerrado o programa com o método finish() da classe Activity. Internamente, ele chamará o método onDestroy(), que de fato destrói a Activity. Do contrário, a tela atual irá chamar por uma segunda Activity, a qual tem por  finalidade reproduzir o conteúdo do arquivo selecionado na lista.   Com a classe Bundle, passaremos informações extras ao chamar outra Activity, para dizer-lhe o que fazer quando esta for criada. A classe Bundle funciona como uma tabela de  registros, cada um com valores e chaves associadas. Note que depois de instanciar Bundle, nós alimentamos a tabela com dois registros: um com um valor inteiro, que avisará a Activity seguinte sobre o formato a reproduzir, e o segundo com o caminho completo do arquivo.
    Por fim, ao chamar a segunda Activity, note o parâmetro fornecido a sua Intent. Trata-se de uma String como uma referência mais amigável a outra tela. Essa nome é o mesma usado para registrar uma Activity no arquivo de manifesto do projeto:
    Chamando o método putExtras(Bundle arquivo) na Intent criada, nós estamos passando a tabela que acabamos de criar para a segunda tela.

ReproducaoArquivo.java 

01. private static int formato;
02. private final MediaPlayer player = new MediaPlayer();

Logo no início, alocamos duas variável globais. A variável formato permite a Activity atual saber que tipo de arquivo reproduzir e player tem o propósito de tocar uma música.
CRIACAO DA TELA DE REPRODUÇÃO DE ARQUIVOS

01. @Override
02. protected void onCreate(Bundle savedInstanceState)
03. {
04.     super.onCreate(savedInstanceState);
05.
06.     Bundle arquivo = getIntent().getExtras();
07.     formato = arquivo.getInt("Formato");
08.     String dirArq = arquivo.getString("DirArquivo");
09.
10.     switch(formato)
11.     {
12.     case IMAGEM:
13.         exibirImagem(dirArq);
14.      
15.        break;
16.     case MUSICA:
17.         tocarMusica(dirArq);
18.
19.         break;
20.     case VIDEO:
21.         reproduzirVideo(dirArq);
22.
23.         break;
24.     case TEXTO:
25.         visualizarTexto(dirArq);
26.
27.         break;
28.     }
29. }

Agora você ficará sabendo como a tela invocada intercepta as informações passadas pela tela chamadora. Na linha 06, a Activity recém-criada recuperou a Intent que lhe foi passada pela sua vizinha e ao mesmo tempo, a tabela anexada a ela, por meio de getExtras(). Com a tabela instanciada em mãos, obtemos os valores referentes ao formato e caminho do arquivo através das chaves associadas a eles na Activity anterior.
Após isso, um teste usará o a variável formato para determinar que tipo de arquivo será lido e a referência dirArq para saber onde o mesmo se encontra.
EXIBINDO A IMAGEM

01. private final void exibirImagem(String dirArq)
02. {
03.     ImageView imagem = new ImageView(this);
04.     imagem.setImageBitmap(android.graphics.BitmapFactory.decodeFile(dirArq));
05.
06.     setContentView(imagem, new LayoutParams(LayoutParams.FILL_PARENT,  LayoutParams.FILL_PARENT));
07. }

Estudaremos primeiro o que o método exibirImagem(dirArq) fará caso seja o escolhido. 
Na linha 03, criamos um componente ImageView, cuja função é exibir uma imagem na tela. Uma das formas de definir a imagem a ser exibida é por meio de um Bitmap, classe que representa uma imagem no Android.
Com a classe BitmapFactory, podemos obter um bitmap de diferentes fontes, sendo que nesse caso  a fonte adotada foi o caminho do arquivo passado pela Activity anterior, o que confirma a linha 04.
Passaremos a referência imagem para setContentView(View v, LayoutParams p), que 
configurará a aparência da tela. O primeiro parâmetro, como já sabemos, corresponde a
ImageView criada. Já o segundo é uma referência de LayoutParams, que determina como a
largura e altura devem aparecer na tela. A constante FILL_PARENT estica o componente ao máximo na horizontal ou na vertical. Isso quer dizer que mesmo que o tamanho real da imagem fosse de 50x50 pxs, ela seria alargada para preencher a tela inteira. Se quiséssemos exibi-la em seu tamanho real, substituiríamos FILL_PARENT por WRAP_CONTENT.
Imagem preenchendo uma Activity modal

1 comentários:

xibil disse...

Ola tens como mandar este projeto por email
Aqui não deu muito certo no meu!!

Postar um comentário