Home | History | Annotate | Download | only in providers
      1 page.title=Criao de um Provedor de Contedo
      2 @jd:body
      3 <div id="qv-wrapper">
      4 <div id="qv">
      5 
      6 
      7 <h2>Neste documento</h2>
      8 <ol>
      9     <li>
     10         <a href="#DataStorage">Projeto de armazenamento de dados</a>
     11     </li>
     12     <li>
     13         <a href="#ContentURI">Projeto de URIs de contedo</a>
     14     </li>
     15     <li>
     16         <a href="#ContentProvider">Implementao da classe ContentProvider</a>
     17         <ol>
     18             <li>
     19                 <a href="#RequiredAccess">Mtodos obrigatrios</a>
     20             </li>
     21             <li>
     22                 <a href="#Query">Implementao do mtodo query()</a>
     23             </li>
     24             <li>
     25                 <a href="#Insert">Implementao do mtodo insert()</a>
     26             </li>
     27             <li>
     28                 <a href="#Delete">Implementao do mtodo delete()</a>
     29             </li>
     30             <li>
     31                 <a href="#Update">Implementao do mtodo update()</a>
     32             </li>
     33             <li>
     34                 <a href="#OnCreate">Implementao do mtodo onCreate()</a>
     35             </li>
     36         </ol>
     37     </li>
     38     <li>
     39         <a href="#MIMETypes">Implementao de tipos MIME do Provedor de Contedo</a>
     40         <ol>
     41             <li>
     42                 <a href="#TableMIMETypes">Tipos MIME para tabelas</a>
     43             </li>
     44             <li>
     45                 <a href="#FileMIMETypes">Tipos MIME para arquivos</a>
     46             </li>
     47         </ol>
     48     </li>
     49     <li>
     50         <a href="#ContractClass">Implementao de uma classe de contrato</a>
     51     </li>
     52     <li>
     53         <a href="#Permissions">Implementao de permisses do Provedor de Contedo</a>
     54     </li>
     55     <li>
     56         <a href="#ProviderElement">O elemento &lt;provider&gt;</a>
     57     </li>
     58     <li>
     59         <a href="#Intents">Intenes e acesso a dados</a>
     60     </li>
     61 </ol>
     62 <h2>Classes principais</h2>
     63     <ol>
     64         <li>
     65             {@link android.content.ContentProvider}
     66         </li>
     67         <li>
     68             {@link android.database.Cursor}
     69         </li>
     70         <li>
     71             {@link android.net.Uri}
     72         </li>
     73     </ol>
     74 <h2>Exemplos relacionados</h2>
     75     <ol>
     76         <li>
     77             <a href="{@docRoot}resources/samples/NotePad/index.html">
     78                 Aplicativo de exemplo do Bloco de Notas
     79             </a>
     80         </li>
     81     </ol>
     82 <h2>Veja tambm</h2>
     83     <ol>
     84         <li>
     85             <a href="{@docRoot}guide/topics/providers/content-provider-basics.html">
     86             Preceitos do provedor de contedo</a>
     87         </li>
     88         <li>
     89             <a href="{@docRoot}guide/topics/providers/calendar-provider.html">
     90             Provedor de agenda</a>
     91         </li>
     92     </ol>
     93 </div>
     94 </div>
     95 
     96 
     97 <p>
     98     O provedor de contedo gerencia o acesso a um repositrio central de dados. Implementa-se
     99     um provedor como uma ou mais classes em um aplicativo do Android, em conjunto com elementos
    100     no arquivo de manifesto. Uma das classes implementa uma subclasse
    101     {@link android.content.ContentProvider}, que  a interface entre o provedor
    102     e outros aplicativos. Embora provedores de contedo se destinem a disponibilizar dados a outros
    103     aplicativos, naturalmente  possvel ter atividades no aplicativo que permitam ao usurio
    104     consultar e modificar os dados gerenciados pelo provedor.
    105 </p>
    106 <p>
    107     O restante deste tpico  uma lista bsica de etapas para a criao de um provedor de contedo e uma lista
    108     de APIs para usar.
    109 </p>
    110 
    111 
    112 <!-- Before You Start Building -->
    113 <h2 id="BeforeYouStart">Antes de comear a criar</h2>
    114 <p>
    115     Antes de comear a criar um provedor, faa o seguinte:
    116 </p>
    117 <ol>
    118     <li>
    119         <strong>Avalie se voc precisa de um provedor de contedo</strong>.  necessrio criar um provedor
    120         de contedo para fornecer um ou mais dos recursos a seguir:
    121         <ul>
    122             <li>Oferecer dados ou arquivos complexos a outros aplicativos.</li>
    123             <li>Permitir que usurios copiem dados complexos do seu aplicativo para outros aplicativos.</li>
    124             <li>Fornecer sugestes de pesquisa personalizada usando a estrutura de pesquisa.</li>
    125         </ul>
    126     <p>
    127         <em>No</em>  necessrio um provedor para usar um banco de dados SQLite se o uso for inteiramente dentro
    128         do prprio aplicativo.
    129     </p>
    130     </li>
    131     <li>
    132         Se voc ainda no tiver feito isso, leia o tpico
    133         <a href="{@docRoot}guide/topics/providers/content-provider-basics.html">
    134         Preceitos do provedor de contedo</a> para saber mais sobre provedores.
    135     </li>
    136 </ol>
    137 <p>
    138     A seguir, siga estas etapas para criar seu provedor:
    139 </p>
    140 <ol>
    141     <li>
    142         Projete o armazenamento bruto dos dados. Os provedores de contedo oferecem dados de duas maneiras:
    143         <dl>
    144             <dt>
    145                 Dados de arquivo
    146             </dt>
    147             <dd>
    148                 Dados que normalmente transitam em arquivos, como
    149                 fotos, udio ou vdeos. Armazene os arquivos no espao privado
    150                 do seu aplicativo. Em resposta a uma solicitao de um arquivo por outro aplicativo,
    151                 o provedor pode oferecer um identificador para o arquivo.
    152             </dd>
    153             <dt>
    154                 Dados "estruturados"
    155             </dt>
    156             <dd>
    157                 Dados que normalmente transitam em um banco de dados, uma matriz ou estrutura similar.
    158                 Armazene os dados de forma compatvel com tabelas de linhas e colunas. Cada linha
    159                 representa uma entidade, como uma pessoa ou um item em um inventrio. Cada coluna representa
    160                 alguns dados da entidade, como o nome da pessoa ou o preo do item. Um modo comum de
    161                 armazenar esse tipo de dados  em um banco de dados SQLite, mas  possvel usar qualquer tipo
    162                 de armazenamento persistente. Para saber mais sobre os tipos de armazenamento disponveis
    163                 no sistema Android, consulte a seo <a href="#DataStorage">
    164 Projeto de armazenamento de dados</a>.
    165             </dd>
    166         </dl>
    167     </li>
    168     <li>
    169         Defina uma implementao slida da classe {@link android.content.ContentProvider}
    170         e seus mtodos obrigatrios. Essa classe  a interface entre seus dados e o restante
    171         do sistema Android. Para obter mais informaes sobre essa classe, consulte a seo
    172         <a href="#ContentProvider">Implementao da classe ContentProvider</a>.
    173     </li>
    174     <li>
    175         Defina a string de autoridade do provedor, suas URIs de contedo e seus nomes de coluna. Se voc deseja que
    176         o aplicativo do provedor trate de intenes, defina tambm aes de inteno, dados extras
    177         e sinalizadores. Tambm defina as permisses necessrias para aplicativos que queiram
    178         acessar seus dados. Deve-se considerar definir todos esses valores como constantes
    179         em uma classe de contrato separada; posteriormente, ser possvel expor essa classe a outros desenvolvedores. Para
    180         obter mais informaes sobre URIs de contedo, consulte
    181         a seo <a href="#ContentURI">Projeto de URIs de contedo</a>.
    182         Para obter mais informaes sobre intenes, consulte
    183         a seo <a href="#Intents">Intenes e acesso a dados</a>.
    184     </li>
    185     <li>
    186         Adicione outras partes opcionais, como dados de exemplo ou uma implementao
    187         de {@link android.content.AbstractThreadedSyncAdapter} que possa sincronizar dados entre
    188         o provedor e os dados com base em nuvem.
    189     </li>
    190 </ol>
    191 
    192 
    193 <!-- Designing Data Storage -->
    194 <h2 id="DataStorage">Projeto de armazenamento de dados</h2>
    195 <p>
    196     Os provedores de contedo so a interface para dados salvos em um formato estruturado. Antes de criar
    197     a interface,  preciso decidir como armazenar os dados.  possvel armazen-los da forma que
    198     quiser e, em seguida, projetar a interface para ler e gravar os dados conforme o necessrio.
    199 </p>
    200 <p>
    201     Essas so algumas das tecnologias de armazenamento de dados disponveis no Android:
    202 </p>
    203 <ul>
    204     <li>
    205         O sistema Android contm uma API de banco de dados SQLite que os provedores do Android usam
    206     para armazenar dados orientados a tabela.
    207         A classe {@link android.database.sqlite.SQLiteOpenHelper} ajuda a criar bancos de dados
    208         e a classe {@link android.database.sqlite.SQLiteDatabase}  a classe de base para acessar
    209         banco de dados.
    210         <p>
    211             Lembre-se de que no  necessrio usar nenhum banco de dados para implementar o repositrio. Um provedor
    212             aparece externamente como um conjunto de tabelas, semelhante a um banco de dados relacional, mas isso no
    213              um requisito para a implementao interna do provedor.
    214         </p>
    215     </li>
    216     <li>
    217         Para armazenar dados de arquivos, o Android tem diversas APIs orientadas a arquivo.
    218         Para saber mais sobre armazenamento de arquivos, leia o tpico
    219         <a href="{@docRoot}guide/topics/data/data-storage.html">Armazenamento de dados</a>. Se voc estiver
    220         projetando um provedor que oferece dados relacionados a mdia como msica ou vdeos,  possvel
    221         ter um provedor que combine dados de tabela e de arquivos.
    222     </li>
    223     <li>
    224         Para trabalhar com dados com base em rede, use classes em {@link java.net}
    225         e em {@link android.net}.  possvel, tambm, sincronizar dados com base em rede com uma armazenagem
    226         local de dados, como um banco de dados e, em seguida, fornecer os dados na forma de tabelas ou arquivos.
    227         O exemplo de aplicativo <a href="{@docRoot}resources/samples/SampleSyncAdapter/index.html">
    228         Exemplo de adaptador de sincronizao</a>  demonstra o tipo de sincronizao.
    229     </li>
    230 </ul>
    231 <h3 id="DataDesign">
    232     Consideraes para projetar dados
    233 </h3>
    234 <p>
    235     A seguir h algumas dicas para projetar a estrutura de dados do seu provedor:
    236 </p>
    237 <ul>
    238     <li>
    239         Os dados de tabela sempre devem ter uma coluna de "chave principal" que o provedor mantm
    240         como um valor numrico exclusivo para cada linha.  possvel usar esse valor para vincular a linha a linhas
    241         relacionadas em outras tabelas (usando-o como uma "chave externa"). Embora seja possvel usar qualquer nome
    242         para essa coluna,  melhor usar {@link android.provider.BaseColumns#_ID BaseColumns._ID}
    243         porque a vinculao dos resultados de uma consulta de provedor com uma
    244         {@link android.widget.ListView} requer que uma das colunas tenha o nome
    245         <code>_ID</code>.
    246     </li>
    247     <li>
    248         Se voc deseja fornecer imagens bitmap ou outras partes muito grandes de dados orientados a arquivo, armazene
    249         os dados em um arquivo e, em seguida, fornea-o indiretamente em vez de armazen-lo diretamente em uma
    250         tabela. Ao fazer isso, ser necessrio informar aos usurios do provedor que eles precisam usar
    251         um mtodo de arquivo {@link android.content.ContentResolver} para acessar os dados.
    252     </li>
    253     <li>
    254         Use objeto grande binrio (BLOB) como tipo de dados para armazenar dados que variam em tamanho ou que tenham
    255         estrutura varivel. Por exemplo:  possvel usar uma coluna de BLOB para armazenar
    256         um <a href="http://code.google.com/p/protobuf">buffer de protocolo</a> ou
    257         uma <a href="http://www.json.org">estrutura JSON</a>.
    258         <p>
    259             Pode-se usar um BLOB para implementar uma tabela <em>independente de esquema</em>. Nesse
    260             tipo de tabela, define-se uma coluna de chave principal, uma coluna de tipo MIME e uma
    261             ou mais colunas genricas como BLOB. O significado dos dados nas colunas BLOB  indicado
    262             pelo valor na coluna de tipo MIME. Isso permite o armazenamento de diferentes tipos de linha
    263             na mesma tabela. A tabela de "dados" {@link android.provider.ContactsContract.Data}
    264             do Provedor de contatos  um exemplo de uma tabela
    265             independente de esquema.
    266         </p>
    267     </li>
    268 </ul>
    269 <!-- Designing Content URIs -->
    270 <h2 id="ContentURI">Projeto de URIs de contedo</h2>
    271 <p>
    272     <strong>URI de contedo</strong>  uma URI que identifica dados em um provedor. URIs de contedo
    273     contm o nome simblico de todo o provedor (sua <strong>autoridade</strong>) e um
    274     nome que aponta para uma tabela ou arquivo (um <strong>caminho</strong>). Parte do ID opcional aponta para
    275     uma linha individual em uma tabela. Cada mtodo de acesso aos dados
    276     {@link android.content.ContentProvider} de tem uma URI de contedo como um argumento. Isso permite
    277     determinar a tabela, a linha ou o arquivo a acessar.
    278 </p>
    279 <p>
    280     Os conceitos bsicos de URIs de contedo so escritos no tpico
    281     <a href="{@docRoot}guide/topics/providers/content-provider-basics.html">
    282     Preceitos do provedor de contedo</a>.
    283 </p>
    284 <h3>Projeto de uma autoridade</h3>
    285 <p>
    286     Os provedores normalmente tm uma nica autoridade, que serve como seu nome interno do Android. Para
    287     evitar conflitos com outros provedores, deve-se usar a propriedade de domnio da internet (ao contrrio)
    288     como a base da autoridade do provedor. Em virtude de esta recomendao ser verdadeira para nomes
    289     de pacote do Android,  possvel definir a autoridade do provedor como uma extenso do nome
    290     do pacote que contm o provedor. Por exemplo: se o nome do pacote do Android for
    291     <code>com.example.&lt;appname&gt;</code>, deve-se atribuir ao provedor
    292     a autoridade <code>com.example.&lt;appname&gt;.provider</code>.
    293 </p>
    294 <h3>Projeto de uma estrutura de caminho</h3>
    295 <p>
    296     Desenvolvedores normalmente criam URIs de contedo a partir da autoridade anexando caminhos que apontam para
    297     tabelas individuais. Por exemplo: se voc tiver duas tabelas (<em>tabela1</em> e
    298     <em>tabela2</em>), combine a autoridade do exemplo anterior para produzir
    299     as URIs de contedo
    300     <code>com.example.&lt;appname&gt;.provider/table1</code> e
    301     <code>com.example.&lt;appname&gt;.provider/table2</code>. Caminhos no
    302     se limitam a um nico segmento e no precisa ter uma tabela para cada nvel do caminho.
    303 </p>
    304 <h3>Identificao de IDs de URIs de contedo</h3>
    305 <p>
    306     Por conveno, provedores fornecem acesso a uma linha exclusiva em uma tabela aceitando uma URI de contedo
    307     com um valor de ID para a linha no fim da URI. Tambm por conveno, provedores combinam
    308     o valor do ID com a coluna <code>_ID</code> da tabela e realizam o acesso solicitado
    309     na linha correspondente.
    310 </p>
    311 <p>
    312     Essa conveno facilita a padronizao comum do projeto para aplicativos que acessam um provedor. O aplicativo
    313     realiza uma consulta no provedor e exibe o {@link android.database.Cursor}
    314     resultante em uma {@link android.widget.ListView} usando um {@link android.widget.CursorAdapter}.
    315     A definio de {@link android.widget.CursorAdapter} requer que uma das colunas
    316     no {@link android.database.Cursor} seja <code>_ID</code>
    317 </p>
    318 <p>
    319     Em seguida, o usurio seleciona uma das linhas exibidas na IU para visualizar ou modificar
    320     os dados. O aplicativo tem a linha correspondente do {@link android.database.Cursor} apoiando
    321     a {@link android.widget.ListView}, obtm o valor <code>_ID</code> para essa linha, anexa-o
    322      URI de contedo e envia a solicitao de acesso ao provedor. O provedor, ento, pode realizar
    323     a consulta ou modificao na exata linha que o usurio selecionou.
    324 </p>
    325 <h3>Padres de URI de contedo</h3>
    326 <p>
    327     Para ajudar a escolher que ao tomar para uma URI de contedo recebida, a API do provedor contm
    328     a classe de convenincia {@link android.content.UriMatcher}, que mapeia "padres" de URI de contedo
    329     como valores de nmero inteiro.  possvel usar os valores de nmero inteiro em uma declarao <code>switch</code> que
    330     escolha a ao desejada para a URI de contedo ou URIs que atendam ao padro determinado.
    331 </p>
    332 <p>
    333     Um padro de URI de contedo corresponde a URIs de contedo que usam caracteres especiais:
    334 </p>
    335     <ul>
    336         <li>
    337             <strong><code>*</code>:</strong> Corresponde a uma string de qualquer caractere vlido de qualquer comprimento.
    338         </li>
    339         <li>
    340             <strong><code>#</code>:</strong> Corresponde a uma string de caracteres numricos de qualquer comprimento.
    341         </li>
    342     </ul>
    343 <p>
    344     Como um exemplo de projeto e codificao da identificao de URIs de contedo, considere um provedor
    345     com a autoridade <code>com.example.app.provider</code> que reconhea as URIs de contedo
    346     que apontam para tabelas:
    347 </p>
    348 <ul>
    349     <li>
    350         <code>content://com.example.app.provider/table1</code>: Uma tabela chamada <code>table1</code>.
    351     </li>
    352     <li>
    353         <code>content://com.example.app.provider/table2/dataset1</code>: Uma tabela chamada
    354         <code>dataset1</code>.
    355     </li>
    356     <li>
    357         <code>content://com.example.app.provider/table2/dataset2</code>: Uma tabela chamada
    358         <code>dataset1</code>.
    359     </li>
    360     <li>
    361         <code>content://com.example.app.provider/table3</code>: Uma tabela chamada <code>table3</code>.
    362     </li>
    363 </ul>
    364 <p>
    365     O provedor tambm reconhece essas URIs de contedo se elas tiverem um ID de linha anexado, como
    366     <code>content://com.example.app.provider/table3/1</code> para a linha identificada por
    367     <code>1</code> em <code>table3</code>.
    368 </p>
    369 <p>
    370     Os seguintes padres de URI de contedo seriam possveis:
    371 </p>
    372 <dl>
    373     <dt>
    374         <code>content://com.example.app.provider/*</code>
    375     </dt>
    376     <dd>
    377         Corresponde a qualquer URI de contedo no provedor.
    378     </dd>
    379     <dt>
    380         <code>content://com.example.app.provider/table2/*</code>:
    381     </dt>
    382     <dd>
    383         Corresponde a uma URI de contedo das tabelas <code>dataset1</code>
    384         e <code>dataset2</code>, mas no a URIs de contedo de <code>table1</code>
    385         nem <code>table3</code>.
    386     </dd>
    387     <dt>
    388         <code>content://com.example.app.provider/table3/#</code>: Corresponde a uma URI de contedo
    389         para linhas exclusivas em <code>table3</code>, como
    390         <code>content://com.example.app.provider/table3/6</code> da linha identificada por
    391         <code>6</code>.
    392     </dt>
    393 </dl>
    394 <p>
    395     O fragmento de cdigo a seguir mostra como funcionam os mtodos em {@link android.content.UriMatcher}.
    396     Esse cdigo identifica URIs para toda uma tabela, diferentemente das URIs
    397     para uma linha exclusiva, usando o padro de URI de contedo
    398     <code>content://&lt;authority&gt;/&lt;path&gt;</code> para tabelas e
    399     <code>content://&lt;authority&gt;/&lt;path&gt;/&lt;id&gt;</code> para linhas exclusivas.
    400 </p>
    401 <p>
    402     O mtodo {@link android.content.UriMatcher#addURI(String, String, int) addURI()} mapeia
    403     uma autoridade e um caminho como um valor de nmero inteiro. O mtodo {@link android.content.UriMatcher#match(Uri)
    404     match()} retorna o valor de nmero inteiro para a URI. Uma declarao <code>switch</code>
    405     escolhe entre consultar a tabela inteira e consultar um nico registro:
    406 </p>
    407 <pre class="prettyprint">
    408 public class ExampleProvider extends ContentProvider {
    409 ...
    410     // Creates a UriMatcher object.
    411     private static final UriMatcher sUriMatcher;
    412 ...
    413     /*
    414      * The calls to addURI() go here, for all of the content URI patterns that the provider
    415      * should recognize. For this snippet, only the calls for table 3 are shown.
    416      */
    417 ...
    418     /*
    419      * Sets the integer value for multiple rows in table 3 to 1. Notice that no wildcard is used
    420      * in the path
    421      */
    422     sUriMatcher.addURI("com.example.app.provider", "table3", 1);
    423 
    424     /*
    425      * Sets the code for a single row to 2. In this case, the "#" wildcard is
    426      * used. "content://com.example.app.provider/table3/3" matches, but
    427      * "content://com.example.app.provider/table3 doesn't.
    428      */
    429     sUriMatcher.addURI("com.example.app.provider", "table3/#", 2);
    430 ...
    431     // Implements ContentProvider.query()
    432     public Cursor query(
    433         Uri uri,
    434         String[] projection,
    435         String selection,
    436         String[] selectionArgs,
    437         String sortOrder) {
    438 ...
    439         /*
    440          * Choose the table to query and a sort order based on the code returned for the incoming
    441          * URI. Here, too, only the statements for table 3 are shown.
    442          */
    443         switch (sUriMatcher.match(uri)) {
    444 
    445 
    446             // If the incoming URI was for all of table3
    447             case 1:
    448 
    449                 if (TextUtils.isEmpty(sortOrder)) sortOrder = "_ID ASC";
    450                 break;
    451 
    452             // If the incoming URI was for a single row
    453             case 2:
    454 
    455                 /*
    456                  * Because this URI was for a single row, the _ID value part is
    457                  * present. Get the last path segment from the URI; this is the _ID value.
    458                  * Then, append the value to the WHERE clause for the query
    459                  */
    460                 selection = selection + "_ID = " uri.getLastPathSegment();
    461                 break;
    462 
    463             default:
    464             ...
    465                 // If the URI is not recognized, you should do some error handling here.
    466         }
    467         // call the code to actually do the query
    468     }
    469 </pre>
    470 <p>
    471     Outra classe, {@link android.content.ContentUris}, fornece mtodos convenientes para trabalhar
    472     com a parte <code>id</code> das URIs de contedo. As classes {@link android.net.Uri}
    473     e {@link android.net.Uri.Builder} contm mtodos convenientes para analisar objetos
    474     {@link android.net.Uri} existentes e criar novos.
    475 </p>
    476 
    477 <!-- Implementing the ContentProvider class -->
    478 <h2 id="ContentProvider">Implementao da classe ContentProvider</h2>
    479 <p>
    480     A instncia {@link android.content.ContentProvider} gerencia o acesso
    481     a um conjunto de dados estruturado lidando com solicitaes de outros aplicativos. Todas as formas
    482     de acesso ocasionalmente chamam {@link android.content.ContentResolver} que, em seguida, chama um mtodo
    483     concreto de {@link android.content.ContentProvider} para obter acesso.
    484 </p>
    485 <h3 id="RequiredAccess">Mtodos obrigatrios</h3>
    486 <p>
    487     A classe abstrata {@link android.content.ContentProvider} define seis mtodos abstratos
    488     que devem ser implementados como parte das subclasses concretas. Todos esses mtodos, exceto
    489     {@link android.content.ContentProvider#onCreate() onCreate()}, so chamados por um aplicativo cliente
    490     que est tentando acessar seu provedor de contedo:
    491 </p>
    492 <dl>
    493     <dt>
    494         {@link android.content.ContentProvider#query(Uri, String[], String, String[], String)
    495         query()}
    496     </dt>
    497     <dd>
    498         Recupere dados do provedor. Use os argumentos para selecionar a tabela
    499         para consultar as linhas e colunas a retornar e a ordem de classificao do resultado.
    500         Retorne os dados como um objeto {@link android.database.Cursor}.
    501     </dd>
    502     <dt>
    503         {@link android.content.ContentProvider#insert(Uri, ContentValues) insert()}
    504     </dt>
    505     <dd>
    506         Insira uma nova linha no provedor. Use os argumentos para selecionar
    507         a tabela de destino e obter os valores de coluna a usar. Retorne uma URI de contedo para
    508         a linha recentemente inserida.
    509     </dd>
    510     <dt>
    511         {@link android.content.ContentProvider#update(Uri, ContentValues, String, String[])
    512         update()}
    513     </dt>
    514     <dd>
    515         Atualize as linhas existentes no provedor. Use os argumentos para selecionar a tabela e linhas
    516         para atualizar e obter os valores de coluna atualizados. Retorne o nmero de linhas atualizadas.
    517     </dd>
    518     <dt>
    519         {@link android.content.ContentProvider#delete(Uri, String, String[]) delete()}
    520     </dt>
    521     <dd>
    522         Exclua linhas do provedor. Use os argumentos para selecionar a tabela e as linhas
    523         a excluir. Retorne o nmero de linhas excludas.
    524     </dd>
    525     <dt>
    526         {@link android.content.ContentProvider#getType(Uri) getType()}
    527     </dt>
    528     <dd>
    529         Retorne o tipo MIME correspondente a uma URI de contedo. Esse mtodo  descrito com mais
    530         detalhes na seo <a href="#MIMETypes">Implementao de tipos MIME do Provedor de Contedo</a>.
    531     </dd>
    532     <dt>
    533         {@link android.content.ContentProvider#onCreate() onCreate()}
    534     </dt>
    535     <dd>
    536         Inicializar o provedor. O sistema Android chama esse mtodo imediatamente
    537         aps criar o provedor. Observe que o provedor no  criado at que
    538         um objeto {@link android.content.ContentResolver} tente acess-lo.
    539     </dd>
    540 </dl>
    541 <p>
    542     Observe que esses mtodos tm a mesma assinatura dos mtodos
    543         {@link android.content.ContentResolver} de mesmo nome.
    544 </p>
    545 <p>
    546     A implementao desses mtodos deve levar em conta o seguinte:
    547 </p>
    548 <ul>
    549     <li>
    550         Todos esses mtodos, exceto {@link android.content.ContentProvider#onCreate() onCreate()},
    551         podem ser chamados por diversos encadeamentos simultaneamente, ento devem ter encadeamento seguro. Para saber
    552         mais sobre encadeamentos mltiplos, consulte o tpico
    553         <a href="{@docRoot}guide/components/processes-and-threads.html">
    554         Processos e encadeamentos</a>.
    555     </li>
    556     <li>
    557         Evite realizar longas operaes em {@link android.content.ContentProvider#onCreate()
    558         onCreate()}. Adie tarefas de inicializao at que sejam realmente necessrias.
    559         A seo <a href="#OnCreate">Implementao do mtodo onCreate()</a>
    560         aborda o assunto mais detalhadamente.
    561     </li>
    562     <li>
    563         Embora seja preciso implementar esses mtodos, o cdigo no precisa fazer nada alm
    564         de retornar o tipo de dados esperado. Por exemplo: voc pode querer evitar que outros aplicativos
    565         insiram dados em algumas tabelas. Para tanto, pode-se ignorar a chamada de
    566         {@link android.content.ContentProvider#insert(Uri, ContentValues) insert()} e retornar
    567         0.
    568     </li>
    569 </ul>
    570 <h3 id="Query">Implementao do mtodo query()</h3>
    571 <p>
    572 
    573     O mtodo {@link android.content.ContentProvider#query(Uri, String[], String, String[], String)
    574     ContentProvider.query()} precisa retornar um objeto {@link android.database.Cursor}  ou, se
    575     falhar, gerar uma {@link java.lang.Exception}. Se voc estiver usando um banco de dados SQLite
    576     como armazenamento de dados, pode simplesmente retornar o {@link android.database.Cursor} retornado
    577     por um dos mtodos <code>query()</code> da classe {@link android.database.sqlite.SQLiteDatabase}.
    578     Se a consulta no corresponder a nenhuma linha, deve-se retornar uma instncia {@link android.database.Cursor}
    579 cujo mtodo {@link android.database.Cursor#getCount()} retorne 0.
    580     Deve-se retornar <code>null</code> somente se ocorrer um erro interno durante o processo de consulta.
    581 </p>
    582 <p>
    583     Se voc no estiver usando um banco de dados SQLite como modo de armazenamento de dados, use uma das subclasses concretas
    584     de {@link android.database.Cursor}. Por exemplo, a classe {@link android.database.MatrixCursor}
    585     implementa um cursor em que cada linha  uma matriz de {@link java.lang.Object}. Com essa classe,
    586     use {@link android.database.MatrixCursor#addRow(Object[]) addRow()} para adicionar uma nova linha.
    587 </p>
    588 <p>
    589     Lembre-se de que o sistema Android deve ser capaz de se comunicar com {@link java.lang.Exception}
    590     entre limites de processo. O Android pode fazer isso para as excees a seguir, que podem ser teis
    591     para tratar de erros de consulta:
    592 </p>
    593 <ul>
    594     <li>
    595         {@link java.lang.IllegalArgumentException} ( possvel escolher lanar isso se o provedor
    596         receber uma URI de contedo invlida)
    597     </li>
    598     <li>
    599         {@link java.lang.NullPointerException}
    600     </li>
    601 </ul>
    602 <h3 id="Insert">Implementao do mtodo insert()</h3>
    603 <p>
    604     O mtodo {@link android.content.ContentProvider#insert(Uri, ContentValues) insert()} adiciona
    605     uma nova linha  tabela apropriada usando os valores no argumento
    606     {@link android.content.ContentValues}. Se um nome de coluna no estiver no argumento {@link android.content.ContentValues},
    607     talvez seja necessrio fornecer um valor padro para ele tanto no cdigo do provedor quanto no esquema
    608     do banco de dados.
    609 </p>
    610 <p>
    611     Esse mtodo deve retornar a URI de contedo da nova linha. Para construir isso, anexe o valor <code>_ID</code>
    612     da nova linha (ou outra chave principal)  URI de contedo da tabela usando
    613     {@link android.content.ContentUris#withAppendedId(Uri, long) withAppendedId()}.
    614 </p>
    615 <h3 id="Delete">Implementao do mtodo delete()</h3>
    616 <p>
    617     O mtodo {@link android.content.ContentProvider#delete(Uri, String, String[]) delete()}
    618     no precisa excluir linhas fisicamente do armazenamento de dados. Se voc estiver usando um adaptador de sincronizao
    619     com o provedor, considere marcar uma linha excluda
    620     com um sinalizador "excluir" em vez de remov-la totalmente. O adaptador de sincronizao pode
    621     verificar se h linhas excludas e remov-las do servidor antes de exclu-las do provedor.
    622 </p>
    623 <h3 id="Update">Implementao do mtodo update()</h3>
    624 <p>
    625     O mtodo {@link android.content.ContentProvider#update(Uri, ContentValues, String, String[])
    626     update()} usa o mesmo argumento {@link android.content.ContentValues} usado por
    627     {@link android.content.ContentProvider#insert(Uri, ContentValues) insert()}, e os
    628     mesmos argumentos <code>selection</code> e <code>selectionArgs</code> usados por
    629     {@link android.content.ContentProvider#delete(Uri, String, String[]) delete()} e
    630     {@link android.content.ContentProvider#query(Uri, String[], String, String[], String)
    631     ContentProvider.query()}. Isso deve permitir a reutilizao do cdigo entre esses mtodos.
    632 </p>
    633 <h3 id="OnCreate">Implementao do mtodo onCreate()</h3>
    634 <p>
    635     O sistema Android chama {@link android.content.ContentProvider#onCreate()
    636     onCreate()} quando inicia o provedor. Nesse mtodo, devem-se realizar apenas tarefas de inicializao
    637     de execuo rpida e adiar a criao do banco de dados e o carregamento dos dados at que o provedor
    638     receba efetivamente uma solicitao de acesso aos dados. Se houver tarefas longas
    639     em {@link android.content.ContentProvider#onCreate() onCreate()}, a inicializao do provedor
    640     ficar lenta. Consequentemente, isso diminuir a rapidez da resposta do provedor
    641     a outros aplicativos.
    642 </p>
    643 <p>
    644     Por exemplo: se voc estiver usando um banco de dados SQLite,  possvel criar
    645     um novo objeto {@link android.database.sqlite.SQLiteOpenHelper}
    646     em {@link android.content.ContentProvider#onCreate() ContentProvider.onCreate()}
    647     e, em seguida, criar as tabelas SQL na primeira vez em que o banco de dados for aberto. Para facilitar isso,
    648     a primeira vez que chamar {@link android.database.sqlite.SQLiteOpenHelper#getWritableDatabase
    649     getWritableDatabase()}, ele automaticamente chamar
    650     o mtodo {@link android.database.sqlite.SQLiteOpenHelper#onCreate(SQLiteDatabase)
    651     SQLiteOpenHelper.onCreate()}
    652 </p>
    653 <p>
    654     Os dois fragmentos a seguir demonstram a interao
    655     entre {@link android.content.ContentProvider#onCreate() ContentProvider.onCreate()}
    656     e {@link android.database.sqlite.SQLiteOpenHelper#onCreate(SQLiteDatabase)
    657     SQLiteOpenHelper.onCreate()}. O primeiro fragmento  a implementao de
    658     {@link android.content.ContentProvider#onCreate() ContentProvider.onCreate()}.
    659 </p>
    660 <pre class="prettyprint">
    661 public class ExampleProvider extends ContentProvider
    662 
    663     /*
    664      * Defines a handle to the database helper object. The MainDatabaseHelper class is defined
    665      * in a following snippet.
    666      */
    667     private MainDatabaseHelper mOpenHelper;
    668 
    669     // Defines the database name
    670     private static final String DBNAME = "mydb";
    671 
    672     // Holds the database object
    673     private SQLiteDatabase db;
    674 
    675     public boolean onCreate() {
    676 
    677         /*
    678          * Creates a new helper object. This method always returns quickly.
    679          * Notice that the database itself isn't created or opened
    680          * until SQLiteOpenHelper.getWritableDatabase is called
    681          */
    682         mOpenHelper = new MainDatabaseHelper(
    683             getContext(),        // the application context
    684             DBNAME,              // the name of the database)
    685             null,                // uses the default SQLite cursor
    686             1                    // the version number
    687         );
    688 
    689         return true;
    690     }
    691 
    692     ...
    693 
    694     // Implements the provider's insert method
    695     public Cursor insert(Uri uri, ContentValues values) {
    696         // Insert code here to determine which table to open, handle error-checking, and so forth
    697 
    698         ...
    699 
    700         /*
    701          * Gets a writeable database. This will trigger its creation if it doesn't already exist.
    702          *
    703          */
    704         db = mOpenHelper.getWritableDatabase();
    705     }
    706 }
    707 </pre>
    708 <p>
    709     O prximo fragmento  a implementao de
    710     {@link android.database.sqlite.SQLiteOpenHelper#onCreate(SQLiteDatabase)
    711     SQLiteOpenHelper.onCreate()}, inclusive uma classe auxiliar:
    712 </p>
    713 <pre class="prettyprint">
    714 ...
    715 // A string that defines the SQL statement for creating a table
    716 private static final String SQL_CREATE_MAIN = "CREATE TABLE " +
    717     "main " +                       // Table's name
    718     "(" +                           // The columns in the table
    719     " _ID INTEGER PRIMARY KEY, " +
    720     " WORD TEXT"
    721     " FREQUENCY INTEGER " +
    722     " LOCALE TEXT )";
    723 ...
    724 /**
    725  * Helper class that actually creates and manages the provider's underlying data repository.
    726  */
    727 protected static final class MainDatabaseHelper extends SQLiteOpenHelper {
    728 
    729     /*
    730      * Instantiates an open helper for the provider's SQLite data repository
    731      * Do not do database creation and upgrade here.
    732      */
    733     MainDatabaseHelper(Context context) {
    734         super(context, DBNAME, null, 1);
    735     }
    736 
    737     /*
    738      * Creates the data repository. This is called when the provider attempts to open the
    739      * repository and SQLite reports that it doesn't exist.
    740      */
    741     public void onCreate(SQLiteDatabase db) {
    742 
    743         // Creates the main table
    744         db.execSQL(SQL_CREATE_MAIN);
    745     }
    746 }
    747 </pre>
    748 
    749 
    750 <!-- Implementing ContentProvider MIME Types -->
    751 <h2 id="MIMETypes">Implementao de tipos MIME de ContentProvider</h2>
    752 <p>
    753     A classe {@link android.content.ContentProvider} tem dois mtodos para retornar tipos MIME:
    754 </p>
    755 <dl>
    756     <dt>
    757         {@link android.content.ContentProvider#getType(Uri) getType()}
    758     </dt>
    759     <dd>
    760         Um dos mtodos obrigatrios que devem ser implementados em qualquer provedor.
    761     </dd>
    762     <dt>
    763         {@link android.content.ContentProvider#getStreamTypes(Uri, String) getStreamTypes()}
    764     </dt>
    765     <dd>
    766         Um mtodo que deve ser implementado se o provedor fornecer arquivos.
    767     </dd>
    768 </dl>
    769 <h3 id="TableMIMETypes">Tipos MIME para tabelas</h3>
    770 <p>
    771     O mtodo {@link android.content.ContentProvider#getType(Uri) getType()} retorna
    772     uma {@link java.lang.String} em formato MIME que descreve o tipo de dados retornado pelo argumento
    773     da URI de contedo. O argumento {@link android.net.Uri} pode ser um padro em vez de uma URI especfica;
    774     nesse caso, deve-se retornar o tipo de dados associado a URIs de contedo que correspondam
    775     ao padro.
    776 </p>
    777 <p>
    778     Para tipos de dados comuns como texto, HTML ou JPEG,
    779     {@link android.content.ContentProvider#getType(Uri) getType()} deve retornar o tipo MIME
    780     padro daqueles dados. H uma lista completa desse tipos de padro
    781     no site de
    782     <a href="http://www.iana.org/assignments/media-types/index.htm">Tipos de mdia MIME IANA</a>.
    783 </p>
    784 <p>
    785     Para obter URIs de contedo que apontam para uma linha ou linhas de dados de tabela,
    786     {@link android.content.ContentProvider#getType(Uri) getType()} deve retornar
    787     um tipo MIME no formato MIME especfico do fornecedor do Android:
    788 </p>
    789 <ul>
    790     <li>
    791         Parte do tipo: <code>vnd</code>
    792     </li>
    793     <li>
    794         Parte do subtipo:
    795         <ul>
    796             <li>
    797     Se um padro de URI se destinar a uma nica linha: <code>android.cursor.<strong>item</strong>/</code>
    798             </li>
    799             <li>
    800     Se um padro de URI se destinar a mais de uma linha: <code>android.cursor.<strong>dir</strong>/</code>
    801             </li>
    802         </ul>
    803     </li>
    804     <li>
    805         Parte especfica do provedor: <code>vnd.&lt;name&gt;</code>.<code>&lt;type&gt;</code>
    806         <p>
    807             Fornecem-se <code>&lt;name&gt;</code> e o <code>&lt;type&gt;</code>.
    808             O valor <code>&lt;name&gt;</code> deve ser globalmente exclusivo
    809             e o <code>&lt;type&gt;</code> deve ser exclusivo para o padro de URI
    810             correspondente. Uma boa escolha para <code>&lt;name&gt;</code>  o nome da empresa
    811             ou alguma parte do nome do pacote do Android do seu aplicativo. Uma boa escolha para
    812             <code>&lt;type&gt;</code>  uma string que identifique a tabela associada
    813              URI.
    814         </p>
    815 
    816     </li>
    817 </ul>
    818 <p>
    819     Por exemplo: se a autoridade de um provedor
    820     for <code>com.example.app.provider</code> e ele expuser uma tabela chamada
    821     <code>table1</code>, o tipo MIME de diversas linhas em <code>table1</code> ser:
    822 </p>
    823 <pre>
    824 vnd.android.cursor.<strong>dir</strong>/vnd.com.example.provider.table1
    825 </pre>
    826 <p>
    827     Para uma nica linha de <code>table1</code>, o tipo MIME ser:
    828 </p>
    829 <pre>
    830 vnd.android.cursor.<strong>item</strong>/vnd.com.example.provider.table1
    831 </pre>
    832 <h3 id="FileMIMETypes">Tipos MIME para arquivos</h3>
    833 <p>
    834     Se o provedor oferecer arquivos, implemente
    835     {@link android.content.ContentProvider#getStreamTypes(Uri, String) getStreamTypes()}.
    836     O mtodo retorna uma matriz {@link java.lang.String} de tipos MIME para os arquivos que o provedor
    837     pode retornar de uma dada URI de contedo.  preciso filtrar os tipos MIME oferecidos pelo argumento do filtro
    838     de tipo MIME para retornar somente os tipos MIME que o cliente quer tratar.
    839 </p>
    840 <p>
    841     Por exemplo: considere um provedor que oferea imagens de foto como arquivos em formatos <code>.jpg</code>,
    842     <code>.gif</code> e <code>.png</code>.
    843     Se um aplicativo chama {@link android.content.ContentResolver#getStreamTypes(Uri, String)
    844     ContentResolver.getStreamTypes()} com a string de filtro <code>image/*</code> (algo que
    845     seja uma "imagem"),
    846     o mtodo {@link android.content.ContentProvider#getStreamTypes(Uri, String)
    847     ContentProvider.getStreamTypes()} deve retornar a matriz:
    848 </p>
    849 <pre>
    850 { &quot;image/jpeg&quot;, &quot;image/png&quot;, &quot;image/gif&quot;}
    851 </pre>
    852 <p>
    853     Se o aplicativo estiver interessado apenas em arquivos <code>.jpg</code>, ele pode chamar
    854     {@link android.content.ContentResolver#getStreamTypes(Uri, String)
    855     ContentResolver.getStreamTypes()} com a string de filtro <code>*\/jpeg</code>
    856     e {@link android.content.ContentProvider#getStreamTypes(Uri, String)
    857     ContentProvider.getStreamTypes()} deve retornar:
    858 <pre>
    859 {&quot;image/jpeg&quot;}
    860 </pre>
    861 <p>
    862     Se o provedor no oferecer nenhum tipo MIME solicitado na string de filtro,
    863     {@link android.content.ContentProvider#getStreamTypes(Uri, String) getStreamTypes()}
    864     deve retornar <code>null</code>.
    865 </p>
    866 
    867 
    868 <!--  Implementing a Contract Class -->
    869 <h2 id="ContractClass">Implementao de uma classe de contrato</h2>
    870 <p>
    871     Uma classe de contrato  uma classe <code>public final</code> que contm definies de constantes para
    872     os nomes de coluna das URIs, dos tipos MIME e de outros metadados que pertencem ao provedor. A classe
    873     estabelece um contrato entre o provedor e outros aplicativos, garantindo que o provedor
    874     possa ser corretamente acessado mesmo se houver mudanas nos valores atuais de URIs, nomes de coluna
    875     etc.
    876 </p>
    877 <p>
    878     As classes de contrato tambm ajudam os desenvolvedores porque normalmente suas constantes tm nomes mnemnicos e,
    879     por isso, os desenvolvedores tm menos chance de usar valores incorretos para nomes de coluna ou URIs. J que 
    880     uma classe, ela pode conter documentao Javadoc. Ambientes de desenvolvimento integrados, como
    881     o Eclipse, podem preencher automaticamente os nomes de constantes da classe de contrato e exibir Javadoc para
    882     as constantes.
    883 </p>
    884 <p>
    885     Os desenvolvedores no podem acessar o arquivo de classe da classe de contrato do aplicativo, mas podem
    886     compil-lo estaticamente no aplicativo a partir de um arquivo <code>.jar</code> que voc fornece.
    887 </p>
    888 <p>
    889     A classe {@link android.provider.ContactsContract} e classes aninhadas so exemplos
    890     de classes de contrato.
    891 </p>
    892 <h2 id="Permissions">Implementao de permisses do Provedor de Contedo</h2>
    893 <p>
    894     Permisses e acesso, para todos os aspectos do sistema Android, so descritos detalhadamente no
    895     tpico <a href="{@docRoot}guide/topics/security/security.html">Permisses e segurana</a>.
    896     O tpico <a href="{@docRoot}guide/topics/data/data-storage.html">Armazenamento de dados</a> tambm
    897     descreve segurana e permisses em vigor para diversos tipos de armazenamento.
    898     Em resumo, os pontos importantes so:
    899 </p>
    900 <ul>
    901     <li>
    902         Por padro, arquivos de dados armazenados no armazenamento interno do dispositivo so privados em relao
    903         ao aplicativo e ao provedor.
    904     </li>
    905     <li>
    906         Os bancos de dados {@link android.database.sqlite.SQLiteDatabase} criados so privados em relao
    907         ao aplicativo e ao provedor.
    908     </li>
    909     <li>
    910         Por padro, arquivos de dados salvos em armazenamentos externos so <em>pblicos</em>
    911         e <em>legveis para todos</em>. No  possvel usar um provedor de contedo para restringir o acesso a arquivos
    912         em um armazenamento externo porque outros aplicativos podem usar chamadas de outra API para l-los e gravar neles.
    913     </li>
    914     <li>
    915         O mtodo que chama a abertura ou criao de arquivos ou bancos de dados SQLite no armazenamento
    916         interno do seu dispositivo podem fornecer acesso de leitura e gravao a todos os outros aplicativos. Se voc
    917         usar um arquivo ou banco de dados interno como o repositrio do provedor e conceder-lhe
    918         acesso "legvel para todos" ou "gravvel por todos", as permisses definidas para o provedor
    919         no manifesto no protegero os dados. O acesso padro de arquivos e bancos de dados
    920         no armazenamento interno  "privado" e, para o repositrio do provedor, no  recomendvel alterar isso.
    921     </li>
    922 </ul>
    923 <p>
    924     Se voc deseja usar permisses do provedor de contedo para controlar o acesso aos dados, deve
    925     armazen-los em arquivos internos, bancos de dados SQLite ou em "nuvem" (por exemplo,
    926     em um servidor remoto) e mant-los privados em relao ao aplicativo.
    927 </p>
    928 <h3>Implementao de permisses</h3>
    929 <p>
    930     Todos os aplicativos podem ler ou gravar no provedor, mesmo que os dados em questo
    931     sejam privados porque, por padro, o provedor no tem permisses definidas. Para mudar isso,
    932     defina permisses do provedor no arquivo de manifesto por meio de atributos ou elementos
    933     filho do elemento <code><a href="{@docRoot}guide/topics/manifest/provider-element.html">
    934     &lt;provider&gt;</a></code>.  possvel definir permisses que se apliquem a todo o provedor,
    935     a determinadas tabelas, a registros especficos ou a todos os trs.
    936 </p>
    937 <p>
    938     As permisses so definidas para o provedor com um ou mais
    939     elementos <code><a href="{@docRoot}guide/topics/manifest/permission-element.html">
    940     &lt;permission&gt;</a></code> no arquivo de manifesto. Para tornar
    941     a permisso exclusiva para o provedor, use escopo de estilo Java para
    942     o atributo <code><a href="{@docRoot}guide/topics/manifest/permission-element.html#nm">
    943     android:name</a></code>. Por exemplo: nomeie a permisso de leitura
    944     <code>com.example.app.provider.permission.READ_PROVIDER</code>.
    945 
    946 </p>
    947 <p>
    948     A lista a seguir descreve o escopo de permisses do provedor, comeando
    949     com as permisses que se aplicam a todo o provedor e seguindo para as mais especficas.
    950     Permisses mais especficas tm precedncia sobre as de escopo maior:
    951 </p>
    952 <dl>
    953     <dt>
    954         nica permisso de leitura e gravao no nvel do provedor
    955     </dt>
    956     <dd>
    957         Uma permisso que controla os acessos de leitura e gravao a todo o provedor, especificada
    958         com o atributo <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#prmsn">
    959         android:permission</a></code>
    960         do elemento <code><a href="{@docRoot}guide/topics/manifest/provider-element.html">
    961         &lt;provider&gt;</a></code>.
    962     </dd>
    963     <dt>
    964         Permisses de leitura e gravao separadas no nvel do provedor
    965     </dt>
    966     <dd>
    967         Uma permisso de leitura e uma permisso de gravao para todo o provedor. So especificadas
    968         com os atributos <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#rprmsn">
    969         android:readPermission</a></code>
    970         e <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#wprmsn">
    971         android:writePermission</a></code>
    972         do elemento <code><a href="{@docRoot}guide/topics/manifest/provider-element.html">
    973         &lt;provider&gt;</a></code>. Elas tm precedncia sobre a permisso exigida
    974         por <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#prmsn">
    975         android:permission</a></code>.
    976     </dd>
    977     <dt>
    978         Permisso no nvel do caminho
    979     </dt>
    980     <dd>
    981         Permisso de leitura, gravao ou leitura/gravao para uma URI de contedo no provedor. Especifica-se
    982         cada URI que se deseja controlar
    983         com um elemento filho <code><a href="{@docRoot}guide/topics/manifest/path-permission-element.html">
    984         &lt;path-permission&gt;</a></code>
    985         do elemento <code><a href="{@docRoot}guide/topics/manifest/provider-element.html">
    986         &lt;provider&gt;</a></code>. Para cada URI de contedo, pode-se especificar
    987         uma permisso de leitura/gravao, uma permisso de leitura, uma permisso de gravao ou as trs. As permisses
    988         de leitura e gravao tm precedncia sobre a permisso de leitura/gravao. Alm disso,
    989         permisses no nvel do caminho tm precedncia sobre permisses no nvel do provedor.
    990     </dd>
    991     <dt>
    992         Permisso temporria
    993     </dt>
    994     <dd>
    995         Nvel de permisso que concede acesso temporrio a um aplicativo mesmo que ele
    996         no tenha as permisses normalmente exigidas. O recurso de acesso
    997         temporrio reduz o nmero de permisses que um aplicativo deve solicitar
    998         no manifesto. Ao ativar permisses temporrias, os nicos aplicativos que precisam de
    999         permisses "permanentes" para seu provedor so os que tm acesso contnuo
   1000         a todos os dados.
   1001         <p>
   1002             Considere as permisses necessrias para implementar um provedor e um aplicativo de e-mail
   1003         ao permitir um aplicativo visualizador de imagens externas para exibir anexos de fotos
   1004         do provedor. Para conceder o acesso necessrio ao visualizador de imagens sem as permisses exigidas,
   1005         configure permisses temporrias das URIs de contedo de fotos. Projete o aplicativo de e-mail
   1006         para que, quando o usurio quiser exibir uma foto, o aplicativo envie uma inteno
   1007         com a URI de contedo da foto e sinalizadores de permisso para o visualizador de imagens. O visualizador de imagens poder,
   1008         ento, consultar o provedor de e-mail para recuperar a foto mesmo que ele
   1009         no tenha a permisso normal de leitura para o provedor.
   1010         </p>
   1011         <p>
   1012             Para ativar permisses temporrias, defina
   1013         o atributo <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#gprmsn">
   1014             android:grantUriPermissions</a></code>
   1015         do elemento <code><a href="{@docRoot}guide/topics/manifest/provider-element.html">
   1016             &lt;provider&gt;</a></code> ou adicione um ou mais
   1017         elementos filhos <code><a href="{@docRoot}guide/topics/manifest/grant-uri-permission-element.html">
   1018             &lt;grant-uri-permission&gt;</a></code>
   1019         ao elemento <code><a href="{@docRoot}guide/topics/manifest/provider-element.html">
   1020             &lt;provider&gt;</a></code>. Se forem usadas permisses temporrias, ser necessrio chamar
   1021                     {@link android.content.Context#revokeUriPermission(Uri, int)
   1022             Context.revokeUriPermission()} sempre que remover suporte a URI de contedo do
   1023             provedor, e a URI de contedo ser associada a uma permisso temporria.
   1024         </p>
   1025         <p>
   1026             O valor do atributo determina o nvel de acessibilidade do provedor.
   1027             Se o atributo estiver definido como <code>true</code>, o sistema conceder permisso
   1028             temporria a todo o provedor, sobrepondo todas as outras permisses exigidas
   1029             pelas permisses no nvel do provedor ou no nvel do caminho.
   1030         </p>
   1031         <p>
   1032             Se esse sinalizador estiver definido como <code>false</code>, ser necessrio adicionar
   1033             elementos filhos <code><a href="{@docRoot}guide/topics/manifest/grant-uri-permission-element.html">
   1034             &lt;grant-uri-permission&gt;</a></code>
   1035             ao elemento <code><a href="{@docRoot}guide/topics/manifest/provider-element.html">
   1036             &lt;provider&gt;</a></code>. Cada elemento filho especifica a URI ou URIs
   1037             de contedo para as quais o acesso temporrio  concedido.
   1038         </p>
   1039         <p>
   1040             Para delegar o acesso temporrio a um aplicativo, a inteno deve conter
   1041             os sinalizadores {@link android.content.Intent#FLAG_GRANT_READ_URI_PERMISSION},
   1042             {@link android.content.Intent#FLAG_GRANT_WRITE_URI_PERMISSION} ou ambos. Eles
   1043             so definidos com o mtodo {@link android.content.Intent#setFlags(int) setFlags()}.
   1044         </p>
   1045         <p>
   1046             Se o atributo <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#gprmsn">
   1047             android:grantUriPermissions</a></code> no estiver presente, presume-se que ele seja
   1048             <code>false</code>.
   1049         </p>
   1050     </dd>
   1051 </dl>
   1052 
   1053 
   1054 
   1055 <!-- The Provider Element -->
   1056 <h2 id="ProviderElement">O elemento &lt;provider&gt;</h2>
   1057 <p>
   1058     Como os componentes {@link android.app.Activity} e {@link android.app.Service},
   1059             a subclasse de {@link android.content.ContentProvider}
   1060             deve ser definida no arquivo de manifesto do aplicativo
   1061             pelo elemento <code><a href="{@docRoot}guide/topics/manifest/provider-element.html">
   1062     &lt;provider&gt;</a></code>. O sistema Android obtm as seguintes informaes
   1063             do elemento:
   1064 <dl>
   1065     <dt>
   1066         Autoridade
   1067             (<a href="{@docRoot}guide/topics/manifest/provider-element.html#auth">{@code
   1068         android:authorities}</a>)
   1069     </dt>
   1070     <dd>
   1071         Nomes simblicos que identificam todo o provedor dentro do sistema. Esse
   1072         atributo  descrito com mais detalhes na seo
   1073         <a href="#ContentURI">Projeto de URIs de contedo</a>.
   1074     </dd>
   1075     <dt>
   1076         Nome da classe do provedor
   1077         (<code>
   1078 <a href="{@docRoot}guide/topics/manifest/provider-element.html#nm">android:name</a>
   1079         </code>)
   1080     </dt>
   1081     <dd>
   1082         A classe que implementa {@link android.content.ContentProvider}. Esta classe 
   1083         abordada com mais detalhes na seo
   1084         <a href="#ContentProvider">Implementao da classe ContentProvider</a>.
   1085     </dd>
   1086     <dt>
   1087         Permisses
   1088     </dt>
   1089     <dd>
   1090         Atributos que especificam as permisses que outros aplicativos precisam ter para acessar
   1091         os dados do provedor:
   1092         <ul>
   1093             <li>
   1094                 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#gprmsn">
   1095                 android:grantUriPermssions</a></code>: Sinalizador de permisso temporria.
   1096             </li>
   1097             <li>
   1098                 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#prmsn">
   1099                 android:permission</a></code>: Permisso nica de leitura/gravao por todo o provedor.
   1100             </li>
   1101             <li>
   1102                 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#rprmsn">
   1103                 android:readPermission</a></code>: Permisso de leitura por todo o provedor.
   1104             </li>
   1105             <li>
   1106                 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#wprmsn">
   1107                 android:writePermission</a></code>: Permisso de gravao por todo o provedor.
   1108             </li>
   1109         </ul>
   1110         <p>
   1111             As permisses e os atributos correspondentes so abordados com mais
   1112             detalhes na seo
   1113             <a href="#Permissions">Implementao de permisses do Provedor de contedo</a>.
   1114         </p>
   1115     </dd>
   1116     <dt>
   1117         Atributos de incio e controle
   1118     </dt>
   1119     <dd>
   1120         Esses atributos determinam como e quando o sistema Android inicia o provedor,
   1121         as caractersticas do processo do provedor e outras configuraes de tempo de execuo:
   1122         <ul>
   1123             <li>
   1124                 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#enabled">
   1125                 android:enabled</a></code>: sinalizador que permite ao sistema iniciar o provedor.
   1126             </li>
   1127               <li>
   1128                 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#exported">
   1129                 android:exported</a></code>: sinalizador que permite a outros aplicativos usarem esse provedor.
   1130             </li>
   1131             <li>
   1132                 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#init">
   1133                 android:initOrder</a></code>: a ordem em que esse provedor deve ser iniciado,
   1134                 relativa a outros provedores no mesmo processo.
   1135             </li>
   1136             <li>
   1137                 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#multi">
   1138                 android:multiProcess</a></code>: sinalizador que permite ao sistema iniciar o provedor
   1139                 no mesmo processo que o cliente chama.
   1140             </li>
   1141             <li>
   1142                 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#proc">
   1143                 android:process</a></code>: o nome do processo em que o provedor deve
   1144                 ser executado.
   1145             </li>
   1146             <li>
   1147                 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#sync">
   1148                 android:syncable</a></code>: sinalizador que indica que os dados do provedor devem ser
   1149                 sincronizados com os dados em um servidor.
   1150             </li>
   1151         </ul>
   1152         <p>
   1153             os atributos esto totalmente documentados no tpico do guia de desenvolvimento
   1154             do elemento
   1155             <code><a href="{@docRoot}guide/topics/manifest/provider-element.html">
   1156             &lt;provider&gt;</a></code>.
   1157         </p>
   1158     </dd>
   1159     <dt>
   1160         Atributos informacionais
   1161     </dt>
   1162     <dd>
   1163         Um cone e um rtulo opcionais para o provedor:
   1164         <ul>
   1165             <li>
   1166                 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#icon">
   1167                 android:icon</a></code>: um recurso desenhvel contendo um cone para o provedor.
   1168                 O cone aparece prximo ao rtulo do provedor na lista de aplicativos
   1169                 em <em>Configuraes</em> &gt; <em>Aplicativos</em> &gt; <em>Todos</em>.
   1170             </li>
   1171             <li>
   1172                 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#label">
   1173                 android:label</a></code>: um rtulo informacional que descreve o provedor,
   1174                 seus dados ou ambos. O rtulo aparece na lista de aplicativos
   1175                 em <em>Configuraes</em> &gt; <em>Aplicativos</em> &gt; <em>Todos</em>.
   1176             </li>
   1177         </ul>
   1178         <p>
   1179             Os atributos esto totalmente documentados no tpico do guia de desenvolvimento
   1180             do elemento <code><a href="{@docRoot}guide/topics/manifest/provider-element.html">
   1181             &lt;provider&gt;</a></code>.
   1182         </p>
   1183     </dd>
   1184 </dl>
   1185 
   1186 <!-- Intent Access -->
   1187 <h2 id="Intents">Intenes e acesso a dados</h2>
   1188 <p>
   1189     Os aplicativos podem acessar um provedor de contedo indiretamente com uma {@link android.content.Intent}.
   1190     O aplicativo no chama nenhum mtodo de {@link android.content.ContentResolver}
   1191     nem de {@link android.content.ContentProvider}. Em vez disso, ele envia uma inteno que inicia uma atividade,
   1192     que, em geral,  parte do aplicativo do prprio provedor. A atividade de destino  responsvel
   1193     pela recuperao e exibio dos dados na IU. Conforme a ao na inteno,
   1194     a atividade de destino tambm pode levar o usurio a realizar modificaes nos dados do provedor.
   1195     Uma inteno tambm pode conter dados "extras" que a atividade de destino exibe
   1196     na IU; o usurio ter, ento, a opo de alterar esses dados antes de us-los para modificar
   1197     os dados no provedor.
   1198 </p>
   1199 <p>
   1200 
   1201 </p>
   1202 <p>
   1203     Pode ser necessrio usar acesso de intenes para ajudar a garantir a integridade deles. O provedor pode depender
   1204     de ter dados inseridos, atualizados e excludos de acordo com a lgica de negcio rigorosamente definida. Se
   1205     for o caso, a permisso para que outros aplicativos modifiquem os dados diretamente pode levar
   1206      invalidao dos dados. Se voc deseja que os desenvolvedores usem o acesso via intenes, certifique-se de document-lo minuciosamente.
   1207     Explique por que o acesso via intenes pela IU do aplicativo  melhor do que tentar
   1208     modificar os dados com cdigos.
   1209 </p>
   1210 <p>
   1211     O tratamento das intenes recebidas com a inteno de modificar os dados do provedor no  diferente
   1212     de tratar de outras intenes. Para saber mais sobre o uso de intenes, leia o tpico
   1213     <a href="{@docRoot}guide/components/intents-filters.html">Intenes e filtros de intenes</a>.
   1214 </p>
   1215