Módulo MediaProvider

O módulo MediaProvider otimiza metadados indexados (áudio, vídeo e imagens de cartões SD e dispositivos USB) e disponibiliza esses dados para apps usando as APIs públicas da MediaStore. Para manter a privacidade do usuário, o módulo MediaProvider aplica o modelo de segurança de armazenamento com escopo introduzido no Android 10, que inclui a edição de metadados de local confidenciais. Esse módulo é atualizável, permitindo que o Android responda a problemas de segurança mais rapidamente (protegendo os dados sensíveis do usuário) e adicione novos formatos de mídia mais rapidamente, fornecendo consistência para usuários e desenvolvedores.

Mudanças no Android 10

O Android 10 introduziu várias melhorias relacionadas à identificação e extração de dados de arquivos de mídia, mais especificamente:

  • Determinar o tipo de conteúdo do arquivo usando a primeira parte do tipo MIME de um arquivo. Por exemplo, o SO sabe que image/png e image/x-newly-invented-format são imagens e, assim, pode descrever com precisão as permissões relevantes para o usuário final.

  • Determinar o tipo MIME usando somente a extensão do arquivo (e sem usar a detecção de conteúdo para evitar problemas de segurança).

  • Determinar o tipo MIME de um arquivo arbitrário usando uma combinação de mapeamentos upstream do Debian Linux e do Android.

  • Retornar dados relevantes de arquivos video/* e audio/* (usando MediaMetadataRetriever) e arquivos image/* (usando ExifInterface).

Mudanças no Android 11

No Android 11, o módulo MediaProvider se baseia nas mudanças feitas no Android 10 com as seguintes melhorias:

  • Melhorias na indexação. O módulo MediaProvider agora indexa metadados reconciliando metadados disponíveis com as APIs públicas da MediaStore. As mudanças incluem:

    • Nova coluna is_favorite e argumento QUERY_ARG_MATCH_FAVORITE para permitir que apps com estilo de galeria filtrem mídia rapidamente com base nessa coluna.

    • Indexando metadados do espaço de cores.

    • Nova coluna "is_trastruct" e argumento QUERY_ARG_MATCH_TRASHED para permitir que apps no estilo de galeria filtrem com base nessa coluna.

    • Novas APIs que permitem a modificação em massa de vários itens com uma única solicitação de caixa de diálogo do usuário, incluindo createDeleteRequest(), createFavoriteRequest(), createTrashRequest() e createWriteRequest().

    • Novas colunas GENERATION_ADDED e GENERATION_MODIFIED para uso na detecção rápida e confiável de alterações que ocorreram desde um ponto de sincronização anterior.

    • Nova API pública GROUP BY para uso com outras colunas de metadados não mencionadas acima.

  • Melhoria no ExifInterface para extrair metadados de contêineres PNG e WebP.

  • Melhorias em SystemUI para gravar metadados DateTimeOriginal em capturas de tela.

Além disso, agora é possível personalizar o MediaProvider adicionando novos formatos de mídia, marcando quais dispositivos de armazenamento precisam ser indexados e até mesmo substituindo a pilha MTP. Para mais detalhes, consulte Personalização.

Limite do módulo

O Android 11 migra todo o código em packages/providers/MediaProvider para um novo local, com a exceção notável da lógica relacionada ao MTP. Além disso, frameworks/base/core/java/android/provider/MediaStore.java agora está dentro do limite do módulo em packages/providers/MediaProvider.

Formato do pacote

O módulo MediaProvider está no formato APK-in-APEX.

Dependências

As dependências do MediaProvider estão relacionadas a personalizações. Ou seja, se você personalizar o MediaProvider, será necessário garantir que a implementação atenda à dependência associada à personalização.

  • Ao usar formatos de arquivo de mídia personalizados ou não padrão (por exemplo, um formato gerado por um app Câmera específico do fornecedor), você precisa registrar cada formato personalizado com MimeUtils e o módulo do Extrator de mídia para ativar a indexação pelo MediaProvider.

  • Para garantir que o MediaProvider indexe um conjunto personalizado de dispositivos de armazenamento (como slots de cartão SD e portas USB) usados em uma implementação de StorageManagerService, defina a flag VolumeInfo.MOUNT_FLAG_INDEXABLE.

  • Ao usar uma implementação de MTP personalizada (não AOSP), verifique se ela depende exclusivamente de APIs públicas e do sistema para permitir que a implementação interaja com a MediaStore.

Personalização

Agora é possível adicionar novos formatos de mídia, influenciar quais dispositivos de armazenamento são indexados e substituir a pilha MTP.

  • Formatos de mídia personalizados. Para cada novo formato de mídia personalizado, é necessário fornecer um mapeamento da extensão de arquivo exclusiva para um tipo MIME. Recomendamos que você siga o processo de registro da IANA.

    • Não é possível redefinir uma extensão ou um tipo MIME que já esteja definido no AOSP.

    • Para arquivos video/* e audio/*, o MediaProvider continua consultando MediaMetadataRetriever. Use os extratores de mídia do Android 10 para retornar metadados para formatos personalizados.

    • Para arquivos image/*, o MediaProvider continua padronizando em Exif para metadados. É possível estender android.media.ExifInterface para extrair e retornar metadados Exif para qualquer formato de imagem personalizado.

  • Sinalização de indexação de dispositivos de armazenamento. O MediaProvider indexa todos os volumes retornados por StorageManager.getStorageVolumes() em que StorageVolume.getMediaStoreVolumeName() não é nulo. É possível personalizar a lista de volumes retornados para influenciar o que é indexado, mas recomendamos não incluir volumes temporários (como unidades USB OTG).

  • Substituição da pilha MTP. O Android 11 coloca a pilha MTP totalmente fora do limite do módulo e garante que ela funcione com APIs públicas.

Testes

Você pode verificar a funcionalidade do MediaProvider usando os seguintes testes:

  • Para verificar a funcionalidade das APIs públicas da MediaStore, use testes no pacote CtsProviderTestCases do conjunto de teste de compatibilidade (CTS) do Android.

  • Para verificar a funcionalidade dos componentes internos do MediaProvider, use os testes em MediaProviderTests.

Para executar os dois conjuntos de testes juntos, use o seguinte comando atest:

atest --test-mapping packages/providers/MediaProvider