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
eimage/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/*
eaudio/*
(usando oMediaMetadataRetriever
) eimage/*
(viaExifInterface
).
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 argumentoQUERY_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()
ecreateWriteRequest()
.Novas colunas
GENERATION_ADDED
eGENERATION_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 metadadosDateTimeOriginal
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çãoVolumeInfo.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/*
eaudio/*
, o MediaProvider continua com a consultoriaMediaMetadataRetriever
Use os extratores de mídia do Android 10 para retornar metadados para 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.
Sinalização de indexação de dispositivos de armazenamento. O MediaProvider indexa todos os volumes retornados por
StorageManager.getStorageVolumes()
, ondeStorageVolume.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