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 ocultação de metadados de local sensíveis. 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, 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
eimage/x-newly-invented-format
são imagens e, portanto, 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/*
eaudio/*
(usandoMediaMetadataRetriever
) e arquivosimage/*
(usandoExifInterface
).
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 os metadados disponíveis com as APIs públicas do MediaStore. As mudanças incluem:
Nova coluna
is_favorite
e argumentoQUERY_ARG_MATCH_FAVORITE
para permitir que apps estilo galeria filtrem mídias rapidamente com base nessa coluna.Indexação de metadados do espaço de cores.
Nova coluna "is_trashed" 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()
ecreateWriteRequest()
.Novas colunas
GENERATION_ADDED
eGENERATION_MODIFIED
para uso na detecção rápida e confiável de mudanças 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 em
ExifInterface
para extrair metadados de contêineres PNG e WebP.Melhorias na
SystemUI
para gravar metadadosDateTimeOriginal
em capturas de tela.
Além disso, agora é possível 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 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 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, precisará garantir que sua 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 de câmera específico do fornecedor), registre 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 de cartão SD e portas USB) usados em uma implementação de
StorageManagerService
, defina a flagVolumeInfo.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/*
eaudio/*
, o MediaProvider continua consultandoMediaMetadataRetriever
. Use os extratores de mídia do Android 10 para retornar metadados de formatos personalizados.Para arquivos
image/*
, o MediaProvider continua padronizando emExif
para metadados. É possível estenderandroid.media.ExifInterface
para extrair e retornar metadadosExif
para qualquer formato de imagem personalizado.
Flag de indexação de dispositivos de armazenamento. O MediaProvider indexa todos os volumes retornados por
StorageManager.getStorageVolumes()
em queStorageVolume.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 inteiramente fora do limite do módulo e garante que ela funcione com APIs públicas.
Teste
É possível 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