Módulo MediaProvider

O módulo MediaProvider otimiza metadados indexados (áudio, vídeo e imagens) a partir de cartões SD e dispositivos USB) e disponibiliza esses dados para aplicativos por meio do Público da MediaStore APIs do Google. Para manter a privacidade do usuário, o módulo MediaProvider aplica o armazenamento com escopo segurança modelo lançado no Android 10, que inclui a edição de metadados de local confidenciais. Este módulo é atualizável, permitindo que o Android responda mais rapidamente a problemas de segurança (protegendo os dados confidenciais do usuário) e adicione novos formatos de mídia mais rapidamente (proporcionando consistência aos usuários e aos 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, 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 podem descrever com precisão as permissões relevantes ao usuário final.

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

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

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

Mudanças no Android 11

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

  • Melhorias na indexação. O módulo MediaProvider agora indexa metadados por reconciliar metadados disponíveis com as APIs públicas da MediaStore. Alterações incluem:

    • Nova coluna is_favorite e argumento QUERY_ARG_MATCH_FAVORITE para ativar apps no estilo galeria para filtrar mídia rapidamente com base nessa coluna.

    • Indexando metadados do espaço de cores.

    • Novo valor "is_trastruct" coluna e argumento QUERY_ARG_MATCH_TRASHED para ativar de galeria para filtrar com base nessa coluna.

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

    • Novas colunas GENERATION_ADDED e GENERATION_MODIFIED para uso rápido e detectar com precisão as alterações que ocorreram desde um ponto de sincronização.

    • A nova API pública GROUP BY deve ser usada com outras colunas de metadados que não sejam mencionadas acima.

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

  • Melhorias no SystemUI para gravar metadados DateTimeOriginal na tela. captura.

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

Limite do módulo

O Android 11 migra todo o código packages/providers/MediaProvider para um novo local, com uma exceção importante de lógica relacionada ao MTP. Além disso, frameworks/base/core/java/android/provider/MediaStore.java agora está dentro 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 (que podem é, se você personalizar o MediaProvider, será necessário garantir que sua implementação atenda às a dependência associada à personalização).

  • Ao usar formatos de arquivo de mídia personalizados ou não padrão (por exemplo, um formato gerada por um aplicativo de câmera específico do fornecedor), é preciso registrar cada com MimeUtils e o módulo do Media Extractor para ativar a indexação o MediaProvider.

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

  • Ao usar uma implementação de MTP personalizada (não AOSP), garanta que ela depende exclusivamente de APIs públicas e do sistema para permitir a implementação para interagem 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, você precisa fornecer um o mapeamento de uma extensão de arquivo exclusiva para um tipo MIME. É altamente recomendável que você siga o Registro da IANA de análise de dados.

    • 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 com a consultoria 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(), onde StorageVolume.getMediaStoreVolumeName() não é nulo. É possível personalizar lista de volumes retornados para influenciar o que é indexado, mas recomendamos não incluindo volumes temporários (como unidades USB OTG).

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

Teste

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

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

  • Para verificar a funcionalidade dos componentes internos do MediaProvider, use os testes no MediaProviderTests:

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

atest --test-mapping packages/providers/MediaProvider