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 edição de metadados de localização confidenciais. Este módulo é atualizável, permitindo que o Android responda mais rapidamente a problemas de segurança (mantendo protegidos os dados confidenciais 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 diversas 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 tanto image/png quanto image/x-newly-invented-format são imagens e pode, portanto, 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 detecção 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 do Debian Linux e Android .

  • Retornando dados relevantes de arquivos de video/* e audio/* (via MediaMetadataRetriever ) e arquivos 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 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 mídia rapidamente com base nesta coluna.

    • Indexando metadados do espaço de cores.

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

    • Novas APIs que permitem a modificação em massa de vários itens com um único prompt 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 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é mesmo 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 do MediaProvider estão relacionadas a customizações (ou seja, se você customizar o MediaProvider, deverá garantir que sua implementação atenda à dependência associada à sua customização).

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

  • Para garantir que o MediaProvider indexe um conjunto personalizado de dispositivos de armazenamento (como slots para cartão SD e portas USB) usados ​​em uma implementação 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 serã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 fortemente 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 video/* e audio/* , 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. 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() onde 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 dos limites do módulo e garante que ela 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 interna 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