Il modulo MediaProvider ottimizza i metadati indicizzati (audio, video e immagini da schede SD e dispositivi USB) e rende questi dati disponibili per le app tramite le API pubbliche MediaStore. Per mantenere la privacy degli utenti, il modulo MediaProvider applica il modello di sicurezza per lo stoccaggio con ambito introdotto in Android 10, che include l'oscuramento dei metadati sulla posizione sensibili. Questo modulo è aggiornabile, consentendo ad Android di rispondere più rapidamente ai problemi di sicurezza (mantenendo protetti i dati utente sensibili) e di aggiungere nuovi formati multimediali più rapidamente (garantendo coerenza sia a utenti che agli sviluppatori).
Modifiche in Android 10
Android 10 ha introdotto diversi miglioramenti relativi all'identificazione e all'estrazione di dati dai 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 sia
image/png
cheimage/x-newly-invented-format
sono immagini e può quindi descrivere con precisione le autorizzazioni pertinenti all'utente finale.Determinazione del tipo MIME utilizzando solo l'estensione del file (e senza utilizzare lo sniffing dei contenuti per evitare problemi di sicurezza).
Determinazione del tipo MIME di un file arbitrario utilizzando una combinazione di mappature di Debian Linux e Android upstream.
Restituisce i dati pertinenti dai file
video/*
eaudio/*
(tramiteMediaMetadataRetriever
) e dai fileimage/*
(tramiteExifInterface
).
Modifiche in Android 11
In Android 11, il modulo MediaProvider si basa sulle modifiche apportate in Android 10 con i seguenti miglioramenti:
Miglioramenti all'indicizzazione. Il modulo MediaProvider ora indicizza i metadati riconciliando quelli disponibili con le API pubbliche di MediaStore. Le modifiche includono:
Nuova colonna
is_favorite
e nuovo argomentoQUERY_ARG_MATCH_FAVORITE
per consentire alle app in stile galleria di filtrare rapidamente i contenuti multimediali in base a questa colonna.Indicizzazione dei metadati dello spazio colore.
Nuova colonna "is_trash" e argomento
QUERY_ARG_MATCH_TRASHED
per consentire alle app in stile galleria di filtrare in base a questa colonna.Nuove API che consentono la modifica collettiva di più elementi con un singolo prompt della finestra di dialogo dell'utente, tra cui
createDeleteRequest()
,createFavoriteRequest()
,createTrashRequest()
ecreateWriteRequest()
.Nuove colonne
GENERATION_ADDED
eGENERATION_MODIFIED
da utilizzare per rilevare rapidamente e in modo affidabile le modifiche che si sono verificate da un punto di sincronizzazione precedente.Nuova API pubblica
GROUP BY
da utilizzare con colonne di metadati aggiuntive non elencate sopra.
Miglioramento di
ExifInterface
per estrarre i metadati dai contenitori PNG e WebP.Miglioramenti a
SystemUI
per scrivere i metadatiDateTimeOriginal
nelle schermate acquisite.
Inoltre, ora puoi personalizzare MediaProvider aggiungendo nuovi formati multimediali, contrassegnando i dispositivi di archiviazione da indicizzare e persino sostituendo la pila MTP. Per maggiori dettagli, vedi Personalizzazione.
Confine del modulo
Android 11 esegue la migrazione di tutto il codice in
packages/providers/MediaProvider
in una nuova posizione, con la notevole eccezione
della logica relativa a MTP. Inoltre,
frameworks/base/core/java/android/provider/MediaStore.java
ora si trova all'interno
del 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, se personalizzi MediaProvider, devi assicurarti che l'implementazione soddisfi la dipendenza associata alla personalizzazione).
Quando utilizzi formati di file multimediali personalizzati o non standard (ad esempio un formato generato da un'app Fotocamera specifica del fornitore), devi registrare ogni formato personalizzato con
MimeUtils
e il modulo Media Extractor per attivare l'indicizzazione da parte di MediaProvider.Per assicurarti che MediaProvider indicizzi un insieme personalizzato di dispositivi di archiviazione (ad esempio gli slot per schede SD e le porte USB) utilizzati in un'implementazione di
StorageManagerService
, imposta il flagVolumeInfo.MOUNT_FLAG_INDEXABLE
.Quando utilizzi un'implementazione MTP personalizzata (non AOSP), assicurati che l'implementazione si basi esclusivamente su API pubbliche e di sistema per consentire l'interazione con MediaStore.
Personalizzazione
Ora puoi aggiungere nuovi formati multimediali, influire sui dispositivi di archiviazione indicizzati e sostituire la pila MTP.
Formati multimediali personalizzati. Per ogni nuovo formato multimediale personalizzato, devi fornire una mappatura dall'estensione del file univoca a un tipo MIME. Ti consigliamo vivamente di seguire la procedura di 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 multimediali di Android 10 per restituire i metadati per i formati personalizzati.Per i file
image/*
, MediaProvider continua a standardizzare suExif
per i metadati. Puoi estendereandroid.media.ExifInterface
per estrarre e restituire i metadatiExif
per qualsiasi formato di immagine personalizzato.
Flag di indicizzazione dei dispositivi di archiviazione. MediaProvider indicizza tutti i volumi restituiti da
StorageManager.getStorageVolumes()
, doveStorageVolume.getMediaStoreVolumeName()
è diverso da null. Puoi personalizzare l'elenco dei volumi restituiti per influire su ciò che viene indicizzato, ma sconsigliamo di includere volumi temporanei (come le unità USB OTG).Sostituzione dello stack MTP. Android 11 posiziona la pila MTP interamente al di fuori del confine del modulo e garantisce che funzioni con le API pubbliche.
Test
Puoi verificare la funzionalità di MediaProvider utilizzando i seguenti test:
Per verificare la funzionalità delle API pubbliche di MediaStore, utilizza i test nel
CtsProviderTestCases
pacchetto della suite di test di compatibilità Android (CTS).Per verificare la funzionalità degli elementi 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