Home | History | Annotate | Download | only in providers
      1 page.title=Provedor de Contatos
      2 @jd:body
      3 <div id="qv-wrapper">
      4 <div id="qv">
      5 <h2>Visualizao rpida</h2>
      6 <ul>
      7     <li>Repositrio de informaes sobre pessoas do Android.</li>
      8     <li>
      9         Sincronizao com a web.
     10     </li>
     11     <li>
     12         Integrao de dados de fluxos sociais.
     13     </li>
     14 </ul>
     15 <h2>Neste documento</h2>
     16 <ol>
     17     <li>
     18         <a href="#InformationTypes">Organizao do Provedor de Contatos</a>
     19     </li>
     20     <li>
     21         <a href="#RawContactBasics">Contatos brutos</a>
     22     </li>
     23     <li>
     24         <a href="#DataBasics">Dados</a>
     25     </li>
     26     <li>
     27         <a href="#ContactBasics">Contatos</a>
     28     </li>
     29     <li>
     30         <a href="#Sources">Dados de adaptadores de sincronizao</a>
     31     </li>
     32     <li>
     33         <a href="#Permissions">Permisses necessrias</a>
     34     </li>
     35     <li>
     36         <a href="#UserProfile">O perfil do usurio</a>
     37     </li>
     38     <li>
     39         <a href="#ContactsProviderMetadata">Metadados do Provedor de Contatos</a>
     40     </li>
     41     <li>
     42         <a href="#Access">Acesso ao Provedor de Contatos</a>
     43     <li>
     44     </li>
     45     <li>
     46         <a href="#SyncAdapters">Adaptadores de sincronizao do Provedor de Contatos</a>
     47     </li>
     48     <li>
     49         <a href="#SocialStream">Dados de fluxos sociais</a>
     50     </li>
     51     <li>
     52         <a href="#AdditionalFeatures">Recursos adicionais do Provedor de Contatos</a>
     53     </li>
     54 </ol>
     55 <h2>Classes principais</h2>
     56 <ol>
     57     <li>{@link android.provider.ContactsContract.Contacts}</li>
     58     <li>{@link android.provider.ContactsContract.RawContacts}</li>
     59     <li>{@link android.provider.ContactsContract.Data}</li>
     60     <li>{@code android.provider.ContactsContract.StreamItems}</li>
     61 </ol>
     62 <h2>Exemplos relacionados</h2>
     63 <ol>
     64     <li>
     65         <a href="{@docRoot}resources/samples/ContactManager/index.html">
     66         Gerente de contatos
     67         </a>
     68     </li>
     69     <li>
     70         <a href="{@docRoot}resources/samples/SampleSyncAdapter/index.html">
     71         Exemplo de adaptador de sincronizao</a>
     72     </li>
     73 </ol>
     74 <h2>Veja tambm</h2>
     75 <ol>
     76     <li>
     77         <a href="{@docRoot}guide/topics/providers/content-provider-basics.html">
     78         Preceitos do provedor de contedo
     79         </a>
     80     </li>
     81 </ol>
     82 </div>
     83 </div>
     84 <p>
     85     O Provedor de Contatos  um componente poderoso e flexvel do Android que gerencia
     86 o principal repositrio de dados sobre pessoas do dispositivo. O Provedor de Contatos  a fonte dos dados
     87     vistos nos aplicativos de contatos do dispositivo e, por ele, tambm  possvel acessar os dados
     88     no prprio aplicativo e transferi-los entre o dispositivo e servios on-line. O provedor fornece
     89     uma grande variedade de fontes de dados e tenta gerenciar o mximo de dados possveis para cada pessoa,
     90     uma vez que organiz-los  algo complexo. Por isso, a API do provedor contm
     91     um conjunto extensivo de classes e interfaces de contrato que facilitam a recuperao e a modificao
     92     dos dados.
     93 </p>
     94 <p>
     95     Este guia descreve o seguinte:
     96 </p>
     97     <ul>
     98         <li>
     99             A estrutura bsica do provedor.
    100         </li>
    101         <li>
    102             Como recuperar dados por um provedor.
    103         </li>
    104         <li>
    105             Como modificar dados no provedor.
    106         </li>
    107         <li>
    108             Como criar um adaptador de sincronizao para sincronizar dados do servidor com
    109 o Provedor de Contatos.
    110         </li>
    111     </ul>
    112 <p>
    113     Este guia considera que o leitor conhece os preceitos dos provedores de contedo do Android. Para saber mais
    114     sobre provedores de contedo do Android, leia o guia
    115     <a href="{@docRoot}guide/topics/providers/content-provider-basics.html">
    116     Preceitos do provedor de contedo</a>.
    117     O aplicativo <a href="{@docRoot}resources/samples/SampleSyncAdapter/index.html">Exemplo de adaptador de sincronizao</a>
    118      um exemplo de uso de um adaptador de sincronizao que transfere dados entre o Provedor
    119     de contatos e um aplicativo de amostra hospedado pelo Google Web Services.
    120 </p>
    121 <h2 id="InformationTypes">Organizao do Provedor de Contatos</h2>
    122 <p>
    123     O Provedor de Contatos  um componente do provedor de contedo do Android. Ele mantm trs tipos de
    124     dados sobre uma pessoa, sendo cada um deles correspondente a uma tabela fornecida pelo provedor, como
    125     ilustrado na figura 1:
    126 </p>
    127 <img src="{@docRoot}images/providers/contacts_structure.png" alt="" height="364" id="figure1" />
    128 <p class="img-caption">
    129   <strong>Figura 1.</strong> Estrutura da tabela do Provedor de Contatos.
    130 </p>
    131 <p>
    132     As trs tabelas so comumente identificadas pelo nome de suas classes de contrato. As classes
    133     definem constantes para URIs de contedo e nomes e valores de colunas usados pela tabela:
    134 </p>
    135 <dl>
    136     <dt>
    137         Tabela {@link android.provider.ContactsContract.Contacts}
    138     </dt>
    139     <dd>
    140         As linhas representam pessoas diferentes com base em agregaes de linhas de contatos brutos.
    141     </dd>
    142     <dt>
    143         Tabela {@link android.provider.ContactsContract.RawContacts}
    144     </dt>
    145     <dd>
    146         As linhas contm um resumo dos dados de uma pessoa, especficos a um tipo e uma conta de usurio.
    147     </dd>
    148     <dt>
    149         Tabela {@link android.provider.ContactsContract.Data}
    150     </dt>
    151     <dd>
    152         As linhas contm os detalhes dos contatos brutos, como endereos de e-mail ou nmeros de telefone.
    153     </dd>
    154 </dl>
    155 <p>
    156     As outras tabelas representadas pelas classes de contrato em {@link android.provider.ContactsContract}
    157     so tabelas auxiliares que o Provedor de Contatos usa para gerenciar suas operaes ou compatibilizar
    158     funes especficas nos contatos do dispositivo ou em aplicativos de telefonia.
    159 </p>
    160 <h2 id="RawContactBasics">Contatos brutos</h2>
    161 <p>
    162     Os contatos brutos representam os dados de uma pessoa provenientes de um tipo nico de conta e um nome
    163     de conta. Como o Provedor de Contatos permite mais de um servio on-line como fonte
    164 de dados de uma pessoa, ele permite diversos contatos brutos para a mesma pessoa.
    165     Diversos contatos brutos tambm permitem que um usurio combine os dados de uma pessoa de mais de uma conta
    166     a partir do mesmo tipo de conta.
    167 </p>
    168 <p>
    169     A maioria dos dados de um contato bruto no  armazenada
    170     na tabela {@link android.provider.ContactsContract.RawContacts}. Em vez disso,  armazenada em uma ou mais
    171     linhas na tabela {@link android.provider.ContactsContract.Data}. Cada linha de dados tem uma coluna
    172     {@link android.provider.ContactsContract.DataColumns#RAW_CONTACT_ID Data.RAW_CONTACT_ID} que
    173     contm o valor {@code android.provider.BaseColumns#_ID RawContacts._ID} de sua
    174     linha {@link android.provider.ContactsContract.RawContacts} pai.
    175 </p>
    176 <h3 id="RawContactsColumns">Colunas importantes de contatos brutos</h3>
    177 <p>
    178     As colunas importantes na tabela {@link android.provider.ContactsContract.RawContacts} so
    179     listadas na tabela 1. Leia as observaes que se seguem aps a tabela:
    180 </p>
    181 <p class="table-caption" id="table1">
    182     <strong>Tabela 1.</strong> Importantes colunas de contatos brutos.
    183 </p>
    184 <table>
    185     <tr>
    186         <th scope="col">Nome da coluna</th>
    187         <th scope="col">Uso</th>
    188         <th scope="col">Observaes</th>
    189     </tr>
    190     <tr>
    191         <td>
    192             {@link android.provider.ContactsContract.SyncColumns#ACCOUNT_NAME}
    193         </td>
    194         <td>
    195             O nome da conta para o tipo de conta que  a fonte desse contato bruto.
    196             Por exemplo: o nome da conta de uma conta da Google  um dos endereos do Gmail do proprietrio
    197     do dispositivo. Para obter mais informaes,
    198             acesse o prximo item
    199             {@link android.provider.ContactsContract.SyncColumns#ACCOUNT_TYPE}.
    200         </td>
    201         <td>
    202             O formato desse nome  especfico deste tipo de conta.
    203             No se trata necessariamente de um endereo de e-mail.
    204         </td>
    205     </tr>
    206     <tr>
    207         <td>
    208             {@link android.provider.ContactsContract.SyncColumns#ACCOUNT_TYPE}
    209         </td>
    210         <td>
    211             O tipo de conta que  a fonte desse contato bruto. Por exemplo: o tipo
    212             de conta de uma conta da Google  <code>com.google</code>. Sempre qualifique o tipo de conta
    213             com um identificador de domnio para um domnio que voc controla ou possui. Isso garantir que seu
    214             tipo de conta seja nico.
    215         </td>
    216         <td>
    217             Os tipos de conta que fornecem dados de contatos normalmente tm um adaptador de sincronizao associado que
    218             sincroniza-se com o Provedor de Contatos.
    219     </tr>
    220     <tr>
    221         <td>
    222             {@link android.provider.ContactsContract.RawContactsColumns#DELETED}
    223         </td>
    224         <td>
    225             O sinalizador "excludo" de um contato bruto.
    226         </td>
    227         <td>
    228             Esse sinalizador permite que o Provedor de Contatos mantenha a linha internamente at
    229             que os adaptadores de sincronizao possam exclu-la dos servidores e, em seguida, exclu-la
    230             do repositrio.
    231         </td>
    232     </tr>
    233 </table>
    234 <h4>Observaes</h4>
    235 <p>
    236     As observaes a seguir sobre a tabela
    237     {@link android.provider.ContactsContract.RawContacts} so importantes:
    238 </p>
    239 <ul>
    240     <li>
    241         O nome de um contato bruto no  armazenado em sua linha em
    242         {@link android.provider.ContactsContract.RawContacts}. Em vez disso,  armazenado na
    243         tabela {@link android.provider.ContactsContract.Data}, em uma
    244         linha {@link android.provider.ContactsContract.CommonDataKinds.StructuredName}. Os contatos brutos
    245         tm apenas uma linha desse tipo na tabela {@link android.provider.ContactsContract.Data}.
    246     </li>
    247     <li>
    248         <strong>Ateno:</strong> para usar os dados da prpria conta em uma linha de contato bruto,  necessrio
    249         registr-la primeiro com o {@link android.accounts.AccountManager}. Para isso, faa com que
    250         os usurios adicionem o tipo e o nome da conta  lista de contas. Caso
    251         contrrio, o Provedor de Contatos excluir a linha do contato bruto automaticamente.
    252         <p>
    253             Por exemplo: se quiser que o aplicativo mantenha dados de contato do seu servio baseado em web
    254             com o {@code com.example.dataservice} de domnio e com a conta do usurio do servio
    255             {@code becky.sharp (a] dataservice.example.com}, o usurio precisa, primeiramente, adicionar o "tipo"
    256             de conta ({@code com.example.dataservice}) e o "nome" da conta
    257             ({@code becky.smart (a] dataservice.example.com}) antes que o aplicativo adicione linhas de contato bruto.
    258             Voc pode explicar esse requisito ao usurio em documentaes ou pode exigir que o
    259             usurio adicione o tipo ou o nome ou ambos. Tipos e nomes de conta
    260             so descritos com mais detalhes na prxima seo.
    261     </li>
    262 </ul>
    263 <h3 id="RawContactsExample">Fontes de dados de contatos brutos</h3>
    264 <p>
    265     Para compreender como os contatos brutos funcionam, considere a usuria "Emily Dickinson" que tem as seguintes
    266     trs contas de usurio definidas no seu dispositivo:
    267 </p>
    268 <ul>
    269     <li><code>emily.dickinson (a] gmail.com</code></li>
    270     <li><code>emilyd (a] gmail.com</code></li>
    271     <li>Conta do twitter "belle_of_amherst"</li>
    272 </ul>
    273 <p>
    274     Essa usuria ativou <em>Sincronizar contatos</em> para todas as trs contas nas
    275     Configuraes da <em>conta</em>.
    276 </p>
    277 <p>
    278     Suponhamos que Emily Dickinson abra uma janela do navegador, acesse o Gmail como
    279     <code>emily.dickinson (a] gmail.com</code>, abra
    280     Contatos e adicione "Thomas Higginson". Mais tarde, ela acessa o Gmail como
    281     <code>emilyd (a] gmail.com</code> e envia um e-mail para "Thomas Higginson", o que automaticamente
    282     o adiciona como um contato. Ela tambm segue "colonel_tom" (ID do twitter de Thomas Higginson) no
    283     Twitter.
    284 </p>
    285 <p>
    286     O Provedor de Contatos cria trs contatos brutos como resultado desse trabalho:
    287 </p>
    288 <ol>
    289     <li>
    290         Um contato bruto de "Thomas Higginson" associado a <code>emily.dickinson (a] gmail.com</code>.
    291         O tipo de conta do usurio  Google.
    292     </li>
    293     <li>
    294         Um segundo contato bruto de "Thomas Higginson" associado a <code>emilyd (a] gmail.com</code>.
    295         O tipo de conta do usurio tambm  Google. H um segundo contato bruto,
    296         embora o nome seja idntico a um nome anterior porque a pessoa foi adicionada
    297         a uma conta de usurio diferente.
    298     </li>
    299     <li>
    300         Um terceiro contato bruto de "Thomas Higginson" associado a "belle_of_amherst". O tipo
    301         de conta de usurio  Twitter.
    302     </li>
    303 </ol>
    304 <h2 id="DataBasics">Dados</h2>
    305 <p>
    306     Como observado anteriormente, os dados de um contato bruto so armazenados
    307     em uma linha {@link android.provider.ContactsContract.Data} vinculada ao valor <code>_ID</code>
    308     do contato bruto. Isso permite que um nico contato bruto tenha diversas instncias do mesmo
    309     tipo de dados, como endereos de e-mail ou nmeros de telefone. Por exemplo: se
    310     "Thomas Higginson" para {@code emilyd (a] gmail.com}  (a linha do contato bruto de Thomas Higginson
    311     associada  conta Google <code>emilyd (a] gmail.com</code>) tem um endereo de e-mail pessoal
    312     <code>thigg (a] gmail.com</code> e um de trabalho
    313     <code>thomas.higginson (a] gmail.com</code>, o Provedor de Contatos armazena as duas linhas de endereo de e-mail
    314     e vincula ambas ao contato bruto.
    315 </p>
    316 <p>
    317     Observe que diferentes tipos de dados so armazenados nessa nica tabela. Linhas de nome de exibio,
    318     nmero de telefone, e-mail, endereo postal, foto e detalhes de site so encontradas
    319     na tabela {@link android.provider.ContactsContract.Data}. Para ajudar a gerenciar isso,
    320     a tabela {@link android.provider.ContactsContract.Data} tem algumas colunas com nomes descritivos
    321     e outras com nomes genricos. O contedo de uma coluna de nome descritivo tem o mesmo significado
    322     independente do tipo de dado da linha, enquanto o contedo de uma coluna de nome genrico tem
    323     diferentes significados dependendo do tipo de dados.
    324 </p>
    325 <h3 id="DescriptiveColumns">Nomes de coluna descritiva</h3>
    326 <p>
    327     A seguir h alguns exemplos de nomes descritivos de colunas:
    328 </p>
    329 <dl>
    330     <dt>
    331         {@link android.provider.ContactsContract.Data#RAW_CONTACT_ID}
    332     </dt>
    333     <dd>
    334         O valor da coluna <code>_ID</code> do contato bruto para estes dados.
    335     </dd>
    336     <dt>
    337         {@link android.provider.ContactsContract.Data#MIMETYPE}
    338     </dt>
    339     <dd>
    340         O tipo de dado armazenado nessa linha, expresso como um tipo MIME personalizado. O Provedor de Contatos
    341         usa os tipos MIME definidos nas subclasses de
    342         {@link android.provider.ContactsContract.CommonDataKinds}. Esses tipos MIME tm cdigo aberto
    343         e podem ser usados por qualquer aplicativo ou adaptador de sincronizao que funcione com o Provedor de Contatos.
    344     </dd>
    345     <dt>
    346         {@link android.provider.ContactsContract.DataColumns#IS_PRIMARY}
    347     </dt>
    348     <dd>
    349         Se esse tipo de linha de dados puder ocorrer mais do que uma vez em um contato bruto,
    350         a coluna {@link android.provider.ContactsContract.DataColumns#IS_PRIMARY} sinaliza
    351         a linha de dados que contm os dados primrios do tipo. Por exemplo: se
    352         o usurio pressionar por algum tempo um nmero de telefone de um contato e selecionar <strong>Definir padro</strong>,
    353         a linha {@link android.provider.ContactsContract.Data} que contm esse nmero
    354         tem sua coluna {@link android.provider.ContactsContract.DataColumns#IS_PRIMARY} definida
    355         como um valor diferente de zero.
    356     </dd>
    357 </dl>
    358 <h3 id="GenericColumns">Nomes de coluna genrica</h3>
    359 <p>
    360     H 15 colunas genricas de nome <code>DATA1</code> a
    361     <code>DATA15</code> que esto, em geral, disponveis e quatro colunas genricas
    362      adicionais <code>SYNC1</code> a <code>SYNC4</code> que devem ser usadas somente por adaptadores
    363     de sincronizao. As constantes de nome da coluna genrica sempre funcionam independentemente do tipo
    364     de dados que a linha contenha.
    365 </p>
    366 <p>
    367     A coluna <code>DATA1</code>  indexada.  O Provedor de Contatos sempre usa essa coluna para
    368     os dados que o provedor espera serem os alvos mais frequentes de uma consulta. Por exemplo:
    369     em uma linha de e-mail, essa coluna contm o endereo de e-mail atual.
    370 </p>
    371 <p>
    372     Por conveno, a coluna <code>DATA15</code>  reservada para armazenar dados de BLOBs
    373     (Binary Large Object), como miniaturas de fotos.
    374 </p>
    375 <h3 id="TypeSpecificNames">Nomes de coluna de tipo especfico</h3>
    376 <p>
    377     Para facilitar o trabalho com as colunas para um tipo especfico de linha, o Provedor de Contatos
    378     tambm fornece constantes de nome de colunas de tipo especfico, definidas em subclasses de
    379     {@link android.provider.ContactsContract.CommonDataKinds}. As constantes simplesmente do
    380     um nome de constante diferente para o mesmo nome de coluna, o que ajuda no acesso aos dados em uma linha
    381     de um tipo especfico.
    382 </p>
    383 <p>
    384     Por exemplo: a classe {@link android.provider.ContactsContract.CommonDataKinds.Email} define
    385     constantes de nome de coluna de tipo especfico para uma linha {@link android.provider.ContactsContract.Data}
    386     que tem o tipo MIME
    387     {@link android.provider.ContactsContract.CommonDataKinds.Email#CONTENT_ITEM_TYPE
    388     Email.CONTENT_ITEM_TYPE}. A classe contm a constante
    389     {@link android.provider.ContactsContract.CommonDataKinds.Email#ADDRESS} para a coluna de endereo
    390     de e-mail. O valor atual
    391     de {@link android.provider.ContactsContract.CommonDataKinds.Email#ADDRESS}  "data1", que 
    392     igual ao nome genrico da coluna.
    393 </p>
    394 <p class="caution">
    395     <strong>Ateno:</strong> no adicione seus dados personalizados
    396      tabela {@link android.provider.ContactsContract.Data} usando uma linha que tenha um dos
    397     tipos de MIME predefinidos do provedor. Caso contrrio, h o risco de perda de dados ou mau funcionamento
    398     do provedor. Por exemplo: no se deve adicionar uma linha com o tipo MIME
    399     {@link android.provider.ContactsContract.CommonDataKinds.Email#CONTENT_ITEM_TYPE
    400     Email.CONTENT_ITEM_TYPE} que contenha um nome de usurio em vez de um endereo de e-mail na
    401     coluna <code>DATA1</code>. Se for usado um tipo MIME personalizado para a linha, ser possvel
    402     definir os prprios nomes de coluna de tipo especfico e usar as colunas como quiser.
    403 </p>
    404 <p>
    405     A figura 2 mostra como colunas descritivas e colunas de dados aparecem
    406     em uma linha {@link android.provider.ContactsContract.Data} e como os nomes de coluna de tipo especfico se "sobrepem"
    407     aos nomes de coluna genrica.
    408 </p>
    409 <img src="{@docRoot}images/providers/data_columns.png" alt="How type-specific column names map to generic column names" height="311" id="figure2" />
    410 <p class="img-caption">
    411   <strong>Figura 2.</strong> Nomes de coluna de tipo especfico e nomes de coluna genrica.
    412 </p>
    413 <h3 id="ColumnMaps">Classes de nome de coluna de tipo especfico</h3>
    414 <p>
    415     A tabela 2 lista as classes de nome de coluna de tipo especfico mais usadas:
    416 </p>
    417 <p class="table-caption" id="table2">
    418   <strong>Tabela 2.</strong> Classes de nome de coluna de tipo especfico</p>
    419 <table>
    420   <tr>
    421     <th scope="col">Classes de mapeamento</th>
    422     <th scope="col">Tipo de dados</th>
    423     <th scope="col">Observaes</th>
    424   </tr>
    425   <tr>
    426     <td>{@link android.provider.ContactsContract.CommonDataKinds.StructuredName}</td>
    427     <td>Os dados de nome do contato bruto associados a essa linha de dados.</td>
    428     <td>Os contatos brutos tm apenas uma dessas linhas.</td>
    429   </tr>
    430   <tr>
    431     <td>{@link android.provider.ContactsContract.CommonDataKinds.Photo}</td>
    432     <td>A foto principal do contato bruto associada a essa linha de dados.</td>
    433     <td>Os contatos brutos tm apenas uma dessas linhas.</td>
    434   </tr>
    435   <tr>
    436     <td>{@link android.provider.ContactsContract.CommonDataKinds.Email}</td>
    437     <td>Um endereo de e-mail do contato bruto associado a essa linha de dados.</td>
    438     <td>Os contatos brutos podem ter diversos endereos de e-mail.</td>
    439   </tr>
    440   <tr>
    441     <td>{@link android.provider.ContactsContract.CommonDataKinds.StructuredPostal}</td>
    442     <td>Um endereo postal do contato bruto associado a essa linha de dados.</td>
    443     <td>Os contatos brutos podem ter diversos endereos postais.</td>
    444   </tr>
    445   <tr>
    446     <td>{@link android.provider.ContactsContract.CommonDataKinds.GroupMembership}</td>
    447     <td>Um identificador que vincula o contato bruto a um dos grupos no Provedor de Contatos.</td>
    448     <td>
    449         Grupos so um recurso opcional de um tipo e um nome de conta. Eles so descritos
    450         mais detalhadamente na seo <a href="#Groups">Grupos de contato</a>.
    451     </td>
    452   </tr>
    453 </table>
    454 <h3 id="ContactBasics">Contatos</h3>
    455 <p>
    456     O Provedor de Contatos combina as linhas do contato bruto entre todos os tipos e nomes de conta
    457     para formar um <strong>contato</strong>. Isso facilita a exibio e modificao de todos os dados de uma pessoa que um
    458     usurio tenha coletado. O Provedor de Contatos gerencia a criao de linhas
    459     de novos contatos e a agregao de contatos brutos a uma linha de contato existente. Nem os aplicativos, nem
    460     os adaptadores de sincronizao tm permisso para adicionar contatos, e algumas colunas em uma linha de contato so de somente leitura.
    461 </p>
    462 <p class="note">
    463     <strong>Observao:</strong> a tentativa de adicionar um contato ao Provedor de Contatos com um
    464     {@link android.content.ContentResolver#insert(Uri,ContentValues) insert()} gerar
    465     uma exceo {@link java.lang.UnsupportedOperationException}. A tentativa de atualizar uma coluna
    466     listada como "somente leitura" ser ignorada.
    467 </p>
    468 <p>
    469     O Provedor de Contatos cria um novo contato em resposta  adio de um novo contato bruto
    470     que no corresponda a nenhum contato existente. O provedor tambm faz isso se os dados de um
    471     contato bruto existente mudam de modo a no corresponder mais ao contato
    472     inserido anteriormente. Se um aplicativo ou um adaptador de sincronizao criar um novo contato bruto que
    473     <em>corresponda</em> a um contato existente, o novo contato bruto ser agregado ao contato
    474     existente.
    475 </p>
    476 <p>
    477     O Provedor de Contatos liga uma linha do contato s linhas do contato bruto com a coluna <code>_ID</code>
    478     da linha do contato na tabela
    479     {@link android.provider.ContactsContract.Contacts Contacts}. A coluna <code>CONTACT_ID</code> da tabela de contatos brutos
    480     {@link android.provider.ContactsContract.RawContacts} contm valores <code>_ID</code> para
    481     a linha dos contatos associados a cada linha dos contatos brutos.
    482 </p>
    483 <p>
    484     A tabela {@link android.provider.ContactsContract.Contacts} tambm tem a coluna
    485     {@code android.provider.ContactsContract.ContactsColumns#LOOKUP_KEY}, que 
    486     um vnculo "permanente" com a linha do contato. Como o Provedor de Contatos mantm contatos
    487     automaticamente, ele pode mudar o valor de {@code android.provider.BaseColumns#_ID} da linha do contato
    488     em resposta a uma agregao ou sincronizao. Mesmo que isso acontea, a URI de contedo
    489     {@link android.provider.ContactsContract.Contacts#CONTENT_LOOKUP_URI} combinada com
    490     {@code android.provider.ContactsContract.ContactsColumns#LOOKUP_KEY} do contato continuar
    491     apontado para a linha do contato para permitir o uso de
    492     {@code android.provider.ContactsContract.ContactsColumns#LOOKUP_KEY}
    493     e manter ligaes com contatos "favoritos" e assim por diante. Essa coluna tem o prprio formato, que
    494     no tem nenhuma relao com o formato da coluna {@code android.provider.BaseColumns#_ID}.
    495 </p>
    496 <p>
    497     A figura 3 mostra como as trs tabelas principais se relacionam entre si.
    498 </p>
    499 <img src="{@docRoot}images/providers/contacts_tables.png" alt="Contacts provider main tables" height="514" id="figure4" />
    500 <p class="img-caption">
    501   <strong>Figura 3.</strong> Contatos, contatos brutos e relacionamentos da tabela de detalhes.
    502 </p>
    503 <h2 id="Sources">Dados de adaptadores de sincronizao</h2>
    504 <p>
    505     Os usurios inserem dados de contato diretamente no dispositivo, mas os dados tambm so direcionados ao Provedor
    506     de Contatos a partir de servios web via <strong>adaptadores de sincronizao</strong>, que automatizam
    507     a transferncia de dados entre dispositivo e servios. Adaptadores de sincronizao funcionam em segundo plano,
    508     controlados pelo sistema, e chamam mtodos {@link android.content.ContentResolver}
    509     para gerenciar os dados.
    510 </p>
    511 <p>
    512     No Android, o servio web com o qual um adaptador de sincronizao trabalha  identificado por um tipo de conta.
    513     Cada adaptador de sincronizao funciona com um tipo de conta, mas  compatvel com diversos nomes de conta
    514     para o tipo em questo. Tipos e nomes de conta so descritos brevemente na seo
    515     <a href="#RawContactsExample">Fontes de dados de contatos brutos</a>. As definies a seguir fornecem
    516     mais detalhes e descrevem como o tipo e o nome de conta se relacionam com adaptadores de sincronizao e servios.
    517 </p>
    518 <dl>
    519     <dt>
    520         Tipo de conta
    521     </dt>
    522     <dd>
    523         Identifica um servio em que o usurio tenha armazenado dados. Na maior parte do tempo, o usurio deve
    524         autenticar com o servio. Por exemplo: Google Contacts  um tipo de conta, identificado
    525         pelo cdigo <code>google.com</code>. Esse valor corresponde ao tipo de conta usado pelo
    526         {@link android.accounts.AccountManager}.
    527     </dd>
    528     <dt>
    529         Nome da conta
    530     </dt>
    531     <dd>
    532         Identifica uma conta ou login especfico de um tipo de conta. As contas Google Contacts
    533         so idnticas s contas Google, que tm um endereo de e-mail como nome da conta.
    534         Outros servios podem usar um nome de usurio com s uma palavra ou ID numrico.
    535     </dd>
    536 </dl>
    537 <p>
    538     Os tipos de conta no precisam ser exclusivos. Um usurio pode configurar diversas contas Google Contacts
    539     e baixar os dados dela para o Provedor de Contatos. Isso pode acontecer se o usurio tiver um grupo de
    540     contatos pessoais para um nome de conta pessoal e outro grupo para um de conta de trabalho. Nomes de conta normalmente
    541     so exclusivos. Juntos, eles identificam um fluxo de dados especficos entre o Provedor de Contatos e
    542     um servio externo.
    543 </p>
    544 <p>
    545     Se voc desejar transferir os dados do servio ao Provedor de Contatos, precisar criar seu
    546     prprio adaptador de sincronizao. Isso  descrito com mais detalhes na seo
    547     <a href="#SyncAdapters">Adaptadores de sincronizao do Provedor de Contatos</a>.
    548 </p>
    549 <p>
    550     A figura 4 mostra como o Provedor de Contatos se insere no fluxo de dados
    551     sobre pessoas. Na caixa marcada "adaptadores de sincronizao", cada adaptador  etiquetado pelo tipo de conta.
    552 </p>
    553 <img src="{@docRoot}images/providers/ContactsDataFlow.png" alt="Flow of data about people" height="252" id="figure5" />
    554 <p class="img-caption">
    555   <strong>Figura 4.</strong> Fluxo de dados do Provedor de Contatos.
    556 </p>
    557 <h2 id="Permissions">Permisses necessrias</h2>
    558 <p>
    559     Os aplicativos que queiram acessar o Provedor de Contatos devem solicitar as seguintes
    560     permisses:
    561 </p>
    562 <dl>
    563     <dt>Acesso de leitura a uma ou mais tabelas</dt>
    564     <dd>
    565         {@link android.Manifest.permission#READ_CONTACTS}, especificado em
    566         <code>AndroidManifest.xml</code> com
    567         o elemento <code><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html">
    568         &lt;uses-permission&gt;</a></code>
    569         como <code>&lt;uses-permission android:name="android.permission.READ_CONTACTS"&gt;</code>.
    570     </dd>
    571     <dt>Acesso de gravao a uma ou mais tabelas</dt>
    572     <dd>
    573         {@link android.Manifest.permission#WRITE_CONTACTS}, especificado em
    574         <code>AndroidManifest.xml</code> com
    575         o elemento <code><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html">
    576         &lt;uses-permission&gt;</a></code>
    577         como <code>&lt;uses-permission android:name="android.permission.WRITE_CONTACTS"&gt;</code>.
    578     </dd>
    579 </dl>
    580 <p>
    581     Essas permisses no se estendem aos dados do perfil do usurio. O perfil do usurio
    582         e suas permisses necessrias so abordados na seo a seguir:
    583         <a href="#UserProfile">O perfil do usurio</a>.
    584 </p>
    585 <p>
    586     Lembre-se de que os dados de contato do usurio so pessoais e confidenciais. Os usurios se preocupam
    587     com a privacidade e, por isso, no querem aplicativos que coletem dados sobre eles ou seus contatos.
    588     Se no for bvio o motivo da necessidade de permisses para acessar os dados de contato de um usurio, eles podem atribuir
    589     avaliaes ruins ao seu aplicativo ou simplesmente no instal-lo.
    590 </p>
    591 <h2 id="UserProfile">O perfil do usurio</h2>
    592 <p>
    593     A tabela {@link android.provider.ContactsContract.Contacts} tem uma nica linha contendo
    594     os dados do perfil do usurio do dispositivo. Esses dados descrevem o <code>user</code> do dispositivo em vez
    595     de um dos contatos do usurio. A linha de contatos do perfil  vinculada a uma linha
    596     de contatos brutos para cada sistema que usa um perfil.
    597     Cada linha de contato bruto de perfil pode ter diversas linhas de dados. Constantes de acesso ao perfil
    598     do usurio esto disponveis na classe {@link android.provider.ContactsContract.Profile}.
    599 </p>
    600 <p>
    601     O acesso ao perfil do usurio exige permisses especiais. Alm das permisses
    602     {@link android.Manifest.permission#READ_CONTACTS} e
    603     {@link android.Manifest.permission#WRITE_CONTACTS} necessrias para ler e gravar, o acesso
    604     ao perfil do usurio requer as permisses {@code android.Manifest.permission#READ_PROFILE} e
    605     {@code android.Manifest.permission#WRITE_PROFILE}, respectivamente, para ler e
    606     gravar.
    607 </p>
    608 <p>
    609     Lembre-se de que  preciso considerar a confidencialidade de um perfil do usurio. A permisso
    610     {@code android.Manifest.permission#READ_PROFILE} permite o acesso aos dados de identificao
    611     pessoal do usurio do dispositivo. Certifique-se de informar ao usurio o motivo
    612     da necessidade de permisses de acesso ao perfil do usurio na descrio do aplicativo.
    613 </p>
    614 <p>
    615     Para recuperar a linha de contato que contm o perfil do usurio,
    616     chame {@link android.content.ContentResolver#query(Uri,String[], String, String[], String)
    617     ContentResolver.query()}. Defina a URI de contedo como
    618     {@link android.provider.ContactsContract.Profile#CONTENT_URI} e no fornea nenhum
    619     critrio de seleo. Tambm  possvel usar essa URI de contedo como base para recuperar
    620     contatos brutos ou dados do perfil. Por exemplo, esse fragmento recupera dados do perfil:
    621 </p>
    622 <pre>
    623 // Sets the columns to retrieve for the user profile
    624 mProjection = new String[]
    625     {
    626         Profile._ID,
    627         Profile.DISPLAY_NAME_PRIMARY,
    628         Profile.LOOKUP_KEY,
    629         Profile.PHOTO_THUMBNAIL_URI
    630     };
    631 
    632 // Retrieves the profile from the Contacts Provider
    633 mProfileCursor =
    634         getContentResolver().query(
    635                 Profile.CONTENT_URI,
    636                 mProjection ,
    637                 null,
    638                 null,
    639                 null);
    640 </pre>
    641 <p class="note">
    642     <strong>Observao:</strong> se voc recuperar diversas linhas de contato e quiser determinar se uma delas
    643      o perfil do usurio, teste a coluna
    644     {@link android.provider.ContactsContract.ContactsColumns#IS_USER_PROFILE} da linha. Essa coluna
    645      definida como "1" se o contato for o perfil do usurio.
    646 </p>
    647 <h2 id="ContactsProviderMetadata">Metadados do Provedor de Contatos</h2>
    648 <p>
    649     O Provedor de Contatos gerencia dados que acompanham o estado dos dados de contatos
    650     no repositrio. Esses metadados sobre o repositrio so armazenados em vrios locais, inclusive
    651     os contatos brutos, os dados e as linhas da tabela de contatos,
    652     a tabela {@link android.provider.ContactsContract.Settings}
    653     e a tabela {@link android.provider.ContactsContract.SyncState}. A tabela a seguir mostra
    654     o efeito de cada uma dessas partes de metadados:
    655 </p>
    656 <p class="table-caption" id="table3">
    657   <strong>Tabela 3.</strong> Metadados no Provedor de Contatos</p>
    658 <table>
    659     <tr>
    660         <th scope="col">Tabela</th>
    661         <th scope="col">Coluna</th>
    662         <th scope="col">Valores</th>
    663         <th scope="col">Significado</th>
    664     </tr>
    665     <tr>
    666         <td rowspan="2">{@link android.provider.ContactsContract.RawContacts}</td>
    667         <td rowspan="2">{@link android.provider.ContactsContract.SyncColumns#DIRTY}</td>
    668         <td>"0" - sem modificao desde a ltima sincronizao.</td>
    669         <td rowspan="2">
    670             Sinaliza contatos brutos que no mudaram no dispositivo e devem ser sincronizados com
    671             o servidor. O valor  definido automaticamente pelo Provedor de Contatos quando os aplicativos
    672             do Android atualizam uma linha.
    673             <p>
    674                 Adaptadores de sincronizao que modificam o contato bruto ou as tabelas de dados sempre devem anexar a
    675                 string {@link android.provider.ContactsContract#CALLER_IS_SYNCADAPTER}
    676                  URI de contedo usada. Isso evita que o provedor sinalize alguma linha como suja.
    677                 Caso contrrio, as modificaes do adaptador de sincronizao parecem ser modificaes locais e so
    678                 enviadas ao servidor, mesmo que o servidor seja a origem da modificao.
    679             </p>
    680         </td>
    681     </tr>
    682     <tr>
    683             <td>"1" - modificado desde a ltima sincronizao, precisa ser sincronizado com o servidor.</td>
    684     </tr>
    685     <tr>
    686         <td>{@link android.provider.ContactsContract.RawContacts}</td>
    687         <td>{@link android.provider.ContactsContract.SyncColumns#VERSION}</td>
    688         <td>O nmero da verso dessa linha.</td>
    689         <td>
    690             O Provedor de Contatos incrementa esse valor automaticamente sempre que a linha ou
    691             os dados relacionados a ela mudam.
    692         </td>
    693     </tr>
    694     <tr>
    695         <td>{@link android.provider.ContactsContract.Data}</td>
    696         <td>{@link android.provider.ContactsContract.DataColumns#DATA_VERSION}</td>
    697         <td>O nmero da verso dessa linha.</td>
    698         <td>
    699             O Provedor de Contatos incrementa esse valor automaticamente sempre que a linha de dados
    700              modificada.
    701         </td>
    702     </tr>
    703     <tr>
    704         <td>{@link android.provider.ContactsContract.RawContacts}</td>
    705         <td>{@link android.provider.ContactsContract.SyncColumns#SOURCE_ID}</td>
    706         <td>
    707             Valor de string que identifica exclusivamente esse contato bruto para a conta em
    708             que foi criado.
    709         </td>
    710         <td>
    711             Quando um adaptador de sincronizao cria um novo contato bruto, essa coluna deve ser definida como
    712             o ID exclusivo do servidor para o contato bruto. Quando um aplicativo do Android cria um novo
    713             contato bruto, o aplicativo deve deixar essa coluna vazia. Isso sinaliza ao adaptador
    714             de sincronizao que ele deve criar um novo contato bruto no servidor e obter
    715             um valor para o {@link android.provider.ContactsContract.SyncColumns#SOURCE_ID}.
    716             <p>
    717                 Em particular, o ID de origem deve ser <strong>exclusivo</strong> de cada tipo
    718             de conta e estvel em sincronizaes:
    719             </p>
    720                 <ul>
    721                     <li>
    722                         Exclusivo: cada contato bruto de uma conta deve ter o prprio ID de origem. Se isso
    723                         no for aplicado, haver problemas no aplicativo de contatos.
    724                         Observe que dois contatos brutos do mesmo <em>tipo</em> de conta podem ter
    725                         o mesmo ID de origem. Por exemplo: o contato bruto "Thomas Higginson" da
    726                         conta {@code emily.dickinson (a] gmail.com} pode ter o mesmo ID
    727                         de origem do contato bruto "Thomas Higginson" da conta
    728                         {@code emilyd (a] gmail.com}.
    729                     </li>
    730                     <li>
    731                         Estvel: IDs de origem so uma parte permanente dos dados do servio on-line para
    732                         o contato bruto. Por exemplo: se o usurio apaga o Armazenamento de Contatos
    733                         nas configuraes dos aplicativos e ressincroniza, os contatos brutos restaurados devem ter os mesmos
    734                         IDs de origem de antes. Se isso no for aplicado, os atalhos
    735                         deixaro de funcionar.
    736                     </li>
    737                 </ul>
    738         </td>
    739     </tr>
    740     <tr>
    741         <td rowspan="2">{@link android.provider.ContactsContract.Groups}</td>
    742         <td rowspan="2">{@link android.provider.ContactsContract.GroupsColumns#GROUP_VISIBLE}</td>
    743         <td>"0" - os contatos nesse grupo no devem ser visveis em IUs do aplicativo do Android.</td>
    744         <td>
    745             Essa coluna se destina  compatibilidade com servidores, que permitem que um usurio oculte contatos
    746             em determinados grupos.
    747         </td>
    748     </tr>
    749     <tr>
    750         <td>"1" - os contatos nesse grupo podem ser visveis nas IUs do aplicativo.</td>
    751     </tr>
    752     <tr>
    753         <td rowspan="2">{@link android.provider.ContactsContract.Settings}</td>
    754         <td rowspan="2">
    755             {@link android.provider.ContactsContract.SettingsColumns#UNGROUPED_VISIBLE}</td>
    756         <td>
    757             "0" - para essa conta e esse tipo de conta, os contatos que no pertencem a um grupo so
    758             invisveis nas IUs do aplicativo do Android.
    759         </td>
    760         <td rowspan="2">
    761             Por padro, os contatos so invisveis se nenhum dos contatos brutos pertencer a algum grupo
    762             (a associao de grupo de um contato bruto  indicada por uma ou mais
    763             linhas {@link android.provider.ContactsContract.CommonDataKinds.GroupMembership}
    764             na tabela {@link android.provider.ContactsContract.Data}).
    765             Por padro,  possvel fazer com que contatos sem grupos sejam visveis
    766             por meio desse sinalizador na linha da tabela {@link android.provider.ContactsContract.Settings} para um tipo de conta e uma conta.
    767             Esse sinalizador serve para exibir contatos de servidores que no usam grupos.
    768         </td>
    769     </tr>
    770     <tr>
    771         <td>
    772             "1" - para essa conta e esse tipo de conta, os contatos que no pertencem a um grupo so
    773             visveis nas IUs do aplicativo.
    774         </td>
    775 
    776     </tr>
    777     <tr>
    778         <td>{@link android.provider.ContactsContract.SyncState}</td>
    779         <td>(todos)</td>
    780         <td>
    781             Use essa tabela para armazenar metadados do seu adaptador de sincronizao.
    782         </td>
    783         <td>
    784             Com essa tabela,  possvel armazenar o estado de sincronizao e outros dados relacionados  sincronizao persistentes
    785             no dispositivo.
    786         </td>
    787     </tr>
    788 </table>
    789 <h2 id="Access">Acesso ao Provedor de Contatos</h2>
    790 <p>
    791     Esta seo descreve orientaes quanto ao acesso a dados do Provedor de Contatos, com foco
    792     no seguinte:
    793 </p>
    794 <ul>
    795     <li>
    796         Consultas de entidade.
    797     </li>
    798     <li>
    799         Modificao em lote.
    800     </li>
    801     <li>
    802         Recuperao e modificao com intenes.
    803     </li>
    804     <li>
    805         Integridade dos dados.
    806     </li>
    807 </ul>
    808 <p>
    809     A realizao de modificaes de um adaptador de sincronizao tambm  abordada na seo
    810     <a href="#SyncAdapters">Adaptadores de sincronizao do Provedor de Contatos</a>.
    811 </p>
    812 <h3 id="Entities">Consultas de entidades</h3>
    813 <p>
    814     A organizao hierrquica das tabelas do Provedor de Contatos  muito til
    815     para recuperar uma linha e todas as linhas "filhas" vinculadas. Por exemplo: para exibir
    816     todas as informaes de uma pessoa, voc pode querer recuperar todas
    817     as linhas {@link android.provider.ContactsContract.RawContacts} de uma nica
    818     linha {@link android.provider.ContactsContract.Contacts} ou todas
    819     as linhas {@link android.provider.ContactsContract.CommonDataKinds.Email} de uma nica
    820     linha {@link android.provider.ContactsContract.RawContacts}. Para facilitar isso, o Provedor
    821     de contatos oferece a ideia de <strong>entidade</strong>, que atua como uma juno dos bancos de dados entre
    822     tabelas.
    823 </p>
    824 <p>
    825     Entidade  como uma tabela composta de colunas selecionadas de uma tabela pai e uma tabela filha.
    826     Ao consultar uma entidade, fornece-se uma projeo e buscam-se critrios com base nas colunas
    827     disponveis da entidade. O resultado  um {@link android.database.Cursor} que contm
    828     uma linha para cada linha recuperada da tabela filha. Por exemplo: ao consultar
    829     {@link android.provider.ContactsContract.Contacts.Entity} de um nome de contato
    830     e todas as linhas {@link android.provider.ContactsContract.CommonDataKinds.Email} de todos os
    831     contatos brutos por esse nome, voc obter um {@link android.database.Cursor} contendo uma linha
    832     para cada linha {@link android.provider.ContactsContract.CommonDataKinds.Email}.
    833 </p>
    834 <p>
    835     As entidades simplificam as consultas. Usando uma entidade,  possvel recuperar todos os dados de contatos
    836     de um contato ou contato bruto de uma vez, sem precisar consultar primeiro a tabela pai para obter
    837     um ID e, em seguida, ter que consultar a tabela filha com esse ID. Alm disso, o Provedor de Contatos processa
    838     uma consulta com uma entidade em uma transao nica, o que garante que os dados recuperados
    839     sejam consistentes internamente.
    840 </p>
    841 <p class="note">
    842     <strong>Observao:</strong> uma entidade normalmente no contm todas as colunas da tabela pai e
    843     da tabela filha. Se voc tentar trabalhar com um nome de coluna que no esteja na lista de constantes de nomes de coluna
    844     da entidade, ser gerada uma {@link java.lang.Exception}.
    845 </p>
    846 <p>
    847     O fragmento a seguir mostra como recuperar todas as linhas de contato bruto de um contato. O fragmento
    848      parte de um aplicativo maior que tem duas atividades: "principal" e de detalhes". A atividade principal
    849     exibe uma lista de linhas de contato. Quando um usurio seleciona uma delas, a atividade envia o ID correspondente  atividade
    850     de detalhes. A atividade de detalhes usa {@link android.provider.ContactsContract.Contacts.Entity}
    851     para exibir todas as linhas de dados de todos os contatos brutos associados ao contato
    852     selecionado.
    853 </p>
    854 <p>
    855     Esse fragmento  extrado da atividade "de detalhes":
    856 </p>
    857 <pre>
    858 ...
    859     /*
    860      * Appends the entity path to the URI. In the case of the Contacts Provider, the
    861      * expected URI is content://com.google.contacts/#/entity (# is the ID value).
    862      */
    863     mContactUri = Uri.withAppendedPath(
    864             mContactUri,
    865             ContactsContract.Contacts.Entity.CONTENT_DIRECTORY);
    866 
    867     // Initializes the loader identified by LOADER_ID.
    868     getLoaderManager().initLoader(
    869             LOADER_ID,  // The identifier of the loader to initialize
    870             null,       // Arguments for the loader (in this case, none)
    871             this);      // The context of the activity
    872 
    873     // Creates a new cursor adapter to attach to the list view
    874     mCursorAdapter = new SimpleCursorAdapter(
    875             this,                        // the context of the activity
    876             R.layout.detail_list_item,   // the view item containing the detail widgets
    877             mCursor,                     // the backing cursor
    878             mFromColumns,                // the columns in the cursor that provide the data
    879             mToViews,                    // the views in the view item that display the data
    880             0);                          // flags
    881 
    882     // Sets the ListView's backing adapter.
    883     mRawContactList.setAdapter(mCursorAdapter);
    884 ...
    885 &#64;Override
    886 public Loader&lt;Cursor&gt; onCreateLoader(int id, Bundle args) {
    887 
    888     /*
    889      * Sets the columns to retrieve.
    890      * RAW_CONTACT_ID is included to identify the raw contact associated with the data row.
    891      * DATA1 contains the first column in the data row (usually the most important one).
    892      * MIMETYPE indicates the type of data in the data row.
    893      */
    894     String[] projection =
    895         {
    896             ContactsContract.Contacts.Entity.RAW_CONTACT_ID,
    897             ContactsContract.Contacts.Entity.DATA1,
    898             ContactsContract.Contacts.Entity.MIMETYPE
    899         };
    900 
    901     /*
    902      * Sorts the retrieved cursor by raw contact id, to keep all data rows for a single raw
    903      * contact collated together.
    904      */
    905     String sortOrder =
    906             ContactsContract.Contacts.Entity.RAW_CONTACT_ID +
    907             " ASC";
    908 
    909     /*
    910      * Returns a new CursorLoader. The arguments are similar to
    911      * ContentResolver.query(), except for the Context argument, which supplies the location of
    912      * the ContentResolver to use.
    913      */
    914     return new CursorLoader(
    915             getApplicationContext(),  // The activity's context
    916             mContactUri,              // The entity content URI for a single contact
    917             projection,               // The columns to retrieve
    918             null,                     // Retrieve all the raw contacts and their data rows.
    919             null,                     //
    920             sortOrder);               // Sort by the raw contact ID.
    921 }
    922 </pre>
    923 <p>
    924     Quando o carregamento  finalizado, {@link android.app.LoaderManager} invoca um retorno de chamada para
    925     {@link android.app.LoaderManager.LoaderCallbacks#onLoadFinished(Loader, D)
    926     onLoadFinished()}. Um dos argumentos de entrada nesse mtodo  um
    927     {@link android.database.Cursor} com os resultados da consulta. No seu aplicativo, voc pode obter os
    928     dados desse {@link android.database.Cursor} para exibi-los ou trabalhar com eles posteriormente.
    929 </p>
    930 <h3 id="Transactions">Modificao em lote</h3>
    931 <p>
    932     Sempre que possvel, deve-se inserir, atualizar e excluir dados no Provedor de Contatos
    933     em "modo de lote", criando um {@link java.util.ArrayList} de
    934     objetos {@link android.content.ContentProviderOperation} e chamando
    935     {@link android.content.ContentResolver#applyBatch(String, ArrayList) applyBatch()}. Como
    936     o Provedor de Contatos realiza todas as operaes em um
    937     {@link android.content.ContentResolver#applyBatch(String, ArrayList) applyBatch()} em uma nica
    938     transao, as modificaes nunca deixaro o repositrio de contatos em um estado
    939     inconsistente. As modificaes em lote tambm facilitam a insero de um contato bruto e seus dados de detalhe
    940     ao mesmo tempo.
    941 </p>
    942 <p class="note">
    943     <strong>Observao:</strong> para modificar um contato bruto <em>exclusivo</em>, considere enviar uma inteno ao
    944     aplicativo de contatos do dispositivo em vez de realizar a modificao no aplicativo.
    945     Na seo <a href="#Intents">Recuperao e modificao com intenes</a> h mais detalhes
    946     sobre como fazer isso.
    947 </p>
    948 <h4>Pontos de rendimento</h4>
    949 <p>
    950     As modificaes em lote que contiverem muitas operaes podem bloquear outros processos,
    951     resultando em uma experincia geral ruim para o usurio. Para organizar todas as modificaes
    952     a realizar no menor nmero de listas separadas possvel e, ao mesmo tempo, evitar
    953     o bloqueio do sistema,  preciso definir <strong>pontos de rendimento</strong> para uma ou mais operaes.
    954     Pontos de rendimento so objetos {@link android.content.ContentProviderOperation} que tm seu
    955     valor {@link android.content.ContentProviderOperation#isYieldAllowed()} definido como
    956     <code>true</code>. Quando o Provedor de Contatos encontra um ponto de rendimento, ele pausa o trabalho
    957     para permitir a execuo de outros processos e encerra a transao em curso. Quando o provedor retorna, ele
    958     continua na prxima operao da {@link java.util.ArrayList} e inicia
    959     uma nova transao.
    960 </p>
    961 <p>
    962     Os pontos de rendimento resultam em mais de uma transao por chamada de
    963     {@link android.content.ContentResolver#applyBatch(String, ArrayList) applyBatch()}. Por isso,
    964      preciso definir um ponto de rendimento para a ltima operao de um conjunto de linhas relacionadas.
    965     Por exemplo:  preciso definir um ponto de rendimento para a ltima operao em um conjunto que adicione
    966     linhas de um contato bruto e linhas de dados associados a ele, ou para a ltima operao de um conjunto de linhas relacionadas
    967     a um nico contato.
    968 </p>
    969 <p>
    970     Os pontos de rendimento tambm so uma unidade de operao atmica. Todos os acessos entre dois pontos de rendimento
    971     tero sucesso ou fracasso como uma unidade. Se no houver pontos de rendimento definidos, a menor
    972     operao atmica ser todo o lote de operaes. Se forem usados pontos de rendimento, eles evitaro
    973     que as operaes prejudiquem o desempenho do sistema e, ao mesmo tempo, garantir que o subconjunto
    974     de operaes seja atmico.
    975 </p>
    976 <h4>Referncias de retorno da modificao</h4>
    977 <p>
    978     Ao inserir uma nova linha de contato bruto e as linhas de dados associados como um conjunto
    979     de objetos {@link android.content.ContentProviderOperation},  preciso vincular as linhas de dados
    980      linha de contato bruto pela insero do valor
    981     {@code android.provider.BaseColumns#_ID} do contato bruto como
    982     o valor {@link android.provider.ContactsContract.DataColumns#RAW_CONTACT_ID}. Contudo, esse
    983     valor no est disponvel ao criar a {@link android.content.ContentProviderOperation}
    984     para a linha de dados porque
    985     {@link android.content.ContentProviderOperation} ainda no foi aplicada  linha de contato bruto. Para trabalhar com isso,
    986     a classe {@link android.content.ContentProviderOperation.Builder} tem o mtodo
    987     {@link android.content.ContentProviderOperation.Builder#withValueBackReference(String, int) withValueBackReference()}.
    988     Esse mtodo permite a insero ou modificao de uma coluna com
    989     o resultado de uma operao anterior.
    990 </p>
    991 <p>
    992     O mtodo {@link android.content.ContentProviderOperation.Builder#withValueBackReference(String, int) withValueBackReference()}
    993     tem dois argumentos:
    994 </p>
    995     <dl>
    996         <dt>
    997             <code>key</code>
    998         </dt>
    999         <dd>
   1000             O principal de um par de valores principais. O valor desse argumento deve ser o nome de uma coluna
   1001             na tabela que ser modificada.
   1002         </dd>
   1003         <dt>
   1004             <code>previousResult</code>
   1005         </dt>
   1006         <dd>
   1007             O ndice com base 0 de um valor em uma matriz
   1008             de objetos {@link android.content.ContentProviderResult}
   1009 de             {@link android.content.ContentResolver#applyBatch(String, ArrayList) applyBatch()}. Quando
   1010             as operaes em lote so aplicadas, o resultado de cada operao  armazenado
   1011             em uma matriz intermediria de resultados. O valor <code>previousResult</code>  o ndice
   1012             de um desses resultados, que  recuperado e armazenado com o valor
   1013             <code>key</code>. Isso permite a insero de um novo registro de contato bruto e a recuperao do seu
   1014             valor {@code android.provider.BaseColumns#_ID}, seguido de uma "referncia de retorno" ao
   1015             valor ao adicionar uma linha {@link android.provider.ContactsContract.Data}.
   1016             <p>
   1017                 Toda a matriz de resultados  criada ao chamar
   1018                 {@link android.content.ContentResolver#applyBatch(String, ArrayList) applyBatch()} pela primeira vez,
   1019                 com tamanho igual ao da {@link java.util.ArrayList}
   1020                 de objetos {@link android.content.ContentProviderOperation} fornecidos. No entanto, todos
   1021                 os elementos na matriz de resultados so definidos como <code>null</code> e, se houver uma tentativa
   1022                 de referncia de retorno a um resultado de uma operao ainda no realizada,
   1023 {@link android.content.ContentProviderOperation.Builder#withValueBackReference(String, int) withValueBackReference()}
   1024                 gera uma {@link java.lang.Exception}.
   1025 
   1026             </p>
   1027         </dd>
   1028     </dl>
   1029 <p>
   1030     Os fragmentos a seguir mostram como inserir um novo contato bruto e dados em lote. Eles
   1031     contm o cdigo que estabelece um ponto de rendimento e usam uma referncia de retorno. Os fragmentos so
   1032     uma verso expandida do mtodo <code>createContacEntry()</code>, que  parte
   1033     da classe <code>ContactAdder</code>
   1034     no aplicativo de exemplo de <code><a href="{@docRoot}resources/samples/ContactManager/index.html">
   1035     Contact Manager</a></code>.
   1036 </p>
   1037 <p>
   1038     O primeiro fragmento recupera dados de contato da IU. Nesse momento, o usurio j
   1039     selecionou a conta na qual o novo contato bruto deve ser adicionado.
   1040 </p>
   1041 <pre>
   1042 // Creates a contact entry from the current UI values, using the currently-selected account.
   1043 protected void createContactEntry() {
   1044     /*
   1045      * Gets values from the UI
   1046      */
   1047     String name = mContactNameEditText.getText().toString();
   1048     String phone = mContactPhoneEditText.getText().toString();
   1049     String email = mContactEmailEditText.getText().toString();
   1050 
   1051     int phoneType = mContactPhoneTypes.get(
   1052             mContactPhoneTypeSpinner.getSelectedItemPosition());
   1053 
   1054     int emailType = mContactEmailTypes.get(
   1055             mContactEmailTypeSpinner.getSelectedItemPosition());
   1056 </pre>
   1057 <p>
   1058     O prximo fragmento cria uma operao para inserir a linha de contato bruto
   1059     na tabela {@link android.provider.ContactsContract.RawContacts}:
   1060 </p>
   1061 <pre>
   1062     /*
   1063      * Prepares the batch operation for inserting a new raw contact and its data. Even if
   1064      * the Contacts Provider does not have any data for this person, you can't add a Contact,
   1065      * only a raw contact. The Contacts Provider will then add a Contact automatically.
   1066      */
   1067 
   1068      // Creates a new array of ContentProviderOperation objects.
   1069     ArrayList&lt;ContentProviderOperation&gt; ops =
   1070             new ArrayList&lt;ContentProviderOperation&gt;();
   1071 
   1072     /*
   1073      * Creates a new raw contact with its account type (server type) and account name
   1074      * (user's account). Remember that the display name is not stored in this row, but in a
   1075      * StructuredName data row. No other data is required.
   1076      */
   1077     ContentProviderOperation.Builder op =
   1078             ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
   1079             .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, mSelectedAccount.getType())
   1080             .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, mSelectedAccount.getName());
   1081 
   1082     // Builds the operation and adds it to the array of operations
   1083     ops.add(op.build());
   1084 </pre>
   1085 <p>
   1086     Em seguida, o cdigo cria linhas de dados para as linhas de nome de exibio, telefone e e-mail.
   1087 </p>
   1088 <p>
   1089     Cada objeto construtor de operaes usa
   1090     {@link android.content.ContentProviderOperation.Builder#withValueBackReference(String, int) withValueBackReference()}
   1091     para obter
   1092     o {@link android.provider.ContactsContract.DataColumns#RAW_CONTACT_ID}. Os pontos de referncia
   1093     voltam ao objeto {@link android.content.ContentProviderResult} a partir da primeira operao,
   1094     que adiciona a linha de contato bruto e retorna seu novo valor
   1095     {@code android.provider.BaseColumns#_ID}. Como resultado, cada linha de dados  automaticamente vinculada por meio do
   1096     {@link android.provider.ContactsContract.DataColumns#RAW_CONTACT_ID}
   1097      nova linha {@link android.provider.ContactsContract.RawContacts}  qual ela pertence.
   1098 </p>
   1099 <p>
   1100     O objeto {@link android.content.ContentProviderOperation.Builder} que adiciona a linha de e-mail 
   1101     sinalizado com {@link android.content.ContentProviderOperation.Builder#withYieldAllowed(boolean)
   1102     withYieldAllowed()}, que define um ponto de rendimento:
   1103 </p>
   1104 <pre>
   1105     // Creates the display name for the new raw contact, as a StructuredName data row.
   1106     op =
   1107             ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
   1108             /*
   1109              * withValueBackReference sets the value of the first argument to the value of
   1110              * the ContentProviderResult indexed by the second argument. In this particular
   1111              * call, the raw contact ID column of the StructuredName data row is set to the
   1112              * value of the result returned by the first operation, which is the one that
   1113              * actually adds the raw contact row.
   1114              */
   1115             .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
   1116 
   1117             // Sets the data row's MIME type to StructuredName
   1118             .withValue(ContactsContract.Data.MIMETYPE,
   1119                     ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
   1120 
   1121             // Sets the data row's display name to the name in the UI.
   1122             .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name);
   1123 
   1124     // Builds the operation and adds it to the array of operations
   1125     ops.add(op.build());
   1126 
   1127     // Inserts the specified phone number and type as a Phone data row
   1128     op =
   1129             ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
   1130             /*
   1131              * Sets the value of the raw contact id column to the new raw contact ID returned
   1132              * by the first operation in the batch.
   1133              */
   1134             .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
   1135 
   1136             // Sets the data row's MIME type to Phone
   1137             .withValue(ContactsContract.Data.MIMETYPE,
   1138                     ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
   1139 
   1140             // Sets the phone number and type
   1141             .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phone)
   1142             .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, phoneType);
   1143 
   1144     // Builds the operation and adds it to the array of operations
   1145     ops.add(op.build());
   1146 
   1147     // Inserts the specified email and type as a Phone data row
   1148     op =
   1149             ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
   1150             /*
   1151              * Sets the value of the raw contact id column to the new raw contact ID returned
   1152              * by the first operation in the batch.
   1153              */
   1154             .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
   1155 
   1156             // Sets the data row's MIME type to Email
   1157             .withValue(ContactsContract.Data.MIMETYPE,
   1158                     ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
   1159 
   1160             // Sets the email address and type
   1161             .withValue(ContactsContract.CommonDataKinds.Email.ADDRESS, email)
   1162             .withValue(ContactsContract.CommonDataKinds.Email.TYPE, emailType);
   1163 
   1164     /*
   1165      * Demonstrates a yield point. At the end of this insert, the batch operation's thread
   1166      * will yield priority to other threads. Use after every set of operations that affect a
   1167      * single contact, to avoid degrading performance.
   1168      */
   1169     op.withYieldAllowed(true);
   1170 
   1171     // Builds the operation and adds it to the array of operations
   1172     ops.add(op.build());
   1173 </pre>
   1174 <p>
   1175     O ltimo fragmento exibe a chamada
   1176     a {@link android.content.ContentResolver#applyBatch(String, ArrayList) applyBatch()} que
   1177     insere as novas linhas de contato bruto e de dados.
   1178 </p>
   1179 <pre>
   1180     // Ask the Contacts Provider to create a new contact
   1181     Log.d(TAG,"Selected account: " + mSelectedAccount.getName() + " (" +
   1182             mSelectedAccount.getType() + ")");
   1183     Log.d(TAG,"Creating contact: " + name);
   1184 
   1185     /*
   1186      * Applies the array of ContentProviderOperation objects in batch. The results are
   1187      * discarded.
   1188      */
   1189     try {
   1190 
   1191             getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
   1192     } catch (Exception e) {
   1193 
   1194             // Display a warning
   1195             Context ctx = getApplicationContext();
   1196 
   1197             CharSequence txt = getString(R.string.contactCreationFailure);
   1198             int duration = Toast.LENGTH_SHORT;
   1199             Toast toast = Toast.makeText(ctx, txt, duration);
   1200             toast.show();
   1201 
   1202             // Log exception
   1203             Log.e(TAG, "Exception encountered while inserting contact: " + e);
   1204     }
   1205 }
   1206 </pre>
   1207 <p>
   1208     As operaes de lote tambm permitem a implementao de <strong>controle otimista de simultaneidade</strong>,
   1209     um mtodo de aplicar transaes de modificao sem precisar bloquear o repositrio subjacente.
   1210     Para usar esse mtodo, aplique a transao e, em seguida, verifique se h outras modificaes que
   1211     possam ter sido realizadas ao mesmo tempo. Se ficar determinado que houve uma modificao incoerente,
   1212     reverte-se a transao e tenta-se novamente.
   1213 </p>
   1214 <p>
   1215     O controle otimista de simultaneidade  til para dispositivos mveis em que haja somente um usurio
   1216     de uma vez e que sejam raros os acessos simultneos a um repositrio de dados. Como os bloqueios no so usados,
   1217     no h tempo gasto em bloqueios de configurao nem espera para que outras transaes liberem os respectivos bloqueios.
   1218 </p>
   1219 <p>
   1220     Para usar o controle otimista de simultaneidade ao atualizar uma nica
   1221     linha {@link android.provider.ContactsContract.RawContacts}, siga estas etapas:
   1222 </p>
   1223 <ol>
   1224     <li>
   1225         Recupere a coluna {@link android.provider.ContactsContract.SyncColumns#VERSION}
   1226         do contato bruto em conjunto com os outros dados recuperados.
   1227     </li>
   1228     <li>
   1229         Crie um objeto {@link android.content.ContentProviderOperation.Builder} adequado para
   1230         forar uma restrio com o mtodo
   1231         {@link android.content.ContentProviderOperation#newAssertQuery(Uri)}. Para a URI de contedo,
   1232         use {@link android.provider.ContactsContract.RawContacts#CONTENT_URI
   1233         RawContacts.CONTENT_URI}
   1234         com o {@code android.provider.BaseColumns#_ID} do contato bruto anexado a ela.
   1235     </li>
   1236     <li>
   1237         Para o objeto {@link android.content.ContentProviderOperation.Builder}, chame
   1238         {@link android.content.ContentProviderOperation.Builder#withValue(String, Object)
   1239         withValue()} para comparar a coluna
   1240         {@link android.provider.ContactsContract.SyncColumns#VERSION} com o nmero da verso recm-recuperado.
   1241     </li>
   1242     <li>
   1243         Para o mesmo {@link android.content.ContentProviderOperation.Builder}, chame
   1244         {@link android.content.ContentProviderOperation.Builder#withExpectedCount(int)
   1245         withExpectedCount()} para garantir que somente uma linha seja testada por essa instruo.
   1246     </li>
   1247     <li>
   1248         Chame {@link android.content.ContentProviderOperation.Builder#build()} para criar
   1249         o objeto {@link android.content.ContentProviderOperation}; em seguida, adicione esse objeto como
   1250         o primeiro objeto na {@link java.util.ArrayList} passada para
   1251         {@link android.content.ContentResolver#applyBatch(String, ArrayList) applyBatch()}.
   1252     </li>
   1253     <li>
   1254         Aplique a transao em lote.
   1255     </li>
   1256 </ol>
   1257 <p>
   1258     Se a linha de contato bruto for atualizada por outra operao entre o momento da leitura da linha
   1259        e o momento de sua modificao, a "assert" {@link android.content.ContentProviderOperation}
   1260         falhar e todo o lote de operaes ser cancelado. Depois disso, as opes so tentar novamente
   1261         ou tomar outra medida.
   1262 </p>
   1263 <p>
   1264     O fragmento a seguir demonstra como criar uma "assert"
   1265         {@link android.content.ContentProviderOperation} aps consultar um contato bruto exclusivo usando
   1266     um {@link android.content.CursorLoader}:
   1267 </p>
   1268 <pre>
   1269 /*
   1270  * The application uses CursorLoader to query the raw contacts table. The system calls this method
   1271  * when the load is finished.
   1272  */
   1273 public void onLoadFinished(Loader&lt;Cursor&gt; loader, Cursor cursor) {
   1274 
   1275     // Gets the raw contact's _ID and VERSION values
   1276     mRawContactID = cursor.getLong(cursor.getColumnIndex(BaseColumns._ID));
   1277     mVersion = cursor.getInt(cursor.getColumnIndex(SyncColumns.VERSION));
   1278 }
   1279 
   1280 ...
   1281 
   1282 // Sets up a Uri for the assert operation
   1283 Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, mRawContactID);
   1284 
   1285 // Creates a builder for the assert operation
   1286 ContentProviderOperation.Builder assertOp = ContentProviderOperation.netAssertQuery(rawContactUri);
   1287 
   1288 // Adds the assertions to the assert operation: checks the version and count of rows tested
   1289 assertOp.withValue(SyncColumns.VERSION, mVersion);
   1290 assertOp.withExpectedCount(1);
   1291 
   1292 // Creates an ArrayList to hold the ContentProviderOperation objects
   1293 ArrayList ops = new ArrayList&lt;ContentProviderOperationg&gt;;
   1294 
   1295 ops.add(assertOp.build());
   1296 
   1297 // You would add the rest of your batch operations to "ops" here
   1298 
   1299 ...
   1300 
   1301 // Applies the batch. If the assert fails, an Exception is thrown
   1302 try
   1303     {
   1304         ContentProviderResult[] results =
   1305                 getContentResolver().applyBatch(AUTHORITY, ops);
   1306 
   1307     } catch (OperationApplicationException e) {
   1308 
   1309         // Actions you want to take if the assert operation fails go here
   1310     }
   1311 </pre>
   1312 <h3 id="Intents">Recuperao e modificao com intenes</h3>
   1313 <p>
   1314     Enviar uma inteno ao aplicativo de contatos do dispositivo permite o acesso indireto ao Provedor
   1315     de contatos. A inteno inicia a IU do aplicativo de contatos do dispositivo, na qual os usurios podem
   1316     fazer tarefas relacionadas a contatos. Com esse tipo de acesso, os usurios podem:
   1317     <ul>
   1318         <li>Selecionar um contato de uma lista e retorn-lo ao aplicativo para trabalhos futuros.</li>
   1319         <li>Editar dados de um contato existente.</li>
   1320         <li>Inserir um novo contato bruto para quaisquer das suas contas.</li>
   1321         <li>Excluir um contato ou dados dos contatos.</li>
   1322     </ul>
   1323 <p>
   1324     Se o usurio estiver inserindo ou atualizando dados,  possvel coletar os dados antes e envi-los como
   1325     parte da inteno.
   1326 </p>
   1327 <p>
   1328     Ao usar intenes para acessar o Provedor de Contatos por meio do aplicativo de contatos do dispositivo,
   1329     no  necessrio criar a prpria IU ou cdigo para acessar o provedor. Tambm no  necessrio
   1330     solicitar permisso de leitura e gravao ao provedor. O aplicativo de contatos do dispositivo pode
   1331     delegar a voc permisses de leitura de um contato e, pelo fato de voc fazer modificaes
   1332     no provedor por meio de outro aplicativo, no  necessrio ter permisses de gravao.
   1333 </p>
   1334 <p>
   1335     O processo geral de envio de uma inteno para acessar um provedor  descrito detalhadamente
   1336     no guia<a href="{@docRoot}guide/topics/providers/content-provider-basics.html">
   1337 Preceitos do provedor de contedo</a>, seo "Acesso a dados via intenes". Os valores
   1338     de ao, do tipo MIME e dos dados usados para as tarefas disponveis so resumidos na tabela 4
   1339     e os valores extras que podem ser usados com
   1340     {@link android.content.Intent#putExtra(String, String) putExtra()} so listados na
   1341     documentao de referncia de {@link android.provider.ContactsContract.Intents.Insert}:
   1342 </p>
   1343 <p class="table-caption" id="table4">
   1344   <strong>Tabela 4.</strong> Intenes do Provedor de Contatos
   1345 </p>
   1346 <table style="width:75%">
   1347     <tr>
   1348         <th scope="col" style="width:10%">Tarefa</th>
   1349         <th scope="col" style="width:5%">Ao</th>
   1350         <th scope="col" style="width:10%">Dados</th>
   1351         <th scope="col" style="width:10%">Tipo MIME</th>
   1352         <th scope="col" style="width:25%">Observaes</th>
   1353     </tr>
   1354     <tr>
   1355         <td><strong>Selecionar um contato de uma lista</strong></td>
   1356         <td>{@link android.content.Intent#ACTION_PICK}</td>
   1357         <td>
   1358             Um dos seguintes:
   1359             <ul>
   1360                 <li>
   1361 {@link android.provider.ContactsContract.Contacts#CONTENT_URI Contacts.CONTENT_URI},
   1362                     que exibe uma lista de contatos.
   1363                 </li>
   1364                 <li>
   1365 {@link android.provider.ContactsContract.CommonDataKinds.Phone#CONTENT_URI Phone.CONTENT_URI},
   1366                     que exibe uma lista de nmeros de telefone de um contato bruto.
   1367                 </li>
   1368                 <li>
   1369 {@link android.provider.ContactsContract.CommonDataKinds.StructuredPostal#CONTENT_URI
   1370 StructuredPostal.CONTENT_URI},
   1371                     que exibe uma lista de endereos postais de um contato bruto.
   1372                 </li>
   1373                 <li>
   1374 {@link android.provider.ContactsContract.CommonDataKinds.Email#CONTENT_URI Email.CONTENT_URI},
   1375                     que exibe uma lista de endereos de e-mail de um contato bruto.
   1376                 </li>
   1377             </ul>
   1378         </td>
   1379         <td>
   1380             No usado
   1381         </td>
   1382         <td>
   1383             Exibe uma lista de contatos brutos ou uma lista de dados de um contato bruto conforme
   1384             o tipo da URI de contedo fornecido.
   1385             <p>
   1386                 Chame
   1387          {@link android.app.Activity#startActivityForResult(Intent, int) startActivityForResult()},
   1388                 que retorna a URI de contedo da linha selecionada. O formulrio da URI  a
   1389                 URI de contedo da tabela com o <code>LOOKUP_ID</code> da linha anexado a ela.
   1390                 O aplicativo de contatos do dispositivo delega permisses de leitura e gravao a essa URI de contedo
   1391                 pelo tempo que a atividade durar. Consulte
   1392                 o guia<a href="{@docRoot}guide/topics/providers/content-provider-basics.html">
   1393                 Preceitos do provedor de contedo</a> para obter mais detalhes.
   1394             </p>
   1395         </td>
   1396     </tr>
   1397     <tr>
   1398         <td><strong>Inserir um novo contato bruto</strong></td>
   1399         <td>{@link android.provider.ContactsContract.Intents.Insert#ACTION Insert.ACTION}</td>
   1400         <td>No aplicvel</td>
   1401         <td>
   1402             {@link android.provider.ContactsContract.RawContacts#CONTENT_TYPE
   1403             RawContacts.CONTENT_TYPE}, tipo MIME para um grupo de contatos brutos.
   1404         </td>
   1405         <td>
   1406             Exibe a tela <strong>Adicionar contato</strong> do aplicativo de contatos do dispositivo.
   1407             So exibidos os valores extras adicionados  inteno. Se enviada com
   1408         {@link android.app.Activity#startActivityForResult(Intent, int) startActivityForResult()},
   1409             a URI de contedo do contato bruto recentemente adicionado  passada de volta
   1410             ao mtodo de retorno de chamada
   1411             {@link android.app.Activity#onActivityResult(int, int, Intent) onActivityResult()}no argumento {@link android.content.Intent},
   1412 no campo "dados". Para obter o valor, chame {@link android.content.Intent#getData()}.
   1413         </td>
   1414     </tr>
   1415     <tr>
   1416         <td><strong>Editar um contato</strong></td>
   1417         <td>{@link android.content.Intent#ACTION_EDIT}</td>
   1418         <td>
   1419             {@link android.provider.ContactsContract.Contacts#CONTENT_LOOKUP_URI}
   1420             do contato. A atividade do editor permitir que o usurio edite os dados associados
   1421             a esse contato.
   1422         </td>
   1423         <td>
   1424             {@link android.provider.ContactsContract.Contacts#CONTENT_ITEM_TYPE
   1425             Contacts.CONTENT_ITEM_TYPE}, um nico contato.</td>
   1426         <td>
   1427             Exibe a tela Editar contato no aplicativo de contatos. So exibidos os valores extras
   1428             adicionados  inteno. Quando o usurio clica em <strong>Concludo</strong> para salvar
   1429             as edies, a atividade retorna ao primeiro plano.
   1430         </td>
   1431     </tr>
   1432     <tr>
   1433         <td><strong>Exibir um seletor que tambm pode adicionar dados.</strong></td>
   1434         <td>{@link android.content.Intent#ACTION_INSERT_OR_EDIT}</td>
   1435         <td>
   1436             No aplicvel
   1437         </td>
   1438         <td>
   1439             {@link android.provider.ContactsContract.Contacts#CONTENT_ITEM_TYPE}
   1440         </td>
   1441          <td>
   1442             Essa inteno sempre exibe a tela do seletor do aplicativo de contatos. </strong>O usurio pode
   1443             selecionar um contato para editar ou adicionar um novo.  exibida a tela de edio ou de adio,
   1444             conforme a escolha do usurio e so exibidos os dados extras passados
   1445             para a inteno. Se o aplicativo exibe dados de contato como um e-mail ou nmero de telefone, use
   1446             essa inteno para permitir que o usurio adicione os dados a um contato existente.
   1447 
   1448             <p class="note">
   1449                 <strong>Observao:</strong> No  necessrio enviar nenhum valor de nome dos extras da inteno
   1450             porque o usurio sempre seleciona um nome existente ou adiciona um novo. Alm disso,
   1451             se voc enviar um nome e o usurio escolher editar, o aplicativo de contatos
   1452             exibir o nome enviado, substituindo o valor anterior. Se o usurio
   1453             no notar isso e salvar a edio, o valor antigo ser perdido.
   1454             </p>
   1455          </td>
   1456     </tr>
   1457 </table>
   1458 <p>
   1459     O aplicativo de contatos do dispositivo no permite a excluso de um contato bruto ou de seus dados
   1460     com uma inteno. Em vez disso, para excluir um contato bruto, use
   1461     {@link android.content.ContentResolver#delete(Uri, String, String[]) ContentResolver.delete()}
   1462     ou {@link android.content.ContentProviderOperation#newDelete(Uri)
   1463     ContentProviderOperation.newDelete()}.
   1464 </p>
   1465 <p>
   1466     O fragmento a seguir mostra como construir e enviar uma inteno que insira um novo
   1467     contato bruto e dados:
   1468 </p>
   1469 <pre>
   1470 // Gets values from the UI
   1471 String name = mContactNameEditText.getText().toString();
   1472 String phone = mContactPhoneEditText.getText().toString();
   1473 String email = mContactEmailEditText.getText().toString();
   1474 
   1475 String company = mCompanyName.getText().toString();
   1476 String jobtitle = mJobTitle.getText().toString();
   1477 
   1478 // Creates a new intent for sending to the device's contacts application
   1479 Intent insertIntent = new Intent(ContactsContract.Intents.Insert.ACTION);
   1480 
   1481 // Sets the MIME type to the one expected by the insertion activity
   1482 insertIntent.setType(ContactsContract.RawContacts.CONTENT_TYPE);
   1483 
   1484 // Sets the new contact name
   1485 insertIntent.putExtra(ContactsContract.Intents.Insert.NAME, name);
   1486 
   1487 // Sets the new company and job title
   1488 insertIntent.putExtra(ContactsContract.Intents.Insert.COMPANY, company);
   1489 insertIntent.putExtra(ContactsContract.Intents.Insert.JOB_TITLE, jobtitle);
   1490 
   1491 /*
   1492  * Demonstrates adding data rows as an array list associated with the DATA key
   1493  */
   1494 
   1495 // Defines an array list to contain the ContentValues objects for each row
   1496 ArrayList&lt;ContentValues&gt; contactData = new ArrayList&lt;ContentValues&gt;();
   1497 
   1498 
   1499 /*
   1500  * Defines the raw contact row
   1501  */
   1502 
   1503 // Sets up the row as a ContentValues object
   1504 ContentValues rawContactRow = new ContentValues();
   1505 
   1506 // Adds the account type and name to the row
   1507 rawContactRow.put(ContactsContract.RawContacts.ACCOUNT_TYPE, mSelectedAccount.getType());
   1508 rawContactRow.put(ContactsContract.RawContacts.ACCOUNT_NAME, mSelectedAccount.getName());
   1509 
   1510 // Adds the row to the array
   1511 contactData.add(rawContactRow);
   1512 
   1513 /*
   1514  * Sets up the phone number data row
   1515  */
   1516 
   1517 // Sets up the row as a ContentValues object
   1518 ContentValues phoneRow = new ContentValues();
   1519 
   1520 // Specifies the MIME type for this data row (all data rows must be marked by their type)
   1521 phoneRow.put(
   1522         ContactsContract.Data.MIMETYPE,
   1523         ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE
   1524 );
   1525 
   1526 // Adds the phone number and its type to the row
   1527 phoneRow.put(ContactsContract.CommonDataKinds.Phone.NUMBER, phone);
   1528 
   1529 // Adds the row to the array
   1530 contactData.add(phoneRow);
   1531 
   1532 /*
   1533  * Sets up the email data row
   1534  */
   1535 
   1536 // Sets up the row as a ContentValues object
   1537 ContentValues emailRow = new ContentValues();
   1538 
   1539 // Specifies the MIME type for this data row (all data rows must be marked by their type)
   1540 emailRow.put(
   1541         ContactsContract.Data.MIMETYPE,
   1542         ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE
   1543 );
   1544 
   1545 // Adds the email address and its type to the row
   1546 emailRow.put(ContactsContract.CommonDataKinds.Email.ADDRESS, email);
   1547 
   1548 // Adds the row to the array
   1549 contactData.add(emailRow);
   1550 
   1551 /*
   1552  * Adds the array to the intent's extras. It must be a parcelable object in order to
   1553  * travel between processes. The device's contacts app expects its key to be
   1554  * Intents.Insert.DATA
   1555  */
   1556 insertIntent.putParcelableArrayListExtra(ContactsContract.Intents.Insert.DATA, contactData);
   1557 
   1558 // Send out the intent to start the device's contacts app in its add contact activity.
   1559 startActivity(insertIntent);
   1560 </pre>
   1561 <h3 id="DataIntegrity">Integridade dos dados</h3>
   1562 <p>
   1563     Como o repositrio de contatos contm dados importantes e confidenciais que usurios esperam que estejam
   1564     corretos e atualizados, o Provedor de Contatos tem regras bem definidas para a integridade dos dados.  de
   1565     sua responsabilidade adequar-se a essas regras ao modificar dados de contatos. As regras
   1566     importantes so listadas a seguir:
   1567 </p>
   1568 <dl>
   1569     <dt>
   1570         Sempre adicione uma linha {@link android.provider.ContactsContract.CommonDataKinds.StructuredName}
   1571         para cada linha {@link android.provider.ContactsContract.RawContacts} adicionada.
   1572     </dt>
   1573     <dd>
   1574         Uma linha {@link android.provider.ContactsContract.RawContacts} sem uma
   1575         linha {@link android.provider.ContactsContract.CommonDataKinds.StructuredName}
   1576         na tabela {@link android.provider.ContactsContract.Data} pode causar problemas durante
   1577         a agregao.
   1578     </dd>
   1579     <dt>
   1580         Sempre conecte novas linhas {@link android.provider.ContactsContract.Data} s respectivas
   1581         linhas pai {@link android.provider.ContactsContract.RawContacts}.
   1582     </dt>
   1583     <dd>
   1584         Uma linha {@link android.provider.ContactsContract.Data} que no esteja conectada a um
   1585         {@link android.provider.ContactsContract.RawContacts} no ser visvel no aplicativo
   1586         de contatos do dispositivo, o que pode causar problemas com adaptadores de sincronizao.
   1587     </dd>
   1588     <dt>
   1589         Altere dados somente para os seus contatos brutos.
   1590     </dt>
   1591     <dd>
   1592         Lembre-se de que o Provedor de Contatos normalmente gerencia dados de diversos tipos de conta
   1593         e servios on-line diferentes.  preciso garantir que o aplicativo modifique
   1594         ou exclua somente dados de linhas que pertencem a voc e que ele insira dados apenas
   1595         com um tipo e nome de conta que voc controla.
   1596     </dd>
   1597     <dt>
   1598         Sempre use as constantes definidas em {@link android.provider.ContactsContract} e suas
   1599         subclasses de autoridades, URIs de contedo, caminhos de URI, nomes de coluna, tipos MIME e
   1600         valores {@link android.provider.ContactsContract.CommonDataKinds.CommonColumns#TYPE}.
   1601     </dt>
   1602     <dd>
   1603         O uso dessas constantes ajuda a evitar erros. Voc tambm ser notificado com avisos
   1604         do compilador se uma das constantes no for aprovada.
   1605     </dd>
   1606 </dl>
   1607 <h3 id="CustomData">Linhas de dados personalizados</h3>
   1608 <p>
   1609     Ao criar e usar seus prprios tipos MIME personalizados, voc pode inserir, editar, excluir e recuperar
   1610     suas linhas de dados na tabela {@link android.provider.ContactsContract.Data}. As linhas
   1611     so limitadas a usar a coluna definida em
   1612     {@link android.provider.ContactsContract.DataColumns}, embora seja possvel mapear
   1613     os nomes de coluna de tipo especfico para os nomes de coluna padro. No aplicativo de contatos do dispositivo,
   1614     os dados das linhas so exibidos, mas no podem ser editados nem excludos e os usurios no podem inserir
   1615     dados adicionais. Para permitir que usurios modifiquem suas linhas de dados personalizados,  necessrio fornecer
   1616     uma atividade do editor no prprio aplicativo.
   1617 </p>
   1618 <p>
   1619     Para exibir os dados personalizados, fornea um arquivo <code>contacts.xml</code> contendo
   1620     um elemento <code>&lt;ContactsAccountType&gt;</code> ou um ou mais
   1621     dos elementos filho <code>&lt;ContactsDataKind&gt;</code>. Isso  abordado com mais detalhes na
   1622     seo <a href="#SocialStreamDataKind"><code>&lt;ContactsDataKind&gt; element</code></a>.
   1623 </p>
   1624 <p>
   1625     Para saber mais sobre tipos MIME personalizados, leia o
   1626     guia <a href="{@docRoot}guide/topics/providers/content-provider-creating.html">
   1627     Criao de um provedor de contedo</a>.
   1628 </p>
   1629 <h2 id="SyncAdapters">Adaptadores de sincronizao do Provedor de Contatos</h2>
   1630 <p>
   1631     O Provedor de Contatos foi projetado especificamente para tratar a <strong>sincronizao</strong>
   1632     de dados de contatos entre um dispositivo e um servio on-line. Isso permite que usurios baixem
   1633     dados existentes em um novo dispositivo e transfiram dados existentes a uma nova conta.
   1634     A sincronizao tambm garante que usurios tenham os dados mais recentes  mo, independentemente
   1635     da origem de adies e alteraes. Outra vantagem da sincronizao 
   1636     a disponibilidade dos dados dos contatos mesmo quando o dispositivo no est conectado  rede.
   1637 </p>
   1638 <p>
   1639     Embora seja possvel implementar a sincronizao de diversos modos, o sistema Android fornece
   1640     uma estrutura de sincronizao de extenso que automatiza as seguintes tarefas:
   1641     <ul>
   1642 
   1643     <li>
   1644         Verificao da disponibilidade da rede.
   1645     </li>
   1646     <li>
   1647         Agendamento e execuo de sincronizaes, com base nas preferncias do usurio.
   1648     </li>
   1649     <li>
   1650         Reinicializao de sincronizaes que foram interrompidas.
   1651     </li>
   1652     </ul>
   1653 <p>
   1654     Para usar essa estrutura, deve-se fornecer uma extenso do adaptador de sincronizao. Cada adaptador de sincronizao  exclusivo
   1655     de um servio e um provedor de contedo, mas pode tratar diversos nomes de conta do mesmo servio.
   1656     A estrutura tambm permite diversos adaptadores de sincronizao para o mesmo servio e provedor.
   1657 </p>
   1658 <h3 id="SyncClassesFiles">Classes e arquivos do adaptador de sincronizao</h3>
   1659 <p>
   1660     O adaptador de sincronizao  implementado como uma subclasse
   1661     de {@link android.content.AbstractThreadedSyncAdapter} e instalado como parte do aplicativo
   1662     do Android. O sistema coleta dados do adaptador de sincronizao a partir de elementos no manifesto
   1663     do aplicativo e de um arquivo XML especial direcionado pelo manifesto. O arquivo XML define
   1664     o tipo de conta do servio on-line e a autoridade do provedor de contedo que, juntos,
   1665     identificam exclusivamente o adaptador. O adaptador de sincronizao no fica ativo at que o usurio adicione
   1666     uma conta para o tipo de conta do adaptador de sincronizao e habilite a sincronizao para
   1667     o provedor de contedo com o qual o adaptador se sincroniza.  Nesse ponto, o sistema comea a gerenciar o adaptador,
   1668     chamando-o quando necessrio para estabelecer a sincronizao entre o provedor de contedo e o servidor.
   1669 </p>
   1670 <p class="note">
   1671     <strong>Observao:</strong> usar um tipo de conta como parte da identificao do adaptador de sincronizao permite
   1672     que o sistema detecte e agrupe adaptadores de sincronizao que acessam diferentes servios
   1673     da mesma organizao. Por exemplo, todos os adaptadores de sincronizao dos servios on-line da Google tm o mesmo
   1674     tipo de conta <code>com.google</code>. Quando o usurio adiciona uma conta Google aos dispositivos, todos
   1675     os adaptadores de sincronizao dos servios Google instalados so listados juntos; cada um
   1676     dos listados sincroniza-se com um provedor de contedo diferente no dispositivo.
   1677 </p>
   1678 <p>
   1679     Como a maioria dos servios exige que usurios verifiquem a identidade antes de acessar
   1680     os dados, o sistema Android oferece uma estrutura de autenticao similar  estrutura
   1681     dos adaptadores de sincronizao e muitas vezes usada junto com eles. A estrutura de autenticao usa
   1682     autenticadores de extenso que so subclasses
   1683     de {@link android.accounts.AbstractAccountAuthenticator}. Um autenticador verifica
   1684     a identidade do usurio nas seguintes etapas:
   1685     <ol>
   1686         <li>
   1687             Coleta nome, senha ou informao similar do usurio (as <strong>credenciais</strong>
   1688             do usurio).
   1689         </li>
   1690         <li>
   1691             Envia as credenciais para o servio
   1692         </li>
   1693         <li>
   1694             Avalia a resposta do servio.
   1695         </li>
   1696     </ol>
   1697 <p>
   1698     Se o servio aceitar as credenciais, o autenticador pode
   1699     armazen-las para uso futuro. Devido  estrutura do autenticador de extenso,
   1700     o {@link android.accounts.AccountManager} pode conferir acesso a quaisquer tokens de autenticao compatveis com
   1701     um autenticador que escolha exp-los, como os tokens de autenticao OAuth2.
   1702 </p>
   1703 <p>
   1704     Embora as autenticaes no sejam necessrias, a maioria dos servios de contato as usam.
   1705     Contudo, no  obrigatrio usar a estrutura de autenticao do Android para efetu-las.
   1706 </p>
   1707 <h3 id="SyncAdapterImplementing">Implementao do adaptador de sincronizao</h3>
   1708 <p>
   1709     Para implementar um adaptador de sincronizao para o Provedor de Contatos, primeiramente  necessrio criar
   1710     um aplicativo do Android que contenha o seguinte:
   1711 </p>
   1712     <dl>
   1713         <dt>
   1714             Um componente {@link android.app.Service} que responda a solicitaes do sistema para
   1715             vincular ao adaptador de sincronizao.
   1716         </dt>
   1717         <dd>
   1718             Quando o sistema quer executar uma sincronizao, ele chama o mtodo
   1719             {@link android.app.Service#onBind(Intent) onBind()} do servio para obter
   1720             um {@link android.os.IBinder} para o adaptador de sincronizao. Isso permite que o sistema efetue chamadas
   1721             entre processos aos mtodos do adaptador.
   1722             <p>
   1723                 No aplicativo
   1724             <a href="{@docRoot}resources/samples/SampleSyncAdapter/index.html">Exemplo de adaptador de sincronizao</a>, o nome de classe desse servio 
   1725                 <code>com.example.android.samplesync.syncadapter.SyncService</code>.
   1726             </p>
   1727         </dd>
   1728         <dt>
   1729             O adaptador de sincronizao atual, implementado como uma subclasse concreta de
   1730                 {@link android.content.AbstractThreadedSyncAdapter}.
   1731         </dt>
   1732         <dd>
   1733             Essa classe realiza o trabalho de baixar dados do servidor, atualizar dados
   1734                 do dispositivo e resolver conflitos. A principal tarefa do adaptador 
   1735                 feita no mtodo {@link android.content.AbstractThreadedSyncAdapter#onPerformSync(
   1736             Account, Bundle, String, ContentProviderClient, SyncResult)
   1737             onPerformSync()}. Essa classe deve ser instanciada como um singleton.
   1738             <p>
   1739                 No aplicativo
   1740             <a href="{@docRoot}resources/samples/SampleSyncAdapter/index.html">Exemplo de adaptador de sincronizao</a>, o adaptador de sincronizao  definido na classe
   1741                 <code>com.example.android.samplesync.syncadapter.SyncAdapter</code>.
   1742             </p>
   1743         </dd>
   1744         <dt>
   1745             Uma subclasse de {@link android.app.Application}.
   1746         </dt>
   1747         <dd>
   1748             Essa classe atua como uma fbrica para o singleton do adaptador de sincronizao. Use
   1749             o mtodo {@link android.app.Application#onCreate()} para instanciar o adaptador de sincronizao
   1750             e fornecer um mtodo "coletor" esttico para retornar o singleton ao
   1751             mtodo {@link android.app.Service#onBind(Intent) onBind()} do servio do adaptador
   1752             de sincronizao.
   1753         </dd>
   1754         <dt>
   1755             <strong>Opcional:</strong> um componente {@link android.app.Service} que responda a
   1756             solicitaes do sistema para autenticao do usurio.
   1757         </dt>
   1758         <dd>
   1759             O {@link android.accounts.AccountManager} ativa esse servio para iniciar o processo
   1760             de autenticao. O mtodo {@link android.app.Service#onCreate()} do servio instancia
   1761             um objeto autenticador. Quando o sistema quer autenticar uma conta de usurio para
   1762             o adaptador de sincronizao do aplicativo, ele chama o mtodo
   1763             {@link android.app.Service#onBind(Intent) onBind()} do servio para obter um
   1764             {@link android.os.IBinder} para o autenticador. Isso permite que o sistema efetue chamadas
   1765             entre processos aos mtodos do autenticador.
   1766             <p>
   1767                 No aplicativo
   1768             <a href="{@docRoot}resources/samples/SampleSyncAdapter/index.html">Exemplo de adaptador de sincronizao</a>, o nome de classe desse servio 
   1769                 <code>com.example.android.samplesync.authenticator.AuthenticationService</code>.
   1770             </p>
   1771         </dd>
   1772         <dt>
   1773             <strong>Opcional:</strong> uma subclasse concreta de
   1774             {@link android.accounts.AbstractAccountAuthenticator} que trate de solicitaes de
   1775             autenticao.
   1776         </dt>
   1777         <dd>
   1778             Essa classe fornece mtodos que chamam {@link android.accounts.AccountManager}
   1779             para autenticar as credenciais do usurio no servidor. Os detalhes
   1780             desse processo de autenticao variam amplamente, com base na tecnologia em uso no servidor. Consulte
   1781             a documentao do software do servidor para ver mais informaes sobre autenticao.
   1782             <p>
   1783                 No aplicativo
   1784             <a href="{@docRoot}resources/samples/SampleSyncAdapter/index.html">Exemplo de adaptador de sincronizao</a>, o autenticador  definido na classe
   1785                 <code>com.example.android.samplesync.authenticator.Authenticator</code>.
   1786             </p>
   1787         </dd>
   1788         <dt>
   1789             Os arquivos XML que definem o adaptador de sincronizao e o autenticador para o sistema.
   1790         </dt>
   1791         <dd>
   1792             Os componentes de servio do adaptador de sincronizao e do autenticador descritos anteriormente so
   1793             definidos em
   1794 elementos <code>&lt;<a href="{@docRoot}guide/topics/manifest/service-element.html">service</a>&gt;</code>
   1795  no manifesto do aplicativo. Esses elementos
   1796             contm
   1797 elementos filho <code>&lt;<a href="{@docRoot}guide/topics/manifest/meta-data-element.html">meta-data</a>&gt;</code>
   1798 que fornecem dados especficos ao
   1799             sistema:
   1800             <ul>
   1801                 <li>
   1802                     O
   1803 elemento <code>&lt;<a href="{@docRoot}guide/topics/manifest/meta-data-element.html">meta-data</a>&gt;</code>
   1804  de servio do adaptador de sincronizao direciona-se
   1805             ao <code>res/xml/syncadapter.xml</code> do arquivo XML. Em troca, esse arquivo especifica
   1806                     uma URI para o servio web que ser sincronizado com o Provedor de Contatos
   1807                     e um tipo de conta.
   1808                 </li>
   1809                 <li>
   1810                     <strong>Opcional:</strong> o
   1811 elemento <code>&lt;<a href="{@docRoot}guide/topics/manifest/meta-data-element.html">meta-data</a>&gt;</code>
   1812  do autenticador aponta para o arquivo XML
   1813                     <code>res/xml/authenticator.xml</code>. Em troca, esse arquivo especifica
   1814                     o tipo de conta compatvel com esse autenticador, bem como recursos de IU
   1815                     que aparecem durante o processo de autenticao. O tipo de conta especificado
   1816                     nesse elemento deve ser o mesmo que o especificado para
   1817                     o adaptador de sincronizao.
   1818                 </li>
   1819             </ul>
   1820         </dd>
   1821     </dl>
   1822 <h2 id="SocialStream">Dados de fluxos sociais</h2>
   1823 <p>
   1824     As tabelas {@code android.provider.ContactsContract.StreamItems}
   1825     e {@code android.provider.ContactsContract.StreamItemPhotos}
   1826     gerenciam dados advindos de redes sociais.  possvel criar um adaptador de sincronizao que adicione dados de fluxo
   1827     da sua prpria rede a essas tabelas ou ler dados de fluxo dessas tabelas
   1828     e exibi-los no seu aplicativo, ou ambos. Com esses recursos, os servios e aplicativos
   1829     de redes sociais podem ser integrados na experincia das redes sociais no Android.
   1830 </p>
   1831 <h3 id="StreamText">Textos de fluxos sociais</h3>
   1832 <p>
   1833     Itens de fluxo sempre so associados a um contato bruto.
   1834     O {@code android.provider.ContactsContract.StreamItemsColumns#RAW_CONTACT_ID} conecta-se ao
   1835     valor <code>_ID</code> do contato bruto. O tipo e o nome da conta do contato
   1836     bruto tambm so armazenados na linha do item de fluxo.
   1837 </p>
   1838 <p>
   1839     Armazene os dados do seu fluxo nas colunas a seguir:
   1840 </p>
   1841 <dl>
   1842     <dt>
   1843         {@code android.provider.ContactsContract.StreamItemsColumns#ACCOUNT_TYPE}
   1844     </dt>
   1845     <dd>
   1846         <strong>Obrigatrio.</strong> O tipo de conta do usurio do contato bruto associado a esse
   1847         item de fluxo. Lembre-se de definir esse valor ao inserir um item de fluxo.
   1848     </dd>
   1849     <dt>
   1850         {@code android.provider.ContactsContract.StreamItemsColumns#ACCOUNT_NAME}
   1851     </dt>
   1852     <dd>
   1853         <strong>Obrigatrio.</strong> O nome de conta do usurio do contato bruto associado
   1854         a esse item de fluxo. Lembre-se de definir esse valor ao inserir um item de fluxo.
   1855     </dd>
   1856     <dt>
   1857         Colunas identificadoras
   1858     </dt>
   1859     <dd>
   1860         <strong>Obrigatrio.</strong>  necessrio inserir as colunas identificadoras a seguir
   1861         ao inserir um item de fluxo:
   1862         <ul>
   1863             <li>
   1864                 {@code android.provider.ContactsContract.StreamItemsColumns#CONTACT_ID}:
   1865                 o valor {@code android.provider.BaseColumns#_ID} do contato ao qual esse item
   1866                 de fluxo est associado.
   1867             </li>
   1868             <li>
   1869                 {@code android.provider.ContactsContract.StreamItemsColumns#CONTACT_LOOKUP_KEY}:
   1870                 o valor{@code android.provider.ContactsContract.ContactsColumns#LOOKUP_KEY} do
   1871                 contato ao qual esse item de fluxo est associado.
   1872             </li>
   1873             <li>
   1874                 {@code android.provider.ContactsContract.StreamItemsColumns#RAW_CONTACT_ID}:
   1875                 o valor {@code android.provider.BaseColumns#_ID} do contato bruto ao qual esse item
   1876                 de fluxo est associado.
   1877             </li>
   1878         </ul>
   1879     </dd>
   1880     <dt>
   1881         {@code android.provider.ContactsContract.StreamItemsColumns#COMMENTS}
   1882     </dt>
   1883     <dd>
   1884         Opcional. Armazena informaes resumidas que podem ser exibidas no incio do item de fluxo.
   1885     </dd>
   1886     <dt>
   1887         {@code android.provider.ContactsContract.StreamItemsColumns#TEXT}
   1888     </dt>
   1889     <dd>
   1890         O texto do item de fluxo, o contedo que foi publicado pela fonte do item
   1891                 ou uma descrio de alguma ao que gerou o item de fluxo. Essa coluna pode conter
   1892                 imagens de recurso incorporadas e de qualquer formato que possam ser renderizadas
   1893         {@link android.text.Html#fromHtml(String) fromHtml()}. O provedor pode truncar
   1894         ou abreviar contedos longos, mas ele tentar evitar quebrar as tags.
   1895     </dd>
   1896     <dt>
   1897         {@code android.provider.ContactsContract.StreamItemsColumns#TIMESTAMP}
   1898     </dt>
   1899     <dd>
   1900         Uma string de texto contendo o tempo em que o item de fluxo foi inserido ou atualizado, em forma
   1901         de <em>milissegundos</em> desde a poca. Aplicativos que inserem ou atualizam itens de fluxo so
   1902         responsveis por manter essa coluna, ela no  mantida automaticamente pelo
   1903         Provedor de Contatos.
   1904     </dd>
   1905 </dl>
   1906 <p>
   1907     Para exibir informaes de identificao para os itens de fluxo, use
   1908     {@code android.provider.ContactsContract.StreamItemsColumns#RES_ICON},
   1909     {@code android.provider.ContactsContract.StreamItemsColumns#RES_LABEL} e
   1910     {@code android.provider.ContactsContract.StreamItemsColumns#RES_PACKAGE} para vincular a recursos
   1911     no aplicativo.
   1912 </p>
   1913 <p>
   1914     A tabela {@code android.provider.ContactsContract.StreamItems} tambm contm as colunas
   1915     {@code android.provider.ContactsContract.StreamItemsColumns#SYNC1} por meio de
   1916     {@code android.provider.ContactsContract.StreamItemsColumns#SYNC4} para uso exclusivo
   1917     dos adaptadores de sincronizao.
   1918 </p>
   1919 <h3 id="StreamPhotos">Fotos de fluxos sociais</h3>
   1920 <p>
   1921    A tabela {@code android.provider.ContactsContract.StreamItemPhotos} armazena fotos associadas
   1922     a um item de fluxo. A coluna
   1923     {@code android.provider.ContactsContract.StreamItemPhotosColumns#STREAM_ITEM_ID} da tabela
   1924     vincula-se a valores na coluna {@code android.provider.BaseColumns#_ID}
   1925     da tabela {@code android.provider.ContactsContract.StreamItems}. Referncias de fotografias so armazenadas
   1926     na tabela nessas colunas:
   1927 </p>
   1928 <dl>
   1929     <dt>
   1930         Coluna {@code android.provider.ContactsContract.StreamItemPhotos#PHOTO} (um BLOB).
   1931     </dt>
   1932     <dd>
   1933         Representao binria da foto, redimensionada pelo provedor para armazenar e exibir.
   1934         Essa coluna est disponvel para compatibilidade retroativa com verses anteriores do Provedor
   1935         de Contatos que a usavam para armazenar fotos. Contudo, na verso atual,
   1936         no se deve usar essa coluna para armazenar fotos. Em vez disso, use
   1937         {@code android.provider.ContactsContract.StreamItemPhotosColumns#PHOTO_FILE_ID} ou
   1938         {@code android.provider.ContactsContract.StreamItemPhotosColumns#PHOTO_URI} (ambas so
   1939         descritas nos pontos a seguir) para armazenar fotos em um arquivo. Essa coluna
   1940         passa a conter uma miniatura da foto, que estar disponvel para leitura.
   1941     </dd>
   1942     <dt>
   1943         {@code android.provider.ContactsContract.StreamItemPhotosColumns#PHOTO_FILE_ID}
   1944     </dt>
   1945     <dd>
   1946         Identificador numrico de uma foto de um contato bruto. Anexe esse valor  constante
   1947         {@link android.provider.ContactsContract.DisplayPhoto#CONTENT_URI DisplayPhoto.CONTENT_URI}
   1948         para obter uma URI de contedo direcionada para um nico arquivo de foto e, em seguida, chame
   1949         {@link android.content.ContentResolver#openAssetFileDescriptor(Uri, String)
   1950         openAssetFileDescriptor()} para obter um identificador para o arquivo de foto.
   1951     </dd>
   1952     <dt>
   1953         {@code android.provider.ContactsContract.StreamItemPhotosColumns#PHOTO_URI}
   1954     </dt>
   1955     <dd>
   1956         URI de contedo direcionada diretamente para o arquivo de foto da foto representada por essa linha.
   1957         Chame {@link android.content.ContentResolver#openAssetFileDescriptor(Uri, String)
   1958         openAssetFileDescriptor()} com essa URI para obter um identificador para o arquivo de foto.
   1959     </dd>
   1960 </dl>
   1961 <h3 id="SocialStreamTables">Uso de tabelas de fluxos sociais</h3>
   1962 <p>
   1963     Essas tabelas funcionam como as outras tabelas principais do Provedor de Contatos, exceto que:
   1964 </p>
   1965     <ul>
   1966         <li>
   1967             Exigem permisses de acesso adicionais. Para ler o contedo delas, o aplicativo
   1968             deve ter a permisso {@code android.Manifest.permission#READ_SOCIAL_STREAM}. Para
   1969             modific-las, o aplicativo precisa ter a permisso
   1970             {@code android.Manifest.permission#WRITE_SOCIAL_STREAM}.
   1971         </li>
   1972         <li>
   1973             Para a tabela {@code android.provider.ContactsContract.StreamItems}, o nmero de linhas
   1974             armazenadas para cada contato bruto  limitado. Ao atingir o limite,
   1975             o Provedor de Contatos abre espao para novas linhas de itens de fluxo excluindo automaticamente
   1976             as linhas que tm
   1977             o {@code android.provider.ContactsContract.StreamItemsColumns#TIMESTAMP} mais antigo. Para conhecer
   1978             o limite, faa uma consulta  URI de contedo
   1979             {@code android.provider.ContactsContract.StreamItems#CONTENT_LIMIT_URI}.  possvel deixar
   1980             todos os argumentos, exceto a URI de contedo, definidos como <code>null</code>. A consulta
   1981             retorna um Cursor contendo uma linha nica com a coluna nica
   1982             {@code android.provider.ContactsContract.StreamItems#MAX_ITEMS}.
   1983         </li>
   1984     </ul>
   1985 
   1986 <p>
   1987     A classe {@code android.provider.ContactsContract.StreamItems.StreamItemPhotos} define
   1988     uma subtabela de {@code android.provider.ContactsContract.StreamItemPhotos} que contm as linhas
   1989     de foto de um nico item de fluxo.
   1990 </p>
   1991 <h3 id="SocialStreamInteraction">Interaes de fluxos sociais</h3>
   1992 <p>
   1993     Os dados de fluxos sociais gerenciados pelo Provedor de Contatos, em conjunto com o
   1994     aplicativo de contatos do dispositivo, oferecem um mtodo poderoso de conexo ao sistema de redes sociais
   1995     com contatos existentes. Os seguintes recursos esto disponveis:
   1996 </p>
   1997     <ul>
   1998         <li>
   1999             Ao sincronizar seu servio de rede social com o Provedor de Contatos com um adaptador
   2000             de sincronizao,  possvel recuperar atividades recentes de contatos de um usurio e armazen-las
   2001             nas tabelas {@code android.provider.ContactsContract.StreamItems}
   2002             e {@code android.provider.ContactsContract.StreamItemPhotos} para uso posterior.
   2003         </li>
   2004         <li>
   2005             Alm da sincronizao regular,  possvel ativar o adaptador de sincronizao para recuperar
   2006             dados adicionais quando o usurio seleciona um contato para exibir. Isso permite que o adaptador de sincronizao
   2007             recupere fotos de alta resoluo e os itens de fluxo mais recentes do contato.
   2008         </li>
   2009         <li>
   2010             Ao registrar uma notificao com o aplicativo de contatos do dispositivo e o Provedor
   2011             de Contatos,  possvel <em>recuperar</em> uma inteno quando um contato  exibido e, nesse ponto,
   2012             atualizar o status do contato pelo servio. Essa abordagem pode ser mais rpida e usar menos
   2013             largura de banda do que realizar uma sincronizao completa com um adaptador de sincronizao.
   2014         </li>
   2015         <li>
   2016             Os usurios podem adicionar um contato ao seu servio de rede social enquanto exibem-no
   2017             no aplicativo de contatos do dispositivo.  possvel ativar isso com o recurso "convidar contato",
   2018             que  ativado com uma combinao de uma atividade que adiciona um contato existente  sua
   2019             rede, um arquivo XML que fornece o aplicativo de contatos do dispositivo
   2020             e o Provedor de Contatos com os detalhes do aplicativo.
   2021         </li>
   2022     </ul>
   2023 <p>
   2024     A sincronizao regular de itens de fluxo com o Provedor de Contatos  igual
   2025     a outras sincronizaes. Para saber mais sobre sincronizaes, consulte a seo
   2026     <a href="#SyncAdapters">Adaptadores de sincronizao do Provedor de Contatos</a>. O registro de notificaes
   2027     e o convite a contatos so abordados nas prximas duas sees.
   2028 </p>
   2029 <h4>Registro para manipular exibies de redes sociais</h4>
   2030 <p>
   2031     Para registrar o adaptador de sincronizao para receber notificaes quando o usurio exibe um contato que 
   2032     gerenciado pelo adaptador de sincronizao:
   2033 </p>
   2034 <ol>
   2035     <li>
   2036         Crie um arquivo chamado <code>contacts.xml</code> no diretrio <code>res/xml/</code>
   2037         do projeto. Se voc j tiver esse arquivo, pule esta etapa.
   2038     </li>
   2039     <li>
   2040         Nesse arquivo, adicione o elemento
   2041 <code>&lt;ContactsAccountType xmlns:android="http://schemas.android.com/apk/res/android"&gt;</code>.
   2042         Se esse elemento j existir, pule esta etapa.
   2043     </li>
   2044     <li>
   2045         Para registrar um servio que seja notificado quando o usurio abre uma pgina de detalhes do contato
   2046         no aplicativo de contatos do dispositivo, adicione o atributo
   2047         <code>viewContactNotifyService="<em>serviceclass</em>"</code> ao elemento, em que
   2048         <code><em>serviceclass</em></code>  o nome de classe totalmente qualificado do servio
   2049         que deve receber a inteno do aplicativo de contatos do dispositivo. Para o servio
   2050         de notificao, use a classe que estende {@link android.app.IntentService} para permitir que o servio
   2051         receba intenes. Os dados nas intenes recebidas contm a URI de contedo do contato
   2052         bruto em que o usurio clicou. No servio de notificao,  possvel vincular e chamar
   2053         o adaptador de sincronizao para atualizar os dados do contato bruto.
   2054     </li>
   2055 </ol>
   2056 <p>
   2057     Para registrar uma atividade a ser chamada quando o usurio clica em um item de fluxo ou foto, ou ambos:
   2058 </p>
   2059 <ol>
   2060     <li>
   2061         Crie um arquivo chamado <code>contacts.xml</code> no diretrio <code>res/xml/</code>
   2062         do projeto. Se voc j tiver esse arquivo, pule esta etapa.
   2063     </li>
   2064     <li>
   2065         Nesse arquivo, adicione o elemento
   2066 <code>&lt;ContactsAccountType xmlns:android="http://schemas.android.com/apk/res/android"&gt;</code>.
   2067         Se esse elemento j existir, pule esta etapa.
   2068     </li>
   2069     <li>
   2070         Para registrar uma das atividades para tratar do usurio que clica em um item de fluxo
   2071         no aplicativo de contatos do dispositivo, adicione o atributo
   2072         <code>viewStreamItemActivity="<em>activityclass</em>"</code> ao elemento, em que
   2073         <code><em>activityclass</em></code>  o nome de classe totalmente qualificado da atividade
   2074         que deve receber a inteno do aplicativo de contatos do dispositivo.
   2075     </li>
   2076     <li>
   2077         Para registrar uma das atividades para tratar do usurio que clica em uma foto de fluxo
   2078         no aplicativo de contatos do dispositivo, adicione o atributo
   2079         <code>viewStreamItemPhotoActivity="<em>activityclass</em>"</code> ao elemento, em que
   2080         <code><em>activityclass</em></code>  o nome de classe totalmente qualificado da atividade
   2081         que deve receber a inteno do aplicativo de contatos do dispositivo.
   2082     </li>
   2083 </ol>
   2084 <p>
   2085     O elemento <code>&lt;ContactsAccountType&gt;</code>  descrito em mais detalhes
   2086         na seo <a href="#SocialStreamAcctType">Elemento &lt;ContactsAccountType&gt;</a>.
   2087 </p>
   2088 <p>
   2089     A inteno recebida contm a URI de contedo do item ou foto em que o usurio clicou.
   2090     Para ter atividades separadas para itens de texto e para fotos, use os dois atributos no mesmo arquivo.
   2091 </p>
   2092 <h4>Interao com o servio de redes sociais</h4>
   2093 <p>
   2094     Os usurios no precisam sair do aplicativo de contatos do dispositivo para convidar um contato para
   2095         seu site de contatos. Em vez disso, o aplicativo de contatos do dispositivo pode enviar uma inteno de convidar
   2096         o contato para uma das atividades. Para configurar isso:
   2097 </p>
   2098 <ol>
   2099     <li>
   2100         Crie um arquivo chamado <code>contacts.xml</code> no diretrio <code>res/xml/</code>
   2101         do projeto. Se voc j tiver esse arquivo, pule esta etapa.
   2102     </li>
   2103     <li>
   2104         Nesse arquivo, adicione o elemento
   2105 <code>&lt;ContactsAccountType xmlns:android="http://schemas.android.com/apk/res/android"&gt;</code>.
   2106         Se esse elemento j existir, pule esta etapa.
   2107     </li>
   2108     <li>
   2109         Adicione os seguintes atributos:
   2110         <ul>
   2111             <li><code>inviteContactActivity="<em>activityclass</em>"</code></li>
   2112             <li>
   2113                 <code>inviteContactActionLabel="&#64;string/<em>invite_action_label</em>"</code>
   2114             </li>
   2115         </ul>
   2116         O valor <code><em>activityclass</em></code>  o nome de classe totalmente qualificado
   2117         da atividade que deve receber a inteno. O valor <code><em>invite_action_label</em></code>
   2118          uma string de texto exibida no menu <strong>Adicionar conexo</strong>
   2119         no aplicativo de contatos do dispositivo.
   2120     </li>
   2121 </ol>
   2122 <p class="note">
   2123     <strong>Observao:</strong> <code>ContactsSource</code>  um nome de tag reprovado para
   2124     <code>ContactsAccountType</code>.
   2125 </p>
   2126 <h3 id="ContactsFile">Referncia do contacts.xml</h3>
   2127 <p>
   2128     O arquivo <code>contacts.xml</code> contm elementos XML que controlam a interao
   2129     do adaptador de sincronizao e o aplicativo com o aplicativo de contatos e o Provedor de Contatos. Esses
   2130     elementos so descritos nas sees a seguir.
   2131 </p>
   2132 <h4 id="SocialStreamAcctType">Elemento &lt;ContactsAccountType&gt;</h4>
   2133 <p>
   2134     O elemento <code>&lt;ContactsAccountType&gt;</code> controla a interao
   2135     do aplicativo com o aplicativo de contatos. Ele tem a seguinte sintaxe:
   2136 </p>
   2137 <pre>
   2138 &lt;ContactsAccountType
   2139         xmlns:android="http://schemas.android.com/apk/res/android"
   2140         inviteContactActivity="<em>activity_name</em>"
   2141         inviteContactActionLabel="<em>invite_command_text</em>"
   2142         viewContactNotifyService="<em>view_notify_service</em>"
   2143         viewGroupActivity="<em>group_view_activity</em>"
   2144         viewGroupActionLabel="<em>group_action_text</em>"
   2145         viewStreamItemActivity="<em>viewstream_activity_name</em>"
   2146         viewStreamItemPhotoActivity="<em>viewphotostream_activity_name</em>"&gt;
   2147 </pre>
   2148 <p>
   2149     <strong>contido em:</strong>
   2150 </p>
   2151 <p>
   2152     <code>res/xml/contacts.xml</code>
   2153 </p>
   2154 <p>
   2155     <strong>pode conter:</strong>
   2156 </p>
   2157 <p>
   2158     <strong><code>&lt;ContactsDataKind&gt;</code></strong>
   2159 </p>
   2160 <p>
   2161     <strong>Descrio:</strong>
   2162 </p>
   2163 <p>
   2164     Declara componentes e etiquetas da IU do Android que permitem aos usurios convidar um dos seus contatos a
   2165     uma rede social, notificar usurios quando um dos seus fluxos de redes sociais  atualizado
   2166     etc.
   2167 </p>
   2168 <p>
   2169     Observe que o prefixo <code>android:</code> do atributo no  necessrio para os atributos
   2170     de <code>&lt;ContactsAccountType&gt;</code>.
   2171 </p>
   2172 <p>
   2173     <strong>Atributos:</strong>
   2174 </p>
   2175 <dl>
   2176     <dt>{@code inviteContactActivity}</dt>
   2177     <dd>
   2178         O nome de classe totalmente qualificado da atividade no aplicativo que voc deseja
   2179         ativar quando o usurio seleciona <strong>Adicionar conexo</strong> no aplicativo
   2180         de contatos do dispositivo.
   2181     </dd>
   2182     <dt>{@code inviteContactActionLabel}</dt>
   2183     <dd>
   2184         Uma string de texto exibida para a atividade especificada
   2185         em {@code inviteContactActivity}, no menu <strong>Adicionar conexo</strong>.
   2186         Por exemplo: voc pode usar a string "Siga-me na rede". Voc pode usar um identificador
   2187         do recurso da string nessa etiqueta.
   2188     </dd>
   2189     <dt>{@code viewContactNotifyService}</dt>
   2190     <dd>
   2191         O nome de classe totalmente qualificado de um servio no aplicativo que deve receber
   2192         notificaes de quando o usurio exibe um contato. Essa notificao  enviada pelo aplicativo
   2193         de contatos do dispositivo, isso permite que o aplicativo adie operaes de dados intensivos
   2194         at que elas sejam necessrias. Por exemplo: o aplicativo pode responder a essa notificao
   2195         lendo e exibindo a foto de alta resoluo do contato e os itens de fluxo social
   2196         mais recentes. Esse recurso  descrito com mais detalhes na seo
   2197         <a href="#SocialStreamInteraction">Interaes de fluxos sociais</a>.  possvel ver
   2198         um exemplo de servio de notificao no arquivo <code>NotifierService.java</code>
   2199         no aplicativo de exemplo
   2200         <a href="{@docRoot}resources/samples/SampleSyncAdapter/index.html">SampleSyncAdapter</a>.
   2201     </dd>
   2202     <dt>{@code viewGroupActivity}</dt>
   2203     <dd>
   2204         O nome de classe totalmente qualificado de uma atividade no aplicativo que pode exibir
   2205         informaes de grupo. Quando o usurio clica na etiqueta do grupo no aplicativo
   2206         de contatos do dispositivo, a IU dessa atividade  exibida.
   2207     </dd>
   2208     <dt>{@code viewGroupActionLabel}</dt>
   2209     <dd>
   2210         A etiqueta que o aplicativo de contatos exibe para um controle de IU que permite
   2211  que o usurio veja grupos no seu aplicativo.
   2212         <p>
   2213             Por exemplo: se voc instalar o aplicativo do Google+ no dispositivo e sincroniz-lo
   2214         com o aplicativo de contatos, ver os crculos do Google+ listados como grupos
   2215         na aba <strong>Grupos</strong> do aplicativo de contatos. Ao clicar
   2216         em um crculo do Google+, voc ver pessoas nesse crculo listadas como um "grupo". Na parte superior
   2217         da tela, voc ver um cone do Google+; ao clicar nele, o controle muda para
   2218         o aplicativo do Google+. O aplicativo de contatos faz isso com
   2219         {@code viewGroupActivity} usando o cone como o valor
   2220             de {@code viewGroupActionLabel}.
   2221         </p>
   2222         <p>
   2223             Um identificador de recurso de string  permitido para esse atributo.
   2224         </p>
   2225     </dd>
   2226     <dt>{@code viewStreamItemActivity}</dt>
   2227     <dd>
   2228         O nome de classe totalmente qualificado de uma atividade no aplicativo que
   2229         o aplicativo de contatos do dispositivo executa quando o usurio clica em um item de fluxo de um contato bruto.
   2230     </dd>
   2231     <dt>{@code viewStreamItemPhotoActivity}</dt>
   2232     <dd>
   2233         O nome de classe totalmente qualificado de uma atividade no aplicativo que
   2234         o aplicativo de contatos do dispositivo executa quando o usurio clica em uma foto no item de fluxo
   2235         de um contato bruto.
   2236     </dd>
   2237 </dl>
   2238 <h4 id="SocialStreamDataKind">Elemento &lt;ContactsDataKind&gt;</h4>
   2239 <p>
   2240     O elemento <code>&lt;ContactsDataKind&gt;</code> controla a tela das linhas de dados
   2241         personalizados do aplicativo na IU do aplicativo de contatos. Ele tem a seguinte sintaxe:
   2242 </p>
   2243 <pre>
   2244 &lt;ContactsDataKind
   2245         android:mimeType="<em>MIMEtype</em>"
   2246         android:icon="<em>icon_resources</em>"
   2247         android:summaryColumn="<em>column_name</em>"
   2248         android:detailColumn="<em>column_name</em>"&gt;
   2249 </pre>
   2250 <p>
   2251     <strong>contido em:</strong>
   2252 </p>
   2253 <code>&lt;ContactsAccountType&gt;</code>
   2254 <p>
   2255     <strong>Descrio:</strong>
   2256 </p>
   2257 <p>
   2258     Use esse elemento para que o aplicativo de contatos exiba o contedo de uma linha de dados personalizados como
   2259         parte dos detalhes de um contato bruto. Cada elemento filho <code>&lt;ContactsDataKind&gt;</code>
   2260     de <code>&lt;ContactsAccountType&gt;</code> representa um tipo de linha de dados personalizados que o adaptador
   2261     de sincronizao adiciona  tabela {@link android.provider.ContactsContract.Data}. Adicione
   2262     um elemento <code>&lt;ContactsDataKind&gt;</code> para cada tipo MIME personalizado usado. No ser necessrio
   2263     adicionar o elemento se voc tiver uma linha de dados personalizados para a qual no deseja exibir dados.
   2264 </p>
   2265 <p>
   2266     <strong>Atributos:</strong>
   2267 </p>
   2268 <dl>
   2269     <dt>{@code android:mimeType}</dt>
   2270     <dd>
   2271         O tipo MIME personalizado definido para um dos tipos de linha de dados personalizados
   2272         na tabela {@link android.provider.ContactsContract.Data}. Por exemplo: o valor
   2273         <code>vnd.android.cursor.item/vnd.example.locationstatus</code> poderia ser um tipo MIME
   2274         personalizado para uma linha de dados que registra a ltima localizao conhecida do contato.
   2275     </dd>
   2276     <dt>{@code android:icon}</dt>
   2277     <dd>
   2278 
   2279         <a href="{@docRoot}guide/topics/resources/drawable-resource.html">Recurso desenhvel</a> do Android
   2280         que o aplicativo de contatos exibe prximo aos dados. Use isso para indicar
   2281         ao usurio que os dados so advindos do seu servio.
   2282     </dd>
   2283     <dt>{@code android:summaryColumn}</dt>
   2284     <dd>
   2285         O nome de coluna do primeiro de dois valores recuperados da linha de dados.
   2286         O valor  exibido como a primeira linha da entrada para essa linha de dados. A primeira linha
   2287         destina-se ao uso como um resumo dos dados, mas isso  opcional. Veja tambm
   2288         <a href="#detailColumn">android:detailColumn</a>.
   2289     </dd>
   2290     <dt>{@code android:detailColumn}</dt>
   2291     <dd>
   2292         O nome de coluna do segundo de dois valores recuperados da linha de dados. O valor 
   2293         exibido como a segunda linha da entrada dessa linha de dados. Veja tambm
   2294         {@code android:summaryColumn}.
   2295     </dd>
   2296 </dl>
   2297 <h2 id="AdditionalFeatures">Recursos adicionais do Provedor de Contatos</h2>
   2298 <p>
   2299     Alm dos principais recursos descritos nas sees anteriores, o Provedor de Contatos oferece
   2300         estes recursos teis para trabalhar com dados de contatos:
   2301 </p>
   2302     <ul>
   2303        <li>Grupos de contatos</li>
   2304        <li>Recursos de foto</li>
   2305     </ul>
   2306 <h3 id="Groups">Grupos de contatos</h3>
   2307 <p>
   2308     O Provedor de Contatos pode, opcionalmente, etiquetar grupos de contatos relacionados com
   2309     dados de <strong>grupo</strong>. Se o servidor associado a uma conta de usurio
   2310     deseja manter grupos, o adaptador de sincronizao para o tipo da conta deve transferir
   2311     dados de grupo entre o Provedor de Contatos e o servidor. Quando o usurio adiciona um novo contato
   2312     ao servidor e, em seguida, coloca este contato em um novo grupo, o adaptador de sincronizao deve adicionar o novo grupo
   2313     na tabela {@link android.provider.ContactsContract.Groups}. O grupo ou grupos a que um contato
   2314     bruto pertence so armazenados na tabela {@link android.provider.ContactsContract.Data}, usando
   2315     o tipo MIME {@link android.provider.ContactsContract.CommonDataKinds.GroupMembership}.
   2316 </p>
   2317 <p>
   2318     Se estiver projetando um adaptador de sincronizao que adicionar dados de contato bruto ao Provedor de Contatos
   2319     a partir de servidores e no estiver usando grupos, ser necessrio fazer com que
   2320     o provedor torne os dados visveis. No cdigo que  executado quando um usurio adiciona uma conta
   2321     ao dispositivo, atualize a linha {@link android.provider.ContactsContract.Settings}
   2322     que o Provedor de Contatos adicionou para a conta. Nessa linha, defina o valor da
   2323     coluna {@link android.provider.ContactsContract.SettingsColumns#UNGROUPED_VISIBLE
   2324     Settings.UNGROUPED_VISIBLE} como 1. Ao faz-lo, o Provedor de Contatos sempre
   2325     deixar os dados de contatos visveis, mesmo sem usar grupos.
   2326 </p>
   2327 <h3 id="Photos">Fotos de contatos</h3>
   2328 <p>
   2329     A tabela {@link android.provider.ContactsContract.Data} armazena fotos como linhas com tipo MIME
   2330     {@link android.provider.ContactsContract.CommonDataKinds.Photo#CONTENT_ITEM_TYPE
   2331     Photo.CONTENT_ITEM_TYPE}. A coluna
   2332     {@link android.provider.ContactsContract.RawContactsColumns#CONTACT_ID} da linha  vinculada
   2333      coluna {@code android.provider.BaseColumns#_ID} do contato bruto  qual pertence.
   2334     A classe {@link android.provider.ContactsContract.Contacts.Photo} define uma subtabela de
   2335     {@link android.provider.ContactsContract.Contacts} contendo informaes de foto
   2336     de uma foto principal do contato, que  a foto principal do contato bruto principal do contato. Da mesma forma,
   2337     a classe {@link android.provider.ContactsContract.RawContacts.DisplayPhoto} define uma subtabela
   2338     de {@link android.provider.ContactsContract.RawContacts} contendo informaes de foto
   2339     de uma foto principal do contato bruto.
   2340 </p>
   2341 <p>
   2342     A documentao de referncia de {@link android.provider.ContactsContract.Contacts.Photo} e
   2343     {@link android.provider.ContactsContract.RawContacts.DisplayPhoto} contm exemplos
   2344     de recuperao de informaes de foto. No h classe conveniente para recuperar a miniatura
   2345     principal de um contato bruto, mas  possvel enviar uma consulta
   2346      tabela {@link android.provider.ContactsContract.Data}, selecionando no {@code android.provider.BaseColumns#_ID}
   2347     do contato bruto, o
   2348     {@link android.provider.ContactsContract.CommonDataKinds.Photo#CONTENT_ITEM_TYPE
   2349     Photo.CONTENT_ITEM_TYPE} e a coluna
   2350     {@link android.provider.ContactsContract.Data#IS_PRIMARY} para encontrar a linha da foto principal do contato bruto.
   2351 </p>
   2352 <p>
   2353     Dados de fluxos sociais de uma pessoa tambm podem conter fotos. Elas so armazenadas
   2354     na tabela {@code android.provider.ContactsContract.StreamItemPhotos}, que  descrita com mais
   2355     detalhes na seo <a href="#StreamPhotos">Fotos de fluxos sociais</a>.
   2356 </p>
   2357