Il modulo MediaProvider ottimizza i metadati indicizzati (audio, video e immagini) da schede SD e dispositivi USB) e rende disponibili i dati alle app tramite MediaStore pubblico per le API. Per preservare la privacy degli utenti, il modulo MediaProvider applica l'archiviazione con ambito sicurezza modello È stata introdotta in Android 10, il che include l'oscuramento dei metadati sulla posizione sensibili. Questo modulo è aggiornabile, consentendo ad Android di rispondere più velocemente ai problemi di sicurezza (mantenendo protetti i dati utente sensibili) e aggiungi nuovi formati multimediali più velocemente (garantendo coerenza sia a utenti che agli sviluppatori).
Modifiche in Android 10
Android 10 ha introdotto diversi miglioramenti relativi all'identificazione ed estrazione provenienti da file multimediali, in particolare:
Determinazione del tipo di contenuti del file utilizzando la prima parte del tipo MIME di file. Ad esempio, il sistema operativo sa che
image/png
eimage/x-newly-invented-format
sono immagini e sono quindi in grado di descrivere con precisione le autorizzazioni pertinenti per l'utente finale.Determinazione del tipo MIME utilizzando solo l'estensione del file (e senza utilizzare sniffing dei contenuti per evitare problemi di sicurezza).
Determinare il tipo MIME di un file arbitrario utilizzando una combinazione di Debian Linux e Android upstream mapping.
Restituzione di dati pertinenti da file
video/*
eaudio/*
(tramiteMediaMetadataRetriever
) eimage/*
file (tramiteExifInterface
).
Modifiche in Android 11
In Android 11, il modulo MediaProvider si basa sul modifiche apportate in Android 10 con i seguenti miglioramenti:
Miglioramenti all'indicizzazione. Il modulo MediaProvider ora indicizza i metadati tramite riconciliando i metadati disponibili con le API pubbliche MediaStore. Modifiche include:
Nuova colonna
is_favorite
e nuovo argomentoQUERY_ARG_MATCH_FAVORITE
da abilitare app in stile galleria per filtrare rapidamente i contenuti multimediali in base a questa colonna.Indicizzazione dei metadati dello spazio colore.
Nuovo elemento "is_trash" colonna e
QUERY_ARG_MATCH_TRASHED
argomento da abilitare app in stile galleria da filtrare in base a questa colonna.Nuove API che consentono la modifica collettiva di più elementi con un singolo utente finestra di dialogo, incluse
createDeleteRequest()
,createFavoriteRequest()
,createTrashRequest()
ecreateWriteRequest()
.Nuove colonne
GENERATION_ADDED
eGENERATION_MODIFIED
da utilizzare rapidamente e rilevare in modo affidabile le modifiche avvenute in passato punto di sincronizzazione.Nuova API pubblica
GROUP BY
da utilizzare con colonne di metadati aggiuntive non di cui sopra.
Miglioramento a
ExifInterface
per estrarre metadati da PNG e WebP containerizzati.Miglioramenti a
SystemUI
per la scrittura di metadatiDateTimeOriginal
sullo schermo acquisizioni.
Inoltre, ora puoi personalizzare MediaProvider aggiungendo nuovi formati multimediali, contrassegnare i dispositivi di archiviazione da indicizzare e persino sostituire MTP stack. Per maggiori dettagli, vedi Personalizzazione.
Confine modulo
Android 11 esegue la migrazione di tutto il codice
packages/providers/MediaProvider
per una nuova località, con una notevole eccezione
della logica relativa a MTP. Inoltre,
frameworks/base/core/java/android/provider/MediaStore.java
ora si trova all'interno della
limite del modulo in packages/providers/MediaProvider
.
Formato del pacchetto
Il modulo MediaProvider è in formato APK-in-APEX.
Dipendenze
Le dipendenze di MediaProvider sono correlate alle personalizzazioni (ovvero è che, se personalizzi MediaProvider, devi assicurarti che l'implementazione soddisfi la dipendenza associata alla personalizzazione).
Quando utilizzi formati file multimediali personalizzati o non standard (ad esempio, un formato generati da un'app Fotocamera specifica del fornitore), devi registrare ogni con
MimeUtils
e il modulo Media Extractor per abilitare l'indicizzazione MediaProvider:Per fare in modo che MediaProvider indicizzi un insieme personalizzato di dispositivi di archiviazione (ad esempio, schede SD) slot e porte USB) usati in un'implementazione
StorageManagerService
, imposta il valore FlagVolumeInfo.MOUNT_FLAG_INDEXABLE
.Quando utilizzi un'implementazione MTP personalizzata (non AOSP), assicurati che l'implementazione si basa esclusivamente su API pubbliche e di sistema per consentire l'implementazione interagire con MediaStore.
Personalizzazione
Ora puoi aggiungere nuovi formati multimediali, influire sui dispositivi di archiviazione indicizzati, e sostituisco lo stack MTP.
Formati multimediali personalizzati. Per ogni nuovo formato multimediale personalizzato, devi fornire una il mapping dall'estensione del file univoca a un tipo MIME. Ti consigliamo vivamente di di seguire le istruzioni della registrazione IANA .
Non puoi ridefinire un'estensione o un tipo MIME già definito in AOSP.
Per i file
video/*
eaudio/*
, MediaProvider continua a fornire consulenzaMediaMetadataRetriever
. Utilizza gli estrattori di contenuti multimediali di Android 10 per restituire metadati per formati personalizzati.Per i file
image/*
, MediaProvider continua a standardizzare suExif
per metadati. Puoi estendereandroid.media.ExifInterface
per estrarre e restituireExif
metadati per qualsiasi formato di immagine personalizzato.
Flag di indicizzazione dei dispositivi di archiviazione. MediaProvider indicizza tutti i volumi restituiti di
StorageManager.getStorageVolumes()
doveStorageVolume.getMediaStoreVolumeName()
non è null. Puoi personalizzare di volumi restituiti per influenzare ciò che viene indicizzato, ma sconsigliamo di inclusi i volumi temporanei (come le unità OTG USB).Sostituzione dello stack MTP. Android 11 pone l'MTP completamente al di fuori del confine del modulo e ne assicura il funzionamento rispetto a le API pubbliche.
Test
Puoi verificare la funzionalità di MediaProvider utilizzando i seguenti test:
Per verificare la funzionalità delle API pubbliche MediaStore, utilizza i test nella
CtsProviderTestCases
del pacchetto Android Compatibility Test Suite (CTS).Per verificare la funzionalità dei componenti interni di MediaProvider, utilizza i test in
MediaProviderTests
.
Per eseguire entrambi i set di test insieme, utilizza il seguente comando atest
:
atest --test-mapping packages/providers/MediaProvider