Nos dias atuais a agenda de compromissos na “nuvem” é uma realidade muito comum nos usuários de dispositivos Android, daí a possibilidade de sua aplicação interagir diretamente na Agenda do Google torna-se um excelente otimizador do tempo de seu usuário tornando ainda mais agradável a sua experiência de uso.

Imagine você poder a partir do seu cadastro de clientes já agendar a visita ou uma ligação para o cliente sem a necessidade de alternar entre os dois aplicativos? Essa possibilidade será apresentada nesta postagem. 

O caminho

Mais uma vez vamos utilizar aplicativos nativos do Android, e a melhor forma de fazer sua aplicação comunicar-se com o Sistema Operacional é através das Intents. Intent é um tema que já abordei no blog em algumas postagens, se você ainda não leu sobre o tema recomendo que comece por INTENTS COM DELPHI XE5 COMUNICANDO APPS ATRAVÉS DO ANDROID .

Adicionando evento na Agenda do Android com Delphi XE5

A aplicação

A ideia é que nossa aplicação tenha uma tela de disparo de um evento em uma data e hora definida pelo usuário na sua interface.
Vamos iniciar uma aplicação Mobile em branco no Delphi XE5, e no form principal vamos inserir os itens: 1 Button, 1 ToolBar, 1 Image,  2 Edit, 1 CalendarEdit, 1 TimeEdit.
Agora vamos configurar suas respectivas propriedades como litado abaixo:

  • Button1
    • Align -> alBottom
    • Text -> Agendar
  • Edit1
    • Align -> alTop
    • Text -> Meu Evento
    • TextAlign -> taCenter
  • Edit2
    • Align -> alTop
    • Text -> Informação do meu evento
    • TextAlign -> taCenter
  • Image1
    • Align -> alClient
    • MultiResBitmap -> [escolha uma imagem válida a seu gosto]
    • WrapMode -> iwStretch

Coloque o CalendarEdit1 e o TimeEdit1 dentro da ToolBar1 que se encontra no topo da tela e ao final deste processo teremos uma prévia da interface do sistema bem parecida com a imagem abaixo:

Interface da Aplicação de Agendamento

 

O código

No evento onActivate do formulário vamos inserir o seguinte código:

procedure TForm1.FormActivate(Sender: TObject);
begin
  CalendarEdit1.Date := Now;
  TimeEdit1.Time := Now();
end;

Com este procedimento garantimos que sempre que a aplicação for iniciada a data e hora atual do sistema serão carregadas para os referidos componentes.

Na seção Implementation da Unit do formulário vamos inserir a cláusula uses como abaixo:

implementation
{$R *.fmx}
uses
  Androidapi.JNI.GraphicsContentViewText, 
  FMX.Helpers.Android, IdURI, DateUtils,
  Androidapi.JNI.JavaTypes, Androidapi.Jni.Net,
  Androidapi.JNIBridge;

A execução de nossa tarefa de agendamento propriamente dita estará associada ao clique do botão. Para isso vamos codificar o evento onClick do Button1:

procedure TForm1.Button1Click(Sender: TObject);
var
  Intent: JIntent;
  CalendarIni: JCalendar;
  Uri : string;
begin
  Uri      := 'content://com.android.calendar/events';

  Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_EDIT,
    TJnet_Uri.JavaClass.parse(StringToJString(TIdURI.URLEncode(uri))));
  CalendarIni := TJCalendar.JavaClass.getInstance;
  CalendarIni.&set(YearOf(CalendarEdit1.DateTime), MonthOf(CalendarEdit1.DateTime)-1, DayOf(CalendarEdit1.DateTime),
                      HourOf(TimeEdit1.Time), MinuteOf(TimeEdit1.Time));
  intent.putExtra(StringToJString('beginTime'), CalendarIni.getTimeInMillis());
  intent.putExtra(StringToJString('endTime'), CalendarIni.getTimeInMillis()+ 2 *3600*1000);
  intent.putExtra(StringToJString('title'), StringToJString(Edit1.Text));
  intent.putExtra(StringToJString('eventLocation'), StringToJString('Itaocara RJ'));
  intent.putExtra(StringToJString('description'),
          StringToJString(Edit2.Text));
  SharedActivity.startActivity(Intent);

end;

Explicações adicionais

Com o procedimento acima, já temos nossa aplicação pronta para ser executada. Vamos apenas detalhar alguns pontos do código acima. Criamos um objeto Intent do tipo JIntent e um objeto CalendarIni do tipo JCalendar, em ambos referencia-se objetos provenientes de classes Java. Setamos o CalendarIni com data e hora fornecidas pelo usuário.

Nota: As funções YearOf, MonthOf, DayOf são declaradas na Namespace System.DateUtils, bem com HourOf e MinuteOf, que incluímos na cláusula uses. Elas retiram de componentes TDateTime Ano, Mês, Dia, Hora e Minuto respecitvamente.
Nota 2: Repare que ao resultado da execução  MonthOf(CalendarEdit1.DateTime) subtraímos um para que o mês retornado seja condizente com o mês selecionado pelo usuário.

O CalendarIni faz uso da função CalendarIni.getTimeInMillis() que transforma seu valor de data/hora em milesegundos, note que na constante endTime passamos o mesmo valor da constante de início do evento, beginTime, somando-o a uma expressão matemática também em milesegundos: 2 *3600*1000.  O resultado dessa expressão equivale a 2 horas, ou seja, 2 vezes o valor de 3600 (quantidade de segundos referentes a uma hora) vezes 1000 (quantidade de milesegundos referentes a 1 segundo). Assim sendo teremos o nosso evento terminando 2 horas após seu início.

Mais sobre a Classe Calendar no Android você encontra clicando no link: http://developer.android.com/reference/android/provider/CalendarContract.EventsColumns.html 

Agende seu evento

Como já mencionei acima, a aplicação já está pronta! Execute e confira o resultado! Agende um data para desenvolver sua próxima aplicação.
Confira o funcionamento na imagens abaixo e até a próxima!

 

4 Replies to “Adicionando eventos à agenda do Android com Delphi XE5”

    1. Olá Jonatan… seja muito bem vindo!
      Primeiramente obrigado por suas palavras e acima de tudo por sua visita e participação, é disso que o site “se alimenta”!
      Bem eu ainda não me aventurei no mundo iOS, dei a sorte de no dia que ia começar a Apple ter mudado umas coisas lá daí tive que arremeter…
      Então meu amigo, pelo menos por enquanto eu ainda não consegui fazer nadinha mesmo no universo da maçã!

      Mais uma vez obrigado e até a próxima!

Deixe um comentário