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><class></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 — 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 <?xml version="1.0" encoding="utf-8"?> 201 <manifest xmlns:android="http://schemas.android.com/apk/res/android"...> 202 <uses-sdk android:minSdkVersion="14" /> 203 <uses-permission android:name="android.permission.READ_CALENDAR" /> 204 <uses-permission android:name="android.permission.WRITE_CALENDAR" /> 205 ... 206 </manifest> 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>"_id=?"</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, "Trevor's Calendar"); 365 Uri updateUri = ContentUris.withAppendedId(Calendars.CONTENT_URI, calID); 366 int rows = getContentResolver().update(updateUri, values, null, null); 367 Log.i(DEBUG_TAG, "Rows updated: " + 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>"PT1H"</code> indica que o evento 440 deve durar uma hora, e um valor de <code>"P2W"</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>"FREQ=WEEKLY;COUNT=10;WKST=SU"</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> — 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> — 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, "Jazzercise"); 557 values.put(Events.DESCRIPTION, "Group workout"); 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 — 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>"_id=?"</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, "Kickboxing"); 602 updateUri = ContentUris.withAppendedId(Events.CONTENT_URI, eventID); 603 int rows = getContentResolver().update(updateUri, values, null, null); 604 Log.i(DEBUG_TAG, "Rows updated: " + 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, "Rows deleted: " + 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, "Trevor"); 710 values.put(Attendees.ATTENDEE_EMAIL, "trevor (a] example.com"); 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/<ms_since_epoch></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><ms_since_epoch></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/<event_id></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><event_id></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/<event_id></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><event_id></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, "Yoga") 1101 .putExtra(Events.DESCRIPTION, "Group class") 1102 .putExtra(Events.EVENT_LOCATION, "The gym") 1103 .putExtra(Events.AVAILABILITY, Events.AVAILABILITY_BUSY) 1104 .putExtra(Intent.EXTRA_EMAIL, "rowan (a] example.com,trevor (a] example.com"); 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, "My New Title"); 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("time"); 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,"true") 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