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 aplicativos por meio das APIs públicas do 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 redação de metadados de local confidenciais. Este módulo é atualizável, permitindo que o Android responda mais rapidamente a problemas de segurança (mantendo os dados confidenciais do usuário protegidos) 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, especificamente:

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

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

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

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

Mudanças no Android 11

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

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

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

    • Indexação de metadados de espaço de cores.

    • Nova coluna 'is_trashed' e argumento QUERY_ARG_MATCH_TRASHED para permitir que aplicativos estilo galeria filtrem com base nesta coluna.

    • Novas APIs que permitem a modificação em massa de vários itens com um único prompt de diálogo de 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 colunas de metadados adicionais não mencionadas acima.

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

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

Além disso, agora você pode personalizar o MediaProvider adicionando novos formatos de mídia, marcando quais dispositivos de armazenamento devem ser indexados e até substituindo a pilha MTP. Para obter 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 notável exceção 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 de MediaProvider estão relacionadas a personalizações (ou seja, se você personalizar MediaProvider, deverá garantir que sua implementação atenda à dependência associada à sua personalização).

  • Ao usar formatos de arquivo de mídia personalizados ou não padrão (por exemplo, um formato gerado por um aplicativo Camera específico do fornecedor), você deve registrar cada formato personalizado com MimeUtils e o módulo Media Extractor para habilitar 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 o sinalizador VolumeInfo.MOUNT_FLAG_INDEXABLE .

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

Costumização

Agora você pode 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ê deve fornecer um mapeamento da extensão de arquivo exclusiva para um tipo MIME. Recomendamos que você siga o processo de registro da IANA .

    • Você não pode redefinir uma extensão ou tipo MIME que já esteja definido no AOSP.

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

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

  • Sinalizador de indexação de dispositivos de armazenamento. MediaProvider indexa todos os volumes retornados por StorageManager.getStorageVolumes() em que StorageVolume.getMediaStoreVolumeName() não é nulo. Você pode personalizar a lista de volumes retornados para influenciar o que é indexado, mas desaconselhamos a inclusão de volumes transitó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 funcione em APIs públicas.

Teste

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

  • Para verificar a funcionalidade das APIs públicas do MediaStore, use testes no pacote CtsProviderTestCases do Android Compatibility Test Suite (CTS).

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

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

atest --test-mapping packages/providers/MediaProvider