Avançar para a área de conteúdo

ir para o conteúdo principal

developerWorks Brasil  >  Software livre  >

Crie Aplicativos BlackBerry com Ferramentas de Software Livre, Parte 3: Construindo um Aplicativo de Redes de Relacionamentos

developerWorks
Ir para a página anteriorPágina 3 de 9 Ir para a próxima página

Opções de documento

Código de amostra


Classificar este tutorial

Ajude-nos a melhorar este conteúdo


Redes de Relacionamentos para o BlackBerry

Esta seção examina cada um dos principais elementos do aplicativo de amostra, incluindo snippets de código de origem relevantes. Primeiro vamos falar um pouco sobre o desempenho do aplicativo e o que esperar no código.

Aplicativo de Redes de Relacionamentos de Exemplo

O aplicativo de amostra, IBMCalendar, é um pouco diferente dos aplicativos nas partes anteriores da série. Ele não contém telas próprias de UI e é projetado para interagir diretamente com aplicativos de PIM do BlackBerry. Está certo — não há telas de UI customizadas. Tudo é feito através de ganchos e utilitários integrados para se conseguir as funções desejadas.

Um aplicativo de sucesso deve ter uso intuitivo ou seu público alvo simplesmente não o utilizará. Você já viu algum aplicativo carregado de recursos, mas não o utilizou porque era inconveniente iniciá-lo e acessá-lo? Para evitar essa situação, o aplicativo de amostra:

  • Está sempre em execução. Toda vez que seu BlackBerry é iniciado (não que você esteja sempre desativando-o, é claro), o aplicativo é iniciado. Ele não possui um ícone na fita do aplicativo.
  • Instala um menu no aplicativo de calendário, deixando seu aplicativo fácil de localizar e sempre disponível. Um aplicativo de redes de relacionamentos efetivo deve ser intuitivo e super simples de operar.
  • Apresenta uma lista de amigos com os quais se conectar utilizando um método integrado da classe BlackBerryContactList. Os amigos são todas as pessoas em seu banco de dados de contatos.

As funções do aplicativo são simples. Sempre que um evento é selecionado no aplicativo de calendário, você pode selecionar um menu customizado para Compartilhar Este Evento.


Figura 3. Compartilhando um Evento
Compartilhando um Evento

Quando opta por compartilhar um evento, você obtém uma lista dos seus amigos com os quais compartilhar o evento.


Figura 4. Escolhendo um Amigo com o qual Compartilhar o Evento
Escolhendo um Amigo com o qual Compartilhar o Evento

Após você escolher um amigo com o qual compartilhar o evento, o aplicativo envia automaticamente um e-mail para o amigo e leva o usuário de volta para o aplicativo de calendário. O processo inteiro é muito rápido. Ele não é intrusivo e é simples de usar.

Agora que você sabe com o que o aplicativo se parece, é hora de dar uma olhada na estrutura e no código. Para continuar construindo o aplicativo de amostra, instale o BlackBerry Java Development Environment caso ainda não tenha instalado.



Voltar para parte superior


Estrutura do Aplicativo

O aplicativo de exemplo será construído em partes neste tutorial. Você pode fazer o download do código de origem completo. A Figura 5 mostra os arquivos de origem no aplicativo de amostra.


Figura 5. Arquivo de Projeto no BlackBerry JDE
Arquivo de Projeto no BlackBerry JDE

Como o aplicativo não tem uma UI customizada, não existe uma classe dedicada a uma tela (como nas partes anteriores desta série). Para iniciar automaticamente sem uma UI, selecione Módulo do Sistema e Inicialização Automática no diálogo de propriedades do projeto.


Figura 6. Configurações do Projeto
Configurações do Projeto

No arquivo IBMCalendar.java, observe o código na Listagem 3. Como em qualquer aplicativo Java, o aplicativo requer um ponto de entrada, main, no IBMCalendar.java.


Listagem 3. Método Main do Arquivo IBMCalendar.java

// IBMCalendar.java
// MSI Services, Inc.
// Frank Ableson
// 973.448.0070
// fableson@msiservices.com
// código livre para uso para qualquer propósito, seja comercial ou não
package com.msi.ibm;
import net.rim.device.api.ui.*;
import net.rim.blackberry.api.menuitem.*;


// nosso aplicativo
class IBMCalendar extends UiApplication //implementa GlobalEventListener
{
     // ponto de entrada do aplicativo
    public static void main(String[] args)
    {
        System.out.println("main");
         // crie uma instância do aplicativo
        IBMCalendar theApp = new IBMCalendar();
         // "execute" o aplicativo
        theApp.enterEventDispatcher();
    }
    // construtor do aplicativo
    public IBMCalendar()
    {
        // crie Menu e inclua-o no Aplicativo Calendário
        CalendarMenus cm = new CalendarMenus(0,"Share this Event");

        ApplicationMenuItemRepository.getInstance().addMenuItem
(ApplicationMenuItemRepository.MENUITEM_CALENDAR,cm);
    }
}

O método main cria uma nova instância da classe IBMCalendar, que é uma extensão da classe UiApplication. UiApplication está localizado no pacote net.rim.device.api.ui. A classe UiApplication é uma classe base para todos os aplicativos BlackBerry que têm uma UI.

O construtor da classe IBMCalendar cria uma instância da classe CalendarMenus, que é definida e implementada em CalendarMenus.java. Após a instância de CalendarMenus ser criada, ela é incluída no aplicativo de calendário com um método na classe ApplicationMenuItemRepository.

A plataforma BlackBerry oferece a oportunidade de se incluir menus em aplicativos integrados. Ela não requer hacks indesejados ou enumerações de janelas cheias de truques, como é necessário em outras plataformas. Isso é um recurso básico do BlackBerry SDK no pacote net.rim.blackberry.api.menuitem.

Para incluir um menu em um aplicativo, você deve criar uma classe que estenda a classe ApplicationMenuItem. Normalmente, essa classe possui três métodos, embora a nossa possua quatro para facilitar o acompanhamento do código. As etapas básicas para se implementar um ApplicationMenuItem:

  1. Forneça um construtor que possa opcionalmente seguir um aplicativo para a configuração de dados específicos utilizados pelo ApplicationMenuItem. Por exemplo, parece que você está passando um valor de string customizado que seu menu customizado deve exibir.
  2. O método toString() retorna o nome que você quer exibir. Ele pode ser codificado permanentemente ou gerado dinamicamente.
  3. O método run é chamado sempre que seu menu é selecionado. Ele usa um único parâmetro do tipo Objeto. Você pode examinar esse Objeto para determinar se quer responder a essa seleção de menu.

A instância CalendarMenus é criada na Listagem 4.


Listagem 4: Instância CalendarMenus

CalendarMenus cm = new CalendarMenus(0,"Share this Event");

O texto do menu para esta instância, "Compartilhar Este Evento", pode ser qualquer valor de string que você quiser, embora, obviamente, você deva se certificar de que ele seja compacto e intuitivo. A implementação desses métodos na Listagem 5 mostra o código de CalendarMenus.java. Vamos fazer uma revisão dos principais elementos deste arquivo, um por um.


Listagem 5. CalendarMenus.java

//CalendarMenus.java
// MSI Services, Inc.
// Frank Ableson
// 973.448.0070
// fableson@msiservices.com
// código livre para uso para qualquer propósito, seja comercial ou não
package com.msi.ibm;
import net.rim.blackberry.api.mail.*;
import net.rim.blackberry.api.mail.event.*;
import net.rim.device.api.system.*;
import net.rim.device.api.ui.*;
import net.rim.blackberry.api.menuitem.*;
import java.util.Enumeration;

import javax.microedition.pim.Event;
import net.rim.blackberry.api.pdap.BlackBerryEvent;

import javax.microedition.pim.*;
import java.util.Enumeration;
import net.rim.blackberry.api.pdap.*;



class CalendarMenus extends ApplicationMenuItem
{
    String myname;
    CalendarMenus(int order,String name)
    {
        super(order);
        myname = name;
    }


    //Run é chamado quando menuItem é chamado
    public Object run(Object context)
    {
        //objeto de contexto deve ser um Evento
        if (context instanceof Event)
        {
            try
            {

                Event evt = (Event) context;

                System.out.println("Handling our Calendar Option");
                java.lang.String s;
                handleCalendarEvent(evt);
            }
            catch (Exception ex)
            {
                System.out.println(ex);
                ex.printStackTrace();
            }

        }
        return context;
    }

    //toString deve retornar a string que queremos
    //utilizar como teste para menuItem
    public String toString(){
        return myname;
    }



    public void handleCalendarEvent(Event e)
    {
      System.out.println("handling Calendar Event [" + e.toString() + "]");

      try
      {
        net.rim.blackberry.api.pdap.BlackBerryContactList contactList =
(BlackBerryContactList) PIM.getInstance().openPIMList(PIM.CONTACT_LIST,PIM.READ_ONLY);
        Contact c = contactList.choose(null,BlackBerryContactList.
AddressTypes.EMAIL,false);
        if (c == null)
        {
            System.out.println("no contact chosen, bail");
        }
        else
        {
            String emailAddress = c.getString(Contact.EMAIL,0);
            System.out.println(emailAddress);

            String eventData = "You're Invited!\n";
            eventData += "What: " + e.getString(Event.SUMMARY,0) + "\n";
            eventData += "Where: " + e.getString(Event.LOCATION,0) + "\n";
            eventData += "When: " + new java.util.Date(e.getDate(Event.START,0)).
toString() + " until " + new java.util.Date(e.getDate(Event.END,0)).toString() + "\n";

            System.out.println(eventData);

            SendEmail se = new SendEmail(emailAddress,eventData);
            se.start();
        }

      }
      catch (Exception ee)
      {
          System.err.println(ee.getMessage());
          ee.printStackTrace();
      }
    }

}

Existem inúmeras chamadas de método para System.out.println. Elas são utilizadas para fins de depuração, já que é útil ver um rastreio dos métodos sendo chamados. Essa técnica é muito mais útil em um aplicativo que não possui uma UI. Para ver esses dados no BlackBerry JDE, visualize a janela Saída, que pode ser acessada no menu Visualizar ou através da combinação das teclas Alt+2 no JDE.

A partir do construtor, observe que um parâmetro é passado na ordem que você quer que o menu apareça. O exemplo utiliza zero, que coloca o menu para cima, como visto na Figura 3. Esse valor é passado para a superclasse. O outro parâmetro utilizado neste construtor é um valor de string que contém um nome para o menu. Esse valor é armazenado na variável de membro myname. Neste ponto, o construtor já fez seu trabalho e esta instância da classe CalendarMenus está pronta.

Voltando à Listagem 2, esta classe é instanciada e empregada no construtor da classe IBMCalendar. Após a classe ser instanciada, ela deve ser incluída no menu do aplicativo, o que é feito através da classe ApplicationMenuItemRepository. O código obtém uma instância dessa classe a partir do método estático getInstance. O método addMenuItem utiliza dois argumentos:

  • O local onde este menu deve ser incluído
  • Uma instância do CalendarMenu

O ApplicationMenuItemRepository oferece vários locais possíveis onde o menu pode ser instalado, o que se compara virtualmente a todos os aplicativos integrados. A documentação da Biblioteca da API Java RIM possui uma referência completa dos locais de menu disponíveis.

Quando o menu é selecionado, o método de execução da classe CalendarMenus é chamado. O único argumento para este método é do tipo Objeto. Ele é interrogado no tempo de execução, e se ele for do tipo Evento, o código o processará. Nesse caso, o evento será processado passando-o para o método handleCalendarEvent. O método handleCalendarEvent executa três etapas principais:

  1. Pede para o usuário escolher um contato. Para isso, o banco de dados de PIM é acessado e a lista de contatos padrão é aberta. Após a PIMList ser aberta, o método escolhido é chamado. Esse método inicia uma "interface com o usuário de procura" onde o usuário pode selecionar um contato. O segundo argumento, BlackBerryContactList.AddressTypes.EMAIL, instrui o método escolhido a mostrar os contatos com seus endereços de e-mail. Se nenhum contato for escolhido, o aplicativo simplesmente não toma nenhuma ação.
  2. Após um contato ser escolhido, os dados do evento são extraídos e formatados em um formato simples legível "O que, Onde, Quando". Os valores de "data" são utilizados como argumentos para instâncias anônimas de java.util.Date. O endereço de e-mail é extraído da instância Contato.
  3. Equipada com um endereço de e-mail e um corpo de texto formatado, a próxima etapa é o envio de um e-mail.


Voltar para parte superior


Enviando um e-mail

A etapa final para o aplicativo de redes de relacionamentos é o envio de um simples e-mail para um amigo para compartilhar um Evento de interesse. Para isso, o aplicativo de amostra implementa uma classe denominada SendEmail, localizada em SendEmail.java.


Listagem 6. Enviando o e-mail

// SendEmail.java
// MSI Services, Inc.
// Frank Ableson
// 973.448.0070
// fableson@msiservices.com
// código livre para uso para qualquer propósito, seja comercial ou não


package com.msi.ibm;

import net.rim.blackberry.api.mail.event.*;
import net.rim.blackberry.api.mail.*;
import net.rim.device.api.system.*;
import net.rim.device.api.ui.component.Dialog;



/**
 *
 */
class SendEmail extends Thread
{
   boolean bCanSend = false;
   Store msgStore;
   Folder[] folderList;
   Folder outFolder;
   Message msg;
   Transport emailTransport;
   String _emailTo,_emailBody;

    SendEmail(String emailTo,String emailBody)
    {
        try
        {
                Session s = Session.getDefaultInstance();
                if(s == null)
                {
                   String errMsg = "Unabled to send email message.\n";
                   Dialog.alert(errMsg);
                   bCanSend = false;
                }
                else
                {
                   bCanSend = true;


                   _emailTo = emailTo;
                   _emailBody = emailBody;

                   emailTransport = Session.waitForDefaultSession().getTransport();
                   msgStore = Session.waitForDefaultSession().getStore();
                   folderList = msgStore.list(Folder.SENT);
                   outFolder = folderList[0];
                   msg = new Message(outFolder);
                }

          }
          catch(NoSuchServiceException nse)
          {
               nse.toString();
          }

    }

    public void run()
    {
        System.out.println("SendEmail :: running");
        if(bCanSend == true)
        {
            try
            {
                Address [] addresses = new Address[1];
                addresses[0] = new Address(_emailTo, _emailTo);
                msg.addRecipients(Message.RecipientType.TO, addresses);
                msg.setSubject("IBM Calendar Share!");
                msg.setContent(_emailBody);
                emailTransport.send(msg);
            }
            catch(Exception e)
            {
                System.out.println("Exception caught trying to send email: " +
                   e.toString());
            }
        }
    }
}

SendEmail estende java.util.Thread. Você quer que a tarefa de envio de e-mail ocorra independentemente de qualquer encadeamento de UI. A classe é instanciada por um construtor que utiliza dois argumentos — o destinatário do e-mail e a mensagem formatada. O construtor tenta fazer um trabalho de inicialização:

  • Conectando-se ao subsistema de comunicações do dispositivo BlackBerry.
  • Obtendo uma referência à caixa de saída.
  • Criando uma nova mensagem de e-mail, do tipo de classe Mensagem, dentro da caixa de saída.

Quando a classe é iniciada, a mensagem é endereçada e o corpo do e-mail é configurado e enviado.



Voltar para parte superior


Executando o Aplicativo

Se você for novo no desenvolvimento do BlackBerry e precisar de ajuda para construir um aplicativo no JDE, consulte Recursos.

Você revisou todos os trechos de código importantes e agora é hora de construir e testar o aplicativo. Supondo-se que o aplicativo tenha sido construído sem erros, é hora de executá-lo no simulador do BlackBerry.

  1. Certifique-se de que o simulador MDS esteja em execução. O simulador MDS permite que o simulador do BlackBerry se conecte à rede, incluindo a Internet.
  2. Selecione F5 para iniciar o simulador do BlackBerry. O aplicativo de amostra do tutorial é iniciado imediatamente no segundo plano.
  3. Para testar o aplicativo, certifique-se de que o dispositivo tenha algumas entradas de contato e uma entrada de evento. Enquanto o evento estiver realçado no aplicativo de calendário, selecione o menu Compartilhar Este Evento.
  4. Escolha um contato. Com um pouco de sorte, seu amigo receberá um e-mail simples e amigável convidando-o para se unir a você. A Figura 7 mostra o convite de e-mail.

    Figura 7. Um Evento Compartilhado
    Um Evento Compartilhado

  5. Mas espere. Seu BlackBerry já possui um recurso chamado Invite Attendee? Siga adiante e conheça. O destinatário recebe um arquivo "ics", que é o formato padrão para um convite de reunião. A menos que seu cliente de e-mail esteja equipado para processar esse arquivo ics, ele será fornecido como um monte de texto pouco interessante.

O aplicativo de redes de relacionamentos fornece um ponto de partida para aplicativos mais criativos que você vai gravar. Em vez de enviar um e-mail, ele poderia fazer uma entrada em um blog, por exemplo. A única limitação neste ponto é sua imaginação.



Voltar para parte superior



Ir para a página anteriorPágina 3 de 9 Ir para a próxima página