Home | History | Annotate | Download | only in providers
      1 page.title=Provedor de agenda
      2 @jd:body
      3 
      4 <div id="qv-wrapper">
      5 <div id="qv">
      6     <h2>Neste documento</h2>
      7     <ol>
      8   <li><a href="#overview">Conceitos bsicos</a></li>
      9   <li><a href="#manifest">Permisses do usurio</a></li>
     10   <li><a href="#calendar">Tabela de agenda</a>
     11 <ol>
     12       <li><a href="#query">Consulta em uma agenda</a></li>
     13       <li><a href="#modify-calendar">Modificao de uma agenda</a></li>
     14       <li><a href="#insert-calendar">Insero de uma agenda</a></li>
     15     </ol>
     16   </li>
     17   <li><a href="#events">Tabelas de eventos</a>
     18 <ol>
     19       <li><a href="#add-event">Adio de eventos</a></li>
     20       <li><a href="#update-event">Atualizao de eventos</a></li>
     21       <li><a href="#delete-event">Excluso de eventos</a></li>
     22     </ol>
     23   </li>
     24   <li><a href="#attendees">Tabela de participantes</a>
     25 <ol>
     26       <li><a href="#add-attendees">Adio de participantes</a></li>
     27     </ol>
     28   </li>
     29   <li><a href="#reminders">Tabela de lembretes</a>
     30 <ol>
     31       <li><a href="#add-reminders">Adio de lembretes</a></li>
     32     </ol>
     33   </li>
     34   <li><a href="#instances">Tabela de instncias</a>
     35   <ol>
     36       <li><a href="#query-instances">Consulta na tabela de instncias</a></li>
     37   </ol></li>
     38   <li><a href="#intents">Intenes do Agenda</a>
     39   <ol>
     40       <li><a href="#intent-insert">Uso de uma inteno para inserir um evento</a></li>
     41       <li><a href="#intent-edit">Uso de uma inteno para editar um evento</a></li>
     42       <li><a href="#intent-view">Uso de intenes para exibir dados de agenda</a></li>
     43     </ol>
     44   </li>
     45   
     46   <li><a href="#sync-adapter">Adaptadores de sincronizao</a></li>
     47 </ol>
     48 
     49     <h2>Classes principais</h2>
     50     <ol>
     51       <li>{@link android.provider.CalendarContract.Calendars}</li>
     52       <li>{@link android.provider.CalendarContract.Events}</li>
     53       <li>{@link android.provider.CalendarContract.Attendees}</li>
     54       <li>{@link android.provider.CalendarContract.Reminders}</li>
     55     </ol>
     56 </div>
     57 </div>
     58 
     59 <p>O Provedor de agenda  um repositrio para eventos da agenda do usurio. A
     60 API do Provedor de Agenda permite consultar, inserir, atualizar e excluir
     61 operaes em agendas, eventos, participantes, lembretes etc.</p>
     62 
     63 
     64 <p>A API do Provedor de Agenda pode ser usada por aplicativos e adaptadores de sincronizao. As regras
     65 variam conforme o tipo de programa que realiza as chamadas. Este documento
     66 se concentra principalmente no uso da API do Provedor de Agenda como um aplicativo. Veja
     67 uma discusso sobre as diferenas entre adaptadores de sincronizao em
     68 <a href="#sync-adapter">Adaptadores de sincronizao</a>.</p>
     69 
     70 
     71 <p>Normalmente, para ler ou programar dados da agenda, o manifesto de um aplicativo deve
     72 conter as permisses adequadas descritas em <a href="#manifest">Permisses
     73 do usurio</a>. Para facilitar a realizao de operaes comuns, o Provedor
     74 de Agenda fornece um conjunto de intenes conforme descrito em <a href="#intents">Intenes
     75 do Agenda</a>. Essas intenes levam os usurios ao aplicativo Agenda para inserir, exibir
     76 e editar eventos. O usurio interage com o aplicativo Agenda e, em seguida,
     77 retorna ao aplicativo original. Assim, o aplicativo no precisa solicitar permisses
     78 nem fornecer uma interface grfica para exibir ou criar eventos.</p>
     79 
     80 <h2 id="overview">Conceitos bsicos</h2>
     81 
     82 <p>Os <a href="{@docRoot}guide/topics/providers/content-providers.html">provedores de contedo</a> armazenam dados e disponibilizam-nos
     83 para aplicativos. Os provedores de contedo oferecidos pela plataforma do Android (inclusive o Provedor de Agenda) normalmente expem dados como um conjunto de tabelas baseadas em
     84 um modelo de banco de dados relacional, em que cada linha  um registro e cada coluna so dados
     85 de um tipo e significado especfico. Por meio da API do Provedor de Agenda, aplicativos
     86 e adaptadores de sincronizao podem obter acesso de leitura/gravao s tabelas do banco de dados que armazenam
     87 dados da agenda do usurio.</p>
     88 
     89 <p>Cada provedor de contedo expe uma URI pblica (agrupada como
     90 um objeto {@link android.net.Uri}
     91 ) que identifica exclusivamente seu conjunto de dados.  Um provedor de contedo que controla
     92 diversos conjuntos de dados (diversas tabelas) expe uma URI separada para cada um.  Todas as
     93 URIs de provedores comeam com a string "content://".  Ela
     94 identifica os dados como controlados por um provedor de contedo. O Provedor
     95 de Agenda define constantes para as URIs de cada uma das classes (tabelas). Essas
     96 URIs tm o formato <code><em>&lt;class&gt;</em>.CONTENT_URI</code>. Por exemplo:
     97  {@link android.provider.CalendarContract.Events#CONTENT_URI Events.CONTENT_URI}.</p>
     98 
     99 <p>A figura 1 exibe uma representao grfica do modelo de dados do Provedor de Agenda. Ela ilustra
    100 as tabelas e os campos principais que as vinculam entre si.</p>
    101 
    102 <img src="{@docRoot}images/providers/datamodel.png" alt="Calendar Provider Data Model" />
    103 <p class="img-caption"><strong>Figura 1.</strong> Modelo de dados do Provedor de Agenda.</p>
    104 
    105 <p>Cada usurio pode ter diversas agendas e diferentes agendas podem ser associadas a diferentes tipos de conta (Google Agenda, Exchange etc.).</p>
    106 
    107 <p>O {@link android.provider.CalendarContract} define o modelo de dados de informaes relacionadas a eventos e agendas. Esses dados so armazenados em diversas tabelas, que so listadas a seguir.</p>
    108 
    109 <table>
    110   <tr>
    111     <th>Tabela (classe)</th>
    112     <th>Descrio</th>
    113   </tr>
    114   <tr>
    115     <td><p>{@link android.provider.CalendarContract.Calendars}</p></td>
    116     
    117     <td>Essa tabela contm
    118 as informaes especficas da agenda. Cada linha nessa tabela contm os detalhes
    119 de uma nica agenda, como nome, cor, informaes de sincronizao etc.</td>
    120   </tr>
    121   <tr>
    122     <td>{@link android.provider.CalendarContract.Events}</td>
    123     
    124     <td>Essa tabela contm
    125 as informaes especficas do evento. Cada linha nessa tabela tem as informaes de um nico
    126 evento &mdash; por exemplo: ttulo do evento, local, horrio de incio, horrio
    127 de trmino etc. O evento pode ocorrer uma vez ou diversas vezes. Os participantes,
    128 lembretes e propriedades estendidas so armazenados em tabelas separadas. 
    129 Cada um deles tem um {@link android.provider.CalendarContract.AttendeesColumns#EVENT_ID}
    130 que referencia o {@link android.provider.BaseColumns#_ID} na tabela de eventos.</td>
    131 
    132   </tr>
    133   <tr>
    134     <td>{@link android.provider.CalendarContract.Instances}</td>
    135     
    136     <td>Essa tabela contm os
    137 horrios de incio e trmino para cada ocorrncia em um evento. Cada linha nessa tabela
    138 representa uma nica ocorrncia do evento. Para eventos de ocorrncia nica, h um mapeamento 1:1
    139 de instncias para eventos. Para eventos recorrentes, diversas linhas correspondentes
    140 a diversas ocorrncias daquele evento so geradas automaticamente.</td>
    141   </tr>
    142   <tr>
    143     <td>{@link android.provider.CalendarContract.Attendees}</td>
    144     
    145     <td>Essa tabela contm
    146 as informaes dos participantes (convidados) do evento. Cada linha representa um nico convidado
    147 de um evento. Ela especifica o tipo de convidado e a resposta quanto  participao do convidado
    148 no evento.</td>
    149   </tr>
    150   <tr>
    151     <td>{@link android.provider.CalendarContract.Reminders}</td>
    152     
    153     <td>Essa tabela contm os
    154 dados de alerta/notificao. Cada linha representa um nico alerta de um evento. Um evento
    155 pode ter vrios lembretes. O nmero mximo de lembretes por evento
    156  especificado em
    157 {@link android.provider.CalendarContract.CalendarColumns#MAX_REMINDERS},
    158 que  definido pelo adaptador de sincronizao
    159 que possui a agenda fornecida. Os lembretes so especificados em minutos antes do evento
    160 e tm um mtodo que determina a forma de alertar o usurio.</td>
    161   </tr>
    162   
    163 </table>
    164 
    165 <p>A API do Provedor de Agenda  projetada para ser flexvel e poderosa. Ao mesmo tempo,
    166  importante fornecer uma boa experincia ao usurio final
    167 e proteger a integridade da agenda e de seus dados. Para isso, a seguir apresentam-se
    168 alguns pontos a considerar ao usar a API:</p>
    169 
    170 <ul>
    171 
    172 <li><strong>Insero, atualizao e exibio de eventos da agenda.</strong> Para inserir, modificar e ler eventos diretamente do provedor de agenda,  necessrio ter as <a href="#manifest">permisses</a> apropriadas. Contudo, se o aplicativo em criao no for um aplicativo de agenda totalmente desenvolvido nem um adaptador de sincronizao, no ser necessrio solicitar essas permisses. Em vez disso, podem-se usar intenes compatveis com o aplicativo Agenda do Android para entregar operaes de leitura e gravao a esse aplicativo. Ao usar as intenes, o aplicativo envia usurios ao aplicativo Agenda para realizar a operao desejada
    173 em um formulrio pr-preenchido. Aps finalizarem a operao, eles sero direcionados de volta ao aplicativo.
    174 Ao projetar seu aplicativo para realizar operaes comuns atravs do Agenda,
    175 os usurios tm uma experincia em uma interface robusta e consistente. Essa 
    176 a abordagem recomendada. Para obter mais informaes, consulte <a href="#intents">Intenes
    177 do Agenda</a>.</p>
    178 
    179 
    180 <li><strong>Adaptadores de sincronizao.</strong> Os adaptadores de sincronizao sincronizam os dados da agenda
    181 em um dispositivo do usurio com outro servidor ou fonte de dados. Nas tabelas
    182 {@link android.provider.CalendarContract.Calendars}
    183 e {@link android.provider.CalendarContract.Events},
    184 h colunas reservadas para o uso dos adaptadores de sincronizao.
    185 O provedor e os aplicativos no devem modific-las. De fato, elas no so
    186 visveis a menos que sejam acessadas como um adaptador de sincronizao. Para obter mais informaes sobre
    187 adaptadores de sincronizao, consulte <a href="#sync-adapter">Adaptadores de sincronizao</a>.</li>
    188 
    189 </ul>
    190 
    191 
    192 <h2 id="manifest">Permisses do usurio</h2>
    193 
    194 <p>Para ler dados da agenda, o aplicativo deve conter a permisso {@link
    195 android.Manifest.permission#READ_CALENDAR} no arquivo de manifesto. Ele
    196 deve conter a permisso {@link android.Manifest.permission#WRITE_CALENDAR}
    197 para excluir, inserir ou atualizar dados da agenda:</p>
    198 
    199 <pre>
    200 &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
    201 &lt;manifest xmlns:android=&quot;http://schemas.android.com/apk/res/android"...>;
    202     &lt;uses-sdk android:minSdkVersion=&quot;14&quot; /&gt;
    203     &lt;uses-permission android:name=&quot;android.permission.READ_CALENDAR&quot; /&gt;
    204     &lt;uses-permission android:name=&quot;android.permission.WRITE_CALENDAR&quot; /&gt;
    205     ...
    206 &lt;/manifest&gt;
    207 </pre>
    208 
    209 
    210 <h2 id="calendar">Tabela de agendas</h2>
    211 
    212 <p>A tabela {@link android.provider.CalendarContract.Calendars} contm detalhes
    213 de agendas individuais. As colunas
    214 Agendas a seguir so gravveis tanto por aplicativos quanto por <a href="#sync-adapter">adaptadores de sincronizao</a>. 
    215 Para obter uma lista completa de campos compatveis, consulte
    216 a referncia {@link android.provider.CalendarContract.Calendars}</p>
    217 <table>
    218   <tr>
    219     <th>Constante</th>
    220     <th>Descrio</th>
    221   </tr>
    222   <tr>
    223     <td>{@link android.provider.CalendarContract.Calendars#NAME}</td>
    224     <td>O nome da agenda.</td>
    225   </tr>
    226   <tr>
    227     <td>{@link android.provider.CalendarContract.Calendars#CALENDAR_DISPLAY_NAME}</td>
    228     <td>O nome desta agenda que  exibido ao usurio.</td>
    229   </tr>
    230   <tr>
    231     <td>{@link android.provider.CalendarContract.Calendars#VISIBLE}</td>
    232     
    233     <td>Um booleano indicando se a agenda foi selecionada para ser exibida. Um valor
    234 de 0 indica que eventos associados a essa agenda no devem ser
    235 exibidos.  Um valor de 1 indica que eventos associados a essa agenda devem
    236 ser exibidos. Esse valor afeta a gerao de linhas na tabela {@link
    237 android.provider.CalendarContract.Instances}.</td>
    238 
    239 
    240   </tr>
    241   <tr>
    242     <td>{@link android.provider.CalendarContract.CalendarColumns#SYNC_EVENTS}</td>
    243     
    244     <td>Um booleano que indica se a agenda deve ser sincronizada e ter
    245 os eventos armazenados no dispositivo. Um valor de 0 indica a no sincronizao dessa agenda
    246 e o no armazenamento dos eventos no dispositivo.  Um valor de 1 indica a sincronizao dos eventos dessa agenda
    247 e o armazenamento dos eventos no dispositivo.</td>
    248   </tr>
    249 </table>
    250 
    251 <h3 id="query">Consulta em uma agenda</h3>
    252 
    253 <p>A seguir h um exemplo que mostra como obter as agendas de propriedade de determinado
    254 usurio. Para simplificar o exemplo, a operao de consulta  exibida no
    255 encadeamento da interface do usurio ("encadeamento principal"). Na prtica, isso deve ser feito em um encadeamento
    256 assncrono em vez de no encadeamento principal. Para ver mais discusses, consulte 
    257 <a href="{@docRoot}guide/components/loaders.html">Carregadores</a>. Se voc no estiver somente
    258 lendo dados, mas modificando-os, consulte {@link android.content.AsyncQueryHandler}.
    259 </p>
    260 
    261 
    262 <pre>
    263 // Projection array. Creating indices for this array instead of doing
    264 // dynamic lookups improves performance.
    265 public static final String[] EVENT_PROJECTION = new String[] {
    266     Calendars._ID,                           // 0
    267     Calendars.ACCOUNT_NAME,                  // 1
    268     Calendars.CALENDAR_DISPLAY_NAME,         // 2
    269     Calendars.OWNER_ACCOUNT                  // 3
    270 };
    271   
    272 // The indices for the projection array above.
    273 private static final int PROJECTION_ID_INDEX = 0;
    274 private static final int PROJECTION_ACCOUNT_NAME_INDEX = 1;
    275 private static final int PROJECTION_DISPLAY_NAME_INDEX = 2;
    276 private static final int PROJECTION_OWNER_ACCOUNT_INDEX = 3;</pre>
    277   
    278 
    279 <div class="sidebox-wrapper"> <div class="sidebox"> <h3>Por que incluir
    280 ACCOUNT_TYPE?</h3> <p>Ao consultar um {@link
    281 android.provider.CalendarContract.Calendars#ACCOUNT_NAME
    282 Calendars.ACCOUNT_NAME},  necessrio incluir
    283 {@link android.provider.CalendarContract.Calendars#ACCOUNT_TYPE Calendars.ACCOUNT_TYPE}
    284 na seleo. Isso porque determinada conta
    285 s  considerada exclusiva devido a seus <code>ACCOUNT_NAME</code>
    286 e <code>ACCOUNT_TYPE</code>. <code>ACCOUNT_TYPE</code>  a string correspondente
    287 ao autenticador da conta que foi usado quando ela foi registrada com
    288 o {@link android.accounts.AccountManager}. H tambm um tipo especial de conta chamado {@link
    289 android.provider.CalendarContract#ACCOUNT_TYPE_LOCAL} para agendas
    290 no associadas a nenhuma conta do dispositivo. Contas {@link
    291 android.provider.CalendarContract#ACCOUNT_TYPE_LOCAL} no so
    292 sincronizadas.</p> </div> </div> 
    293 
    294 
    295 <p> Na prxima parte do exemplo, voc construir a consulta. A seleo
    296 especifica os critrios da consulta. Neste exemplo, a consulta busca
    297 agendas que tenham o <code>ACCOUNT_NAME</code>
    298 "sampleuser (a] google.com", o <code>ACCOUNT_TYPE</code>
    299 "com.google" e o <code>OWNER_ACCOUNT</code>
    300 "sampleuser (a] google.com". Para ver todas as agendas que um usurio
    301 tenha exibido, no somente as que ele possui, omita o <code>OWNER_ACCOUNT</code>.
    302 A consulta retorna um objeto {@link android.database.Cursor}
    303 que pode ser usado para cruzar o conjunto de resultados retornado pela consulta
    304 do banco de dados. Para ver mais informaes sobre o uso de consultas em provedores de contedo,
    305 consulte <a href="{@docRoot}guide/topics/providers/content-providers.html">Provedores de contedo</a>.</p>
    306 
    307 
    308 <pre>// Run query
    309 Cursor cur = null;
    310 ContentResolver cr = getContentResolver();
    311 Uri uri = Calendars.CONTENT_URI;   
    312 String selection = "((" + Calendars.ACCOUNT_NAME + " = ?) AND (" 
    313                         + Calendars.ACCOUNT_TYPE + " = ?) AND ("
    314                         + Calendars.OWNER_ACCOUNT + " = ?))";
    315 String[] selectionArgs = new String[] {"sampleuser (a] gmail.com", "com.google",
    316         "sampleuser (a] gmail.com"}; 
    317 // Submit the query and get a Cursor object back. 
    318 cur = cr.query(uri, EVENT_PROJECTION, selection, selectionArgs, null);</pre>
    319 
    320 <p>Essa prxima seo usa o cursor para avanar pelo conjunto de resultados. Ele usa
    321 as constantes definidas no incio do exemplo para retornar os valores
    322 de cada campo.</p>
    323     
    324 <pre>// Use the cursor to step through the returned records
    325 while (cur.moveToNext()) {
    326     long calID = 0;
    327     String displayName = null;
    328     String accountName = null;
    329     String ownerName = null;
    330       
    331     // Get the field values
    332     calID = cur.getLong(PROJECTION_ID_INDEX);
    333     displayName = cur.getString(PROJECTION_DISPLAY_NAME_INDEX);
    334     accountName = cur.getString(PROJECTION_ACCOUNT_NAME_INDEX);
    335     ownerName = cur.getString(PROJECTION_OWNER_ACCOUNT_INDEX);
    336               
    337     // Do something with the values...
    338 
    339    ...
    340 }
    341 </pre>
    342   
    343 <h3 id="modify-calendar">Modificao de uma agenda</h3>
    344 
    345 <p>Para realizar uma atualizao de uma agenda,  possvel fornecer o {@link
    346 android.provider.BaseColumns#_ID} da agenda como um ID anexado 
    347 URI
    348 
    349 ({@link android.content.ContentUris#withAppendedId(android.net.Uri,long) withAppendedId()})
    350 ou como o primeiro item de seleo. A seleo
    351 deve iniciar com <code>&quot;_id=?&quot;</code> e o primeiro
    352 <code>selectionArg</code> deve ser o {@link
    353 android.provider.BaseColumns#_ID} da agenda. 
    354 Tambm  possvel realizar atualizaes com codificaes do ID na URI. Este exemplo altera
    355 o nome de exibio de uma agenda usando a
    356 abordagem
    357 ({@link android.content.ContentUris#withAppendedId(android.net.Uri,long) withAppendedId()}):</p>
    358 
    359 <pre>private static final String DEBUG_TAG = "MyActivity";
    360 ...
    361 long calID = 2;
    362 ContentValues values = new ContentValues();
    363 // The new display name for the calendar
    364 values.put(Calendars.CALENDAR_DISPLAY_NAME, &quot;Trevor's Calendar&quot;);
    365 Uri updateUri = ContentUris.withAppendedId(Calendars.CONTENT_URI, calID);
    366 int rows = getContentResolver().update(updateUri, values, null, null);
    367 Log.i(DEBUG_TAG, &quot;Rows updated: &quot; + rows);</pre>
    368 
    369 <h3 id="insert-calendar">Insero de uma agenda</h2>
    370 
    371 <p>Agendas so projetadas para serem gerenciadas principalmente por um adaptador de sincronizao, por isso
    372 deve-se inserir somente novas agendas como um adaptador de sincronizao. Para a maior parte,
    373 aplicativos s podem efetuar mudanas superficiais em agendas, como mudar o nome de exibio. Se
    374 um aplicativo precisa criar uma agenda local, pode faz-lo realizando
    375 a insero da agenda como um adaptador de sincronizao usando um {@link
    376 android.provider.CalendarContract.SyncColumns#ACCOUNT_TYPE} de {@link
    377 android.provider.CalendarContract#ACCOUNT_TYPE_LOCAL}.
    378 {@link android.provider.CalendarContract#ACCOUNT_TYPE_LOCAL}
    379  um tipo de conta especial para agendas
    380 no associado a nenhuma conta do dispositivo. Agendas desse tipo no so sincronizadas com um servidor. Para 
    381 ver discusses sobre adaptadores de sincronizao, consulte <a href="#sync-adapter">Adaptadores de sincronizao</a>.</p>
    382 
    383 <h2 id="events">Tabela de eventos</h2>
    384 
    385 <p>A tabela {@link android.provider.CalendarContract.Events} contm detalhes
    386 de eventos individuais. Para adicionar, atualizar ou excluir eventos, um aplicativo deve
    387 conter a permisso {@link android.Manifest.permission#WRITE_CALENDAR} 
    388 no <a href="#manifest">arquivo de manifesto</a>.</p>
    389 
    390 <p>As colunas de Eventos a seguir so gravveis tanto por um aplicativo quanto por um adaptador
    391 de sincronizao. Para obter uma lista completa de campos compatveis, consulte a referncia de {@link
    392 android.provider.CalendarContract.Events}.</p>
    393 
    394 <table>
    395   <tr>
    396     <th>Constante</th>
    397     <th>Descrio</th>
    398   </tr>
    399   <tr>
    400     <td>{@link android.provider.CalendarContract.EventsColumns#CALENDAR_ID}</td>
    401     <td>O {@link android.provider.BaseColumns#_ID} da agenda  qual o evento pertence.</td>
    402   </tr>
    403   <tr>
    404     <td>{@link android.provider.CalendarContract.EventsColumns#ORGANIZER}</td>
    405     <td>E-mail do organizador (dono) do evento.</td>
    406   </tr>
    407   <tr>
    408     <td>{@link android.provider.CalendarContract.EventsColumns#TITLE}</td>
    409     <td>O ttulo do evento.</td>
    410   </tr>
    411   <tr>
    412     <td>{@link android.provider.CalendarContract.EventsColumns#EVENT_LOCATION}</td>
    413     <td>Onde o evento acontece. </td>
    414   </tr>
    415   <tr>
    416     <td>{@link android.provider.CalendarContract.EventsColumns#DESCRIPTION}</td>
    417     <td>A descrio do evento.</td>
    418   </tr>
    419   <tr>
    420     <td>{@link android.provider.CalendarContract.EventsColumns#DTSTART}</td>
    421     <td>O horrio de incio do evento em milissegundos em UTC desde a poca. </td>
    422   </tr>
    423   <tr>
    424     <td>{@link android.provider.CalendarContract.EventsColumns#DTEND}</td>
    425     <td>O horrio de trmino do evento em milissegundos em UTC desde a poca. </td>
    426   </tr>
    427   <tr>
    428     <td>{@link android.provider.CalendarContract.EventsColumns#EVENT_TIMEZONE}</td>
    429     <td>O fuso horrio do evento.</td>
    430   </tr>
    431   <tr>
    432     <td>{@link android.provider.CalendarContract.EventsColumns#EVENT_END_TIMEZONE}</td>
    433     <td>O fuso horrio do horrio de trmino do evento.</td>
    434   </tr>
    435   <tr>
    436     <td>{@link android.provider.CalendarContract.EventsColumns#DURATION}</td>
    437     
    438     <td>A durao do evento em formato <a href="http://tools.ietf.org/html/rfc5545#section-3.8.2.5">RCF5545</a>.
    439 Por exemplo, um valor de <code>&quot;PT1H&quot;</code> indica que o evento
    440 deve durar uma hora, e um valor de <code>&quot;P2W&quot;</code> indica
    441 uma durao de 2 semanas. </td>
    442 
    443 
    444   </tr>
    445   <tr>
    446     <td>{@link android.provider.CalendarContract.EventsColumns#ALL_DAY}</td>
    447     
    448     <td>Um valor de 1 indica que esse evento ocupa o dia inteiro, como definido
    449 pelo fuso horrio local. Um valor de 0 indica que  um evento comum que pode iniciar
    450 e terminar a qualquer momento durante um dia.</td>
    451 
    452     
    453   </tr>
    454   
    455   
    456   <tr>
    457     <td>{@link android.provider.CalendarContract.EventsColumns#RRULE}</td>
    458     
    459     <td>A regra de recorrncia do formato do evento. Por
    460 exemplo, <code>&quot;FREQ=WEEKLY;COUNT=10;WKST=SU&quot;</code>. Veja
    461 mais exemplos <a href="http://tools.ietf.org/html/rfc5545#section-3.8.5.3">aqui</a>.</td>
    462     
    463   </tr>
    464   
    465   <tr>
    466     <td>{@link android.provider.CalendarContract.EventsColumns#RDATE}</td>
    467     <td>As datas de recorrncia do evento. 
    468     Normalmente, usa-se {@link android.provider.CalendarContract.EventsColumns#RDATE} 
    469     em conjunto com {@link android.provider.CalendarContract.EventsColumns#RRULE} 
    470     para definir um conjunto agregado
    471 de ocorrncias repetidas. Para ver mais discusses, consulte <a href="http://tools.ietf.org/html/rfc5545#section-3.8.5.2">Especificao RFC5545</a>.</td>
    472 </tr>
    473  
    474   <tr>
    475     <td>{@link android.provider.CalendarContract.EventsColumns#AVAILABILITY}</td>
    476     
    477     <td>Se esse evento considera tempo ocupado ou se h tempo livre que pode ser
    478 reagendado. </td>
    479     
    480   </tr>
    481   <tr>
    482     <td>{@link android.provider.CalendarContract.EventsColumns#GUESTS_CAN_MODIFY}</td>
    483     <td>Se convidados podem modificar o evento. </td>
    484   </tr>
    485   <tr>
    486     <td>{@link android.provider.CalendarContract.EventsColumns#GUESTS_CAN_INVITE_OTHERS}</td>
    487     <td>Se convidados podem convidar outros. </td>
    488   </tr>
    489   <tr>
    490     <td>{@link android.provider.CalendarContract.EventsColumns#GUESTS_CAN_SEE_GUESTS}</td>
    491     <td>Se convidados podem ver a lista de participantes.</td>
    492   </tr>
    493 </table>
    494 
    495 <h3 id="add-event">Adio de eventos</h3>
    496 
    497 <p>Quando o aplicativo insere um novo evento, recomenda-se usar
    498 uma inteno {@link android.content.Intent#ACTION_INSERT INSERT}, como descrito em <a href="#intent-insert">Uso de uma inteno para inserir um evento</a>. Contudo, se for
    499 necessrio,  possvel inserir eventos diretamente. Esta seo descreve como
    500 faz-lo.</p>
    501 
    502 
    503 <p>Abaixo apresentam-se as regras para insero de um novo evento: </p>
    504 <ul>
    505 
    506   <li> necessrio incluir {@link
    507 android.provider.CalendarContract.EventsColumns#CALENDAR_ID} e {@link
    508 android.provider.CalendarContract.EventsColumns#DTSTART}.</li>
    509 
    510 <li> necessrio incluir um {@link
    511 android.provider.CalendarContract.EventsColumns#EVENT_TIMEZONE}. Para obter uma lista
    512 dos IDs de fuso horrio instalados do sistema, use {@link
    513 java.util.TimeZone#getAvailableIDs()}. Observe que essa regra no se aplica
    514 a inseres de evento pela inteno {@link
    515 android.content.Intent#ACTION_INSERT INSERT} descrita em <a href="#intent-insert">Uso de uma inteno para inserir um evento</a> &mdash; nesta
    516 situao,  fornecido um fuso horrio padro.</li>
    517   
    518   <li>Para eventos no recorrentes,  preciso incluir {@link
    519 android.provider.CalendarContract.EventsColumns#DTEND}. </li>
    520   
    521   
    522   <li>Para eventos recorrentes,  necessrio incluir uma {@link
    523 android.provider.CalendarContract.EventsColumns#DURATION} alm de uma {@link
    524 android.provider.CalendarContract.EventsColumns#RRULE} ou {@link
    525 android.provider.CalendarContract.EventsColumns#RDATE}. Observe que essa regra no se aplica
    526 a inseres de evento pela inteno {@link
    527 android.content.Intent#ACTION_INSERT INSERT} descrita em <a href="#intent-insert">Uso de uma inteno para inserir um evento</a> &mdash; nessa situao,
    528  possvel usar uma {@link
    529 android.provider.CalendarContract.EventsColumns#RRULE} em conjunto com {@link android.provider.CalendarContract.EventsColumns#DTSTART} e {@link android.provider.CalendarContract.EventsColumns#DTEND}. Desta forma, o aplicativo Agenda
    530 a converte em uma durao automaticamente.</li>
    531   
    532 </ul>
    533 
    534 <p>A seguir h um exemplo de insero de um evento: para simplificar, isso est sendo realizado
    535 no encadeamento da IU. Na prtica, inseres e atualizaes devem ser feitas
    536 em um encadeamento assncrono para mover a ao para um encadeamento de segundo plano. Para obter
    537 mais informaes, consulte {@link android.content.AsyncQueryHandler}.</p>
    538 
    539 
    540 <pre>
    541 long calID = 3;
    542 long startMillis = 0; 
    543 long endMillis = 0;     
    544 Calendar beginTime = Calendar.getInstance();
    545 beginTime.set(2012, 9, 14, 7, 30);
    546 startMillis = beginTime.getTimeInMillis();
    547 Calendar endTime = Calendar.getInstance();
    548 endTime.set(2012, 9, 14, 8, 45);
    549 endMillis = endTime.getTimeInMillis();
    550 ...
    551 
    552 ContentResolver cr = getContentResolver();
    553 ContentValues values = new ContentValues();
    554 values.put(Events.DTSTART, startMillis);
    555 values.put(Events.DTEND, endMillis);
    556 values.put(Events.TITLE, &quot;Jazzercise&quot;);
    557 values.put(Events.DESCRIPTION, &quot;Group workout&quot;);
    558 values.put(Events.CALENDAR_ID, calID);
    559 values.put(Events.EVENT_TIMEZONE, "America/Los_Angeles");
    560 Uri uri = cr.insert(Events.CONTENT_URI, values);
    561 
    562 // get the event ID that is the last element in the Uri
    563 long eventID = Long.parseLong(uri.getLastPathSegment());
    564 // 
    565 // ... do something with event ID
    566 //
    567 //</pre>
    568 
    569 <p class="note"><strong>Observao:</strong> veja como este exemplo captura o ID
    570 do evento depois que o evento  criado. Este  o modo mais fcil de obter um ID de evento. Muitas vezes o ID do evento
    571  necessrio para realizar outras operaes de agenda &mdash; por exemplo, adicionar
    572 participantes ou lembretes a um evento.</p>
    573 
    574 
    575 <h3 id="update-event">Atualizao de eventos</h3>
    576 
    577 <p>Quando o aplicativo deseja permitir que o usurio edite um evento,  recomendvel
    578 usar uma inteno {@link android.content.Intent#ACTION_EDIT EDIT}, como
    579 descrito em <a href="#intent-edit">Uso de uma inteno para editar um evento</a>.
    580 Contudo, se for necessrio,  possvel editar eventos diretamente. Para realizar uma atualizao
    581 de um evento,  possvel fornecer o <code>_ID</code>
    582 do evento como um ID anexado  URI ({@link
    583 android.content.ContentUris#withAppendedId(android.net.Uri,long) withAppendedId()})
    584 ou como o primeiro item de seleo. 
    585 A seleo deve iniciar com <code>&quot;_id=?&quot;</code> e o primeiro
    586 <code>selectionArg</code> deve ser o <code>_ID</code> do evento. Voc tambm
    587 pode realizar atualizaes usando uma seleo sem ID. A seguir h um exemplo de como atualizar
    588 um evento.  possvel mudar o ttulo do evento usando
    589 a abordagem
    590 {@link android.content.ContentUris#withAppendedId(android.net.Uri,long) withAppendedId()}:</p>
    591 
    592 
    593 <pre>private static final String DEBUG_TAG = "MyActivity";
    594 ...
    595 long eventID = 188;
    596 ...
    597 ContentResolver cr = getContentResolver();
    598 ContentValues values = new ContentValues();
    599 Uri updateUri = null;
    600 // The new title for the event
    601 values.put(Events.TITLE, &quot;Kickboxing&quot;); 
    602 updateUri = ContentUris.withAppendedId(Events.CONTENT_URI, eventID);
    603 int rows = getContentResolver().update(updateUri, values, null, null);
    604 Log.i(DEBUG_TAG, &quot;Rows updated: &quot; + rows);  </pre>
    605 
    606 <h3 id="delete-event">Excluso de eventos</h3>
    607 
    608 <p>Pode-se excluir um evento tanto pelo {@link
    609 android.provider.BaseColumns#_ID} como um ID anexado na URI quanto usando-se
    610 a seleo padro. Ao usar um ID anexado, no  possvel fazer selees.
    611 H duas verses de excluso: como aplicativo e como adaptador de sincronizao. 
    612 A excluso por um aplicativo define as colunas <em>excludas</em> como 1. Esse sinalizador  que diz
    613 ao adaptador de sincronizao que a linha foi excluda e que essa excluso deve ser
    614 propagada para o servidor. A excluso por um adaptador de sincronizao remove o evento
    615 do banco de dados junto com todos os dados associados. A seguir h um exemplo de um aplicativo
    616 excluindo um evento pelo seu {@link android.provider.BaseColumns#_ID}:</p>
    617 
    618 
    619 <pre>private static final String DEBUG_TAG = "MyActivity";
    620 ...
    621 long eventID = 201;
    622 ...
    623 ContentResolver cr = getContentResolver();
    624 ContentValues values = new ContentValues();
    625 Uri deleteUri = null;
    626 deleteUri = ContentUris.withAppendedId(Events.CONTENT_URI, eventID);
    627 int rows = getContentResolver().delete(deleteUri, null, null);
    628 Log.i(DEBUG_TAG, &quot;Rows deleted: &quot; + rows);  
    629 </pre>
    630 
    631 <h2 id="attendees">Tabela de participantes</h2>
    632 
    633 <p>Cada linha da tabela {@link android.provider.CalendarContract.Attendees}
    634 representa um nico participante ou convidado de um evento. Chamar
    635 {@link android.provider.CalendarContract.Reminders#query(android.content.ContentResolver, long, java.lang.String[]) query()}
    636 retorna uma lista de participantes para
    637 o evento com o {@link android.provider.CalendarContract.AttendeesColumns#EVENT_ID} dado. 
    638 Esse {@link android.provider.CalendarContract.AttendeesColumns#EVENT_ID}
    639 deve corresponder ao {@link
    640 android.provider.BaseColumns#_ID} de determinado evento.</p> 
    641 
    642 <p>A tabela a seguir lista
    643 os campos gravveis. Ao inserir um novo participante,  necessrio incluir todos eles
    644 exceto <code>ATTENDEE_NAME</code>.
    645 </p>
    646 
    647 
    648 <table>
    649   <tr>
    650     <th>Constante</th>
    651     <th>Descrio</th>
    652   </tr>
    653   <tr>
    654     <td>{@link android.provider.CalendarContract.AttendeesColumns#EVENT_ID}</td>
    655     <td>O ID do evento.</td>
    656   </tr>
    657   <tr>
    658     <td>{@link android.provider.CalendarContract.AttendeesColumns#ATTENDEE_NAME}</td>
    659     <td>O nome do participante.</td>
    660   </tr>
    661   <tr>
    662     <td>{@link android.provider.CalendarContract.AttendeesColumns#ATTENDEE_EMAIL}</td>
    663     <td>O endereo de e-mail do participante.</td>
    664   </tr>
    665   <tr>
    666     <td>{@link android.provider.CalendarContract.AttendeesColumns#ATTENDEE_RELATIONSHIP}</td>
    667     <td><p>A relao do participante com o evento. Uma das seguintes:</p>
    668       <ul>
    669         <li>{@link android.provider.CalendarContract.AttendeesColumns#RELATIONSHIP_ATTENDEE}</li>
    670         <li>{@link android.provider.CalendarContract.AttendeesColumns#RELATIONSHIP_NONE}</li>
    671         <li>{@link android.provider.CalendarContract.AttendeesColumns#RELATIONSHIP_ORGANIZER}</li>
    672         <li>{@link android.provider.CalendarContract.AttendeesColumns#RELATIONSHIP_PERFORMER}</li>
    673         <li>{@link android.provider.CalendarContract.AttendeesColumns#RELATIONSHIP_SPEAKER}</li>
    674     </ul>
    675     </td>
    676   </tr>
    677   <tr>
    678     <td>{@link android.provider.CalendarContract.AttendeesColumns#ATTENDEE_TYPE}</td>
    679     <td><p>O tipo de participante. Uma das seguintes: </p>
    680       <ul>
    681         <li>{@link android.provider.CalendarContract.AttendeesColumns#TYPE_REQUIRED}</li>
    682         <li>{@link android.provider.CalendarContract.AttendeesColumns#TYPE_OPTIONAL}</li>
    683     </ul></td>
    684   </tr>
    685   <tr>
    686     <td>{@link android.provider.CalendarContract.AttendeesColumns#ATTENDEE_STATUS}</td>
    687     <td><p>O status de participao do participante. Uma das seguintes:</p>
    688       <ul>
    689         <li>{@link android.provider.CalendarContract.AttendeesColumns#ATTENDEE_STATUS_ACCEPTED}</li>
    690         <li>{@link android.provider.CalendarContract.AttendeesColumns#ATTENDEE_STATUS_DECLINED}</li>
    691         <li>{@link android.provider.CalendarContract.AttendeesColumns#ATTENDEE_STATUS_INVITED}</li>
    692         <li>{@link android.provider.CalendarContract.AttendeesColumns#ATTENDEE_STATUS_NONE}</li>
    693         <li>{@link android.provider.CalendarContract.AttendeesColumns#ATTENDEE_STATUS_TENTATIVE}</li>
    694     </ul></td>
    695   </tr>
    696 </table>
    697 
    698 <h3 id="add-attendees">Adio de participantes</h3>
    699 
    700 <p>A seguir h um exemplo que adiciona um nico participante a um evento. Observe que
    701 o {@link android.provider.CalendarContract.AttendeesColumns#EVENT_ID}
    702  obrigatrio:</p>
    703 
    704 <pre>
    705 long eventID = 202;
    706 ...
    707 ContentResolver cr = getContentResolver();
    708 ContentValues values = new ContentValues();
    709 values.put(Attendees.ATTENDEE_NAME, &quot;Trevor&quot;);
    710 values.put(Attendees.ATTENDEE_EMAIL, &quot;trevor (a] example.com&quot;);
    711 values.put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_ATTENDEE);
    712 values.put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_OPTIONAL);
    713 values.put(Attendees.ATTENDEE_STATUS, Attendees.ATTENDEE_STATUS_INVITED);
    714 values.put(Attendees.EVENT_ID, eventID);
    715 Uri uri = cr.insert(Attendees.CONTENT_URI, values);
    716 </pre>
    717 
    718 <h2 id="reminders">Tabela de lembretes</h2>
    719 
    720 <p>Cada linha da tabela {@link android.provider.CalendarContract.Reminders}
    721 representa um nico lembrete de um evento. Chamar
    722 {@link android.provider.CalendarContract.Reminders#query(android.content.ContentResolver, long, java.lang.String[]) query()} retorna uma lista de lembretes para
    723 o evento com o dado
    724 {@link android.provider.CalendarContract.AttendeesColumns#EVENT_ID}.</p>
    725 
    726 
    727 <p>A tabela a seguir relaciona os campos gravveis de lembretes. Todos eles devem
    728 ser includos ao inserir um novo lembrete. Observe que adaptadores de sincronizao especificam
    729 os tipos de lembretes compatveis na tabela {@link
    730 android.provider.CalendarContract.Calendars}. Consulte
    731 {@link android.provider.CalendarContract.CalendarColumns#ALLOWED_REMINDERS}
    732 para obter detalhes.</p>
    733 
    734 
    735 <table>
    736   <tr>
    737     <th>Constante</th>
    738     <th>Descrio</th>
    739   </tr>
    740   <tr>
    741     <td>{@link android.provider.CalendarContract.RemindersColumns#EVENT_ID}</td>
    742     <td>O ID do evento.</td>
    743   </tr>
    744   <tr>
    745     <td>{@link android.provider.CalendarContract.RemindersColumns#MINUTES}</td>
    746     <td>Os minutos antes do evento em que o lembrete deve disparar.</td>
    747   </tr>
    748   <tr>
    749     <td>{@link android.provider.CalendarContract.RemindersColumns#METHOD}</td>
    750     <td><p>O mtodo de alarme, como definido no servidor. Uma das seguintes:</p>
    751       <ul>
    752         <li>{@link android.provider.CalendarContract.RemindersColumns#METHOD_ALERT}</li>
    753         <li>{@link android.provider.CalendarContract.RemindersColumns#METHOD_DEFAULT}</li>
    754         <li>{@link android.provider.CalendarContract.RemindersColumns#METHOD_EMAIL}</li>
    755         <li>{@link android.provider.CalendarContract.RemindersColumns#METHOD_SMS}</li>
    756     </ul></td>
    757   </tr>
    758 </table>
    759 
    760 <h3 id="add-reminders">Adio de lembretes</h3>
    761 
    762 <p>Este exemplo adiciona um lembrete para um evento. O lembrete dispara
    763 15 minutos antes do evento.</p>
    764 <pre>
    765 long eventID = 221;
    766 ...
    767 ContentResolver cr = getContentResolver();
    768 ContentValues values = new ContentValues();
    769 values.put(Reminders.MINUTES, 15);
    770 values.put(Reminders.EVENT_ID, eventID);
    771 values.put(Reminders.METHOD, Reminders.METHOD_ALERT);
    772 Uri uri = cr.insert(Reminders.CONTENT_URI, values);</pre>
    773 
    774 <h2 id="instances">Tabela de instncias</h2>
    775 
    776 <p>A tabela 
    777 {@link android.provider.CalendarContract.Instances} contm
    778 os horrios de incio e trmino das ocorrncia de um evento. Cada linha nessa tabela
    779 representa uma nica ocorrncia do evento. A tabela de instncias no  gravvel e fornece
    780 somente um modo de consultar ocorrncias de eventos. </p>
    781 
    782 <p>A tabela a seguir relaciona alguns dos campos passveis de consulta de uma instncia. Observe
    783 que o fuso horrio  definido por
    784 {@link android.provider.CalendarContract.CalendarCache#KEY_TIMEZONE_TYPE}
    785 e 
    786 {@link android.provider.CalendarContract.CalendarCache#KEY_TIMEZONE_INSTANCES}.</p>
    787 
    788 
    789 <table>
    790   <tr>
    791     <th>Constante</th>
    792     <th>Descrio</th>
    793   </tr>
    794   <tr>
    795     <td>{@link android.provider.CalendarContract.Instances#BEGIN}</td>
    796     <td>O horrio de incio da instncia, em milissegundos UTC.</td>
    797   </tr>
    798   <tr>
    799     <td>{@link android.provider.CalendarContract.Instances#END}</td>
    800     <td>O horrio de trmino da instncia, em milissegundos UTC.</td>
    801   </tr>
    802   <tr>
    803     <td>{@link android.provider.CalendarContract.Instances#END_DAY}</td>
    804     
    805     <td>O dia final juliano da instncia relativo ao fuso horrio
    806 do Agenda. 
    807     
    808 </td>
    809   </tr>
    810   <tr>
    811     <td>{@link android.provider.CalendarContract.Instances#END_MINUTE}</td>
    812     
    813     <td>O minuto final da instncia calculado a partir de meia-noite
    814 no fuso horrio do Agenda.</td>
    815     
    816   </tr>
    817   <tr>
    818     <td>{@link android.provider.CalendarContract.Instances#EVENT_ID}</td>
    819     <td>O <code>_ID</code> do evento para essa instncia.</td>
    820   </tr>
    821     <tr>
    822     <td>{@link android.provider.CalendarContract.Instances#START_DAY}</td>
    823     <td>O dia inicial juliano da instncia relativo ao fuso horrio do Agenda. 
    824  </td>
    825   </tr>
    826   <tr>
    827     <td>{@link android.provider.CalendarContract.Instances#START_MINUTE}</td>
    828     
    829     <td>O minuto inicial da instncia calculado a partir de meia-noite, relativo
    830 ao fuso horrio do Agenda. 
    831 </td>
    832     
    833   </tr>
    834 
    835 </table>
    836 
    837 <h3 id="query-instances">Consulta na tabela de instncias</h3>
    838 
    839 <p>Para consultar a Tabela de instncias,  necessrio especificar um intervalo de tempo para a consulta
    840 na URI. Neste exemplo, {@link android.provider.CalendarContract.Instances}
    841 obtm acesso ao campo {@link
    842 android.provider.CalendarContract.EventsColumns#TITLE} por meio
    843 da sua implementao da interface {@link android.provider.CalendarContract.EventsColumns}. 
    844 Em outras palavras, {@link
    845 android.provider.CalendarContract.EventsColumns#TITLE}  retornado por uma
    846 vista do banco de dados, no pela consulta da tabela {@link
    847 android.provider.CalendarContract.Instances} bruta.</p>
    848 
    849 <pre>
    850 private static final String DEBUG_TAG = "MyActivity";
    851 public static final String[] INSTANCE_PROJECTION = new String[] {
    852     Instances.EVENT_ID,      // 0
    853     Instances.BEGIN,         // 1
    854     Instances.TITLE          // 2
    855   };
    856   
    857 // The indices for the projection array above.
    858 private static final int PROJECTION_ID_INDEX = 0;
    859 private static final int PROJECTION_BEGIN_INDEX = 1;
    860 private static final int PROJECTION_TITLE_INDEX = 2;
    861 ...
    862 
    863 // Specify the date range you want to search for recurring
    864 // event instances
    865 Calendar beginTime = Calendar.getInstance();
    866 beginTime.set(2011, 9, 23, 8, 0);
    867 long startMillis = beginTime.getTimeInMillis();
    868 Calendar endTime = Calendar.getInstance();
    869 endTime.set(2011, 10, 24, 8, 0);
    870 long endMillis = endTime.getTimeInMillis();
    871   
    872 Cursor cur = null;
    873 ContentResolver cr = getContentResolver();
    874 
    875 // The ID of the recurring event whose instances you are searching
    876 // for in the Instances table
    877 String selection = Instances.EVENT_ID + " = ?";
    878 String[] selectionArgs = new String[] {"207"};
    879 
    880 // Construct the query with the desired date range.
    881 Uri.Builder builder = Instances.CONTENT_URI.buildUpon();
    882 ContentUris.appendId(builder, startMillis);
    883 ContentUris.appendId(builder, endMillis);
    884 
    885 // Submit the query
    886 cur =  cr.query(builder.build(), 
    887     INSTANCE_PROJECTION, 
    888     selection, 
    889     selectionArgs, 
    890     null);
    891    
    892 while (cur.moveToNext()) {
    893     String title = null;
    894     long eventID = 0;
    895     long beginVal = 0;    
    896     
    897     // Get the field values
    898     eventID = cur.getLong(PROJECTION_ID_INDEX);
    899     beginVal = cur.getLong(PROJECTION_BEGIN_INDEX);
    900     title = cur.getString(PROJECTION_TITLE_INDEX);
    901               
    902     // Do something with the values. 
    903     Log.i(DEBUG_TAG, "Event:  " + title); 
    904     Calendar calendar = Calendar.getInstance();
    905     calendar.setTimeInMillis(beginVal);  
    906     DateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");
    907     Log.i(DEBUG_TAG, "Date: " + formatter.format(calendar.getTime()));    
    908     }
    909  }</pre>
    910 
    911 <h2 id="intents">Intenes do Agenda</h2>
    912 <p>O aplicativo no precisa de <a href="#manifest">permisses</a> para ler e gravar dados de agenda. Em vez disso, ele pode usar intenes compatveis com o aplicativo Agenda do Android para entregar operaes de leitura e gravao. A tabela a seguir lista as intenes compatveis com o Provedor de Agenda.</p>
    913 <table>
    914   <tr>
    915     <th>Ao</th>
    916     <th>URI</th>
    917 
    918     <th>Descrio</th>
    919     <th>Extras</th>
    920   </tr>
    921   <tr>
    922     <td><br>
    923     {@link android.content.Intent#ACTION_VIEW VIEW} <br></td>
    924     <td><p><code>content://com.android.calendar/time/&lt;ms_since_epoch&gt;</code></p>
    925     Tambm pode-se consultar a URI com
    926 {@link android.provider.CalendarContract#CONTENT_URI CalendarContract.CONTENT_URI}. 
    927 Para ver um exemplo do uso dessa inteno, consulte <a href="{@docRoot}guide/topics/providers/calendar-provider.html#intent-view">Uso de intenes para exibir dados de calendrios</a>. 
    928 
    929     </td>
    930     <td>Abre a agenda no horrio especificado por <code>&lt;ms_since_epoch&gt;</code>.</td>
    931     <td>Nenhum.</td>
    932   </tr>
    933   <tr>
    934     <td><p>{@link android.content.Intent#ACTION_VIEW VIEW} </p>
    935 
    936      </td>
    937     <td><p><code>content://com.android.calendar/events/&lt;event_id&gt;</code></p>
    938     
    939     Tambm  possvel consultar a URI com
    940 {@link android.provider.CalendarContract.Events#CONTENT_URI Events.CONTENT_URI}. 
    941 Para ver um exemplo do uso dessa inteno, consulte <a href="{@docRoot}guide/topics/providers/calendar-provider.html#intent-view">Uso de intenes para exibir dados de calendrios</a>.
    942     
    943     </td>
    944     <td>Exibe o evento especificado por <code>&lt;event_id&gt;</code>.</td>
    945 
    946     <td>{@link android.provider.CalendarContract#EXTRA_EVENT_BEGIN_TIME CalendarContract.EXTRA_EVENT_BEGIN_TIME}<br>
    947       <br>
    948       <br>
    949     {@link android.provider.CalendarContract#EXTRA_EVENT_END_TIME CalendarContract.EXTRA_EVENT_END_TIME}</td>
    950   </tr>
    951 
    952   <tr>
    953     <td>{@link android.content.Intent#ACTION_EDIT EDIT} </td>
    954     <td><p><code>content://com.android.calendar/events/&lt;event_id&gt;</code></p>
    955     
    956   Tambm  possvel consultar a URI com
    957 {@link android.provider.CalendarContract.Events#CONTENT_URI Events.CONTENT_URI}. 
    958 Para ver um exemplo do uso dessa inteno, consulte <a href="{@docRoot}guide/topics/providers/calendar-provider.html#intent-edit">Uso de uma inteno para editar um evento</a>.
    959     
    960     
    961     </td>
    962     <td>Edita o evento especificado por <code>&lt;event_id&gt;</code>.</td>
    963 
    964     <td>{@link android.provider.CalendarContract#EXTRA_EVENT_BEGIN_TIME CalendarContract.EXTRA_EVENT_BEGIN_TIME}<br>
    965       <br>
    966       <br>
    967     {@link android.provider.CalendarContract#EXTRA_EVENT_END_TIME CalendarContract.EXTRA_EVENT_END_TIME}</td>
    968   </tr>
    969 
    970   <tr>
    971     <td>{@link android.content.Intent#ACTION_EDIT EDIT} <br>
    972     <br>
    973     {@link android.content.Intent#ACTION_INSERT INSERT} </td>
    974     <td><p><code>content://com.android.calendar/events</code></p>
    975     
    976    Tambm  possvel consultar a URI com
    977 {@link android.provider.CalendarContract.Events#CONTENT_URI Events.CONTENT_URI}. 
    978 Para ver um exemplo do uso dessa inteno, consulte <a href="{@docRoot}guide/topics/providers/calendar-provider.html#intent-insert">Uso de uma inteno para inserir um evento</a>.
    979     
    980     </td>
    981 
    982     <td>Cria um evento.</td>
    983     <td>Qualquer um dos extras listados na tabela abaixo.</td>
    984   </tr>
    985 </table>
    986 
    987 <p>A tabela a seguir lista os extras de inteno compatveis com o Provedor de Agenda:
    988 </p>
    989 <table>
    990   <tr>
    991     <th>Extra de inteno</th>
    992     <th>Descrio</th>
    993   </tr>
    994   <tr>
    995     <td>{@link android.provider.CalendarContract.EventsColumns#TITLE Events.TITLE}</td>
    996     <td>Nome do evento.</td>
    997   </tr>
    998   <tr>
    999   
   1000     <td>{@link android.provider.CalendarContract#EXTRA_EVENT_BEGIN_TIME
   1001 CalendarContract.EXTRA_EVENT_BEGIN_TIME}</td>
   1002     <td>Horrio de incio do evento em milissegundos a partir da poca.</td>
   1003   </tr>
   1004   <tr>
   1005     <td>{@link android.provider.CalendarContract#EXTRA_EVENT_END_TIME
   1006 CalendarContract.EXTRA_EVENT_END_TIME}</td>
   1007     
   1008     <td>Horrio de trmino do evento em milissegundos a partir da poca.</td>
   1009   </tr>
   1010   <tr>
   1011     <td>{@link android.provider.CalendarContract#EXTRA_EVENT_ALL_DAY
   1012 CalendarContract.EXTRA_EVENT_ALL_DAY}</td>
   1013     
   1014     <td>Um booleano que indica que um evento acontece o dia inteiro. O valor pode ser
   1015 <code>true</code> ou <code>false</code>.</td> </tr>
   1016   <tr>
   1017     <td>{@link android.provider.CalendarContract.EventsColumns#EVENT_LOCATION
   1018 Events.EVENT_LOCATION}</td>
   1019     
   1020     <td>Local do evento.</td>
   1021   </tr>
   1022   <tr>
   1023     <td>{@link android.provider.CalendarContract.EventsColumns#DESCRIPTION
   1024 Events.DESCRIPTION}</td>
   1025     
   1026     <td>Descrio do evento.</td>
   1027   </tr>
   1028   <tr>
   1029     <td>
   1030     {@link android.content.Intent#EXTRA_EMAIL Intent.EXTRA_EMAIL}</td>
   1031     <td>Endereos de e-mail daqueles a convidar em forma de lista com termos separados por vrgula.</td>
   1032   </tr>
   1033   <tr>
   1034     <td>
   1035     {@link android.provider.CalendarContract.EventsColumns#RRULE Events.RRULE}</td>
   1036     <td>A regra de recorrncia do evento.</td>
   1037   </tr>
   1038   <tr>
   1039     <td>
   1040     {@link android.provider.CalendarContract.EventsColumns#ACCESS_LEVEL
   1041 Events.ACCESS_LEVEL}</td>
   1042     
   1043     <td>Se o evento  privado ou pblico.</td>
   1044   </tr>
   1045   <tr>
   1046     <td>{@link android.provider.CalendarContract.EventsColumns#AVAILABILITY
   1047 Events.AVAILABILITY}</td>
   1048     
   1049     <td>Se esse evento considera tempo ocupado na contagem ou se h tempo livre que pode ser reagendado.</td>
   1050     
   1051 </table> 
   1052 <p>As sees a seguir descrevem como usar estas intenes.</p>
   1053 
   1054 
   1055 <h3 id="intent-insert">Uso de uma inteno para inserir um evento</h3>
   1056 
   1057 <p>A inteno {@link android.content.Intent#ACTION_INSERT INSERT}
   1058 permite que o aplicativo entregue a tarefa de insero de eventos ao prprio aplicativo Agenda.
   1059 Com essa abordagem, o aplicativo no precisar ter a permisso {@link
   1060 android.Manifest.permission#WRITE_CALENDAR} contida no <a href="#manifest">arquivo de manifesto</a>.</p>
   1061 
   1062   
   1063 <p>Quando usurios executam um aplicativo que usa essa abordagem, ele os direciona
   1064 ao Agenda para finalizar a adio do evento. A inteno {@link
   1065 android.content.Intent#ACTION_INSERT INSERT} usa campos extras para
   1066 pr-preencher um formulrio com os detalhes do evento na Agenda. Os usurios podem,
   1067 ento, cancelar o evento, editar o formulrio conforme o necessrio ou salvar o evento nas suas
   1068 agendas.</p>
   1069   
   1070 
   1071 
   1072 <p>A seguir h um fragmento de cdigo que agenda um evento em 19 de janeiro de 2012, que acontece
   1073 das 7h30 s 8h30. Observe o exposto a seguir sobre esse fragmento de cdigo:</p>
   1074 
   1075 <ul>
   1076   <li>Ele especifica {@link android.provider.CalendarContract.Events#CONTENT_URI Events.CONTENT_URI}
   1077  como a URI.</li>
   1078   
   1079   <li>Ele usa os campos extras {@link
   1080 android.provider.CalendarContract#EXTRA_EVENT_BEGIN_TIME
   1081 CalendarContract.EXTRA_EVENT_BEGIN_TIME} e {@link
   1082 android.provider.CalendarContract#EXTRA_EVENT_END_TIME
   1083 CalendarContract.EXTRA_EVENT_END_TIME} para pr-preencher o formulrio
   1084 com o horrio do evento. Os valores desses horrios devem estar em milissegundos UTC
   1085 da poca.</li>
   1086   
   1087   <li>Ele usa o campo extra {@link android.content.Intent#EXTRA_EMAIL Intent.EXTRA_EMAIL}
   1088  para fornecer uma lista de termos separados por vrgula de convidados, especificados por endereo de e-mail.</li>
   1089   
   1090 </ul>
   1091 <pre>
   1092 Calendar beginTime = Calendar.getInstance();
   1093 beginTime.set(2012, 0, 19, 7, 30);
   1094 Calendar endTime = Calendar.getInstance();
   1095 endTime.set(2012, 0, 19, 8, 30);
   1096 Intent intent = new Intent(Intent.ACTION_INSERT)
   1097         .setData(Events.CONTENT_URI)
   1098         .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis())
   1099         .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis())
   1100         .putExtra(Events.TITLE, &quot;Yoga&quot;)
   1101         .putExtra(Events.DESCRIPTION, &quot;Group class&quot;)
   1102         .putExtra(Events.EVENT_LOCATION, &quot;The gym&quot;)
   1103         .putExtra(Events.AVAILABILITY, Events.AVAILABILITY_BUSY)
   1104         .putExtra(Intent.EXTRA_EMAIL, &quot;rowan (a] example.com,trevor (a] example.com&quot;);
   1105 startActivity(intent);
   1106 </pre>
   1107 
   1108 <h3 id="intent-edit">Uso de uma inteno para editar um evento</h3>
   1109 
   1110 <p> possvel atualizar um evento diretamente, como descrito em <a href="#update-event">Atualizao de eventos</a>. Porm, o uso da inteno {@link
   1111 android.content.Intent#ACTION_EDIT EDIT} permite que um aplicativo
   1112 sem permisso fornea a edio de eventos ao aplicativo Agenda.
   1113 Quando usurios finalizam a edio do evento no Agenda, retornam
   1114 ao aplicativo original.</p> <p>A seguir h um exemplo de uma inteno que define um novo
   1115 ttulo para o evento especificado e permite aos usurios editar o evento no Agenda.</p>
   1116 
   1117 
   1118 <pre>long eventID = 208;
   1119 Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, eventID);
   1120 Intent intent = new Intent(Intent.ACTION_EDIT)
   1121     .setData(uri)
   1122     .putExtra(Events.TITLE, &quot;My New Title&quot;);
   1123 startActivity(intent);</pre>
   1124 
   1125 <h3 id="intent-view">Uso de intenes para exibir dados de agenda</h3>
   1126 <p>O Provedor de Agenda oferece dois modos diferentes de usar a inteno {@link android.content.Intent#ACTION_VIEW VIEW}:</p>
   1127 <ul>
   1128   <li>Para abrir o Agenda em uma data especfica.</li>
   1129   <li>Para exibir um evento.</li>
   1130 
   1131 </ul>
   1132 <p>A seguir h um exemplo que mostra como abrir o Agenda em uma data especfica:</p>
   1133 <pre>// A date-time specified in milliseconds since the epoch.
   1134 long startMillis;
   1135 ...
   1136 Uri.Builder builder = CalendarContract.CONTENT_URI.buildUpon();
   1137 builder.appendPath(&quot;time&quot;);
   1138 ContentUris.appendId(builder, startMillis);
   1139 Intent intent = new Intent(Intent.ACTION_VIEW)
   1140     .setData(builder.build());
   1141 startActivity(intent);</pre>
   1142 
   1143 <p>Abaixo h um exemplo que mostra como abrir um evento para exibio:</p>
   1144 <pre>long eventID = 208;
   1145 ...
   1146 Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, eventID);
   1147 Intent intent = new Intent(Intent.ACTION_VIEW)
   1148    .setData(uri);
   1149 startActivity(intent);
   1150 </pre>
   1151 
   1152 
   1153 <h2 id="sync-adapter">Adaptadores de sincronizao</h2>
   1154 
   1155 
   1156 <p>H pequenas diferenas apenas nos modos de acesso ao Provedor de Agenda
   1157 via aplicativo e via adaptador de sincronizao:</p>
   1158 
   1159 <ul>
   1160   <li>Um adaptador de sincronizao precisa especificar que  um adaptador de sincronizao que define {@link android.provider.CalendarContract#CALLER_IS_SYNCADAPTER} como <code>true</code>.</li>
   1161   
   1162   
   1163   <li>Os adaptadores de sincronizao precisam fornecer um {@link
   1164 android.provider.CalendarContract.SyncColumns#ACCOUNT_NAME} e um {@link
   1165 android.provider.CalendarContract.SyncColumns#ACCOUNT_TYPE} como parmetros da consulta na URI. </li>
   1166   
   1167   <li>Os adaptadores de sincronizao tm acesso de gravao a mais colunas do que um aplicativo ou widget.
   1168   Por exemplo: um aplicativo s pode modificar algumas caractersticas de uma agenda,
   1169 como nome, nome de exibio, configuraes de visibilidade e se a agenda est
   1170 sincronizada. Por comparao, um adaptador de sincronizao pode acessar no somente essas colunas, mas muitas outras,
   1171 como cores da agenda, fuso horrio, nvel de acesso, local etc.
   1172 No entanto, um adaptador de sincronizao  restrito ao <code>ACCOUNT_NAME</code>
   1173 e ao <code>ACCOUNT_TYPE</code> que especificou.</li> </ul>
   1174 
   1175 <p>A seguir h um mtodo auxiliar que pode ser usado para retornar uma URI para uso com um adaptador de sincronizao:</p>
   1176 <pre> static Uri asSyncAdapter(Uri uri, String account, String accountType) {
   1177     return uri.buildUpon()
   1178         .appendQueryParameter(android.provider.CalendarContract.CALLER_IS_SYNCADAPTER,&quot;true&quot;)
   1179         .appendQueryParameter(Calendars.ACCOUNT_NAME, account)
   1180         .appendQueryParameter(Calendars.ACCOUNT_TYPE, accountType).build();
   1181  }
   1182 </pre>
   1183 <p>Para obter uma implementao de exemplo de um adaptador de sincronizao (no especificamente relacionada ao Agenda), consulte 
   1184 <a href="{@docRoot}resources/samples/SampleSyncAdapter/index.html">SampleSyncAdapter</a>.
   1185