Il modulo MediaProvider ottimizza i metadati indicizzati (audio, video e immagini da schede SD e dispositivi USB) e rende tali dati disponibili alle app tramite le API pubbliche di MediaStore . Per preservare la privacy degli utenti, il modulo MediaProvider applica il modello di sicurezza dell'archiviazione con ambito introdotto in Android 10, che include la rimozione dei metadati sensibili sulla posizione. Questo modulo è aggiornabile e consente ad Android di rispondere più rapidamente ai problemi di sicurezza (mantenendo protetti i dati sensibili degli utenti) e di aggiungere nuovi formati multimediali più rapidamente (fornendo coerenza sia agli utenti che agli sviluppatori).
Cambiamenti in Android 10
Android 10 ha introdotto diversi miglioramenti relativi all'identificazione e all'estrazione dei dati dai file multimediali, nello specifico:
Determinazione del tipo di contenuto del file utilizzando la prima parte del tipo MIME di un file. Ad esempio, il sistema operativo sa che sia
image/png
cheimage/x-newly-invented-format
sono immagini e può quindi descrivere accuratamente le autorizzazioni pertinenti all'utente finale.Determinare il tipo MIME utilizzando solo l'estensione del file (e senza utilizzare lo sniffing del contenuto per evitare problemi di sicurezza).
Determinazione del tipo MIME di un file arbitrario utilizzando una combinazione di mappature upstream Debian Linux e Android .
Restituzione di dati rilevanti da file
video/*
eaudio/*
(tramiteMediaMetadataRetriever
) e fileimage/*
(tramiteExifInterface
).
Cambiamenti 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 i metadati disponibili con le API pubbliche di MediaStore. Le modifiche includono:
Nuova colonna
is_favorite
e argomentoQUERY_ARG_MATCH_FAVORITE
per consentire alle app in stile galleria di filtrare rapidamente i media in base a questa colonna.Indicizzazione dei metadati dello spazio colore.
Nuova colonna "is_trashed" 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 in blocco di più elementi con un singolo messaggio di dialogo utente, tra cui
createDeleteRequest()
,createFavoriteRequest()
,createTrashRequest()
ecreateWriteRequest()
.Nuove colonne
GENERATION_ADDED
eGENERATION_MODIFIED
da utilizzare per rilevare in modo rapido e 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 menzionate sopra.
Miglioramento a
ExifInterface
per estrarre metadati da contenitori PNG e WebP.Miglioramenti a
SystemUI
per scrivere metadatiDateTimeOriginal
nelle acquisizioni di schermate.
Inoltre, ora puoi personalizzare MediaProvider aggiungendo nuovi formati multimediali, contrassegnando quali dispositivi di archiviazione devono essere indicizzati e persino sostituendo lo stack MTP. Per i dettagli, vedere Personalizzazione .
Confine del modulo
Android 11 migra 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
si trova ora 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 si utilizzano formati di file multimediali personalizzati o non standard (ad esempio, un formato generato da un'app Fotocamera specifica del fornitore), è necessario registrare ciascun formato personalizzato con
MimeUtils
e il modulo Media Extractor per abilitare l'indicizzazione da parte di MediaProvider.Per garantire che MediaProvider indicizzi un set personalizzato di dispositivi di archiviazione (come slot per schede SD e porte USB) utilizzati in un'implementazione
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 all'implementazione di interagire con MediaStore.
Personalizzazione
Ora puoi aggiungere nuovi formati multimediali, influenzare quali dispositivi di archiviazione vengono indicizzati e sostituire lo stack MTP.
Formati multimediali personalizzati. Per ogni nuovo formato multimediale personalizzato, devi fornire una mappatura dall'estensione di file univoca a un tipo MIME. Ti invitiamo vivamente a seguire il processo di registrazione IANA .
Non puoi ridefinire un'estensione o un tipo MIME già definito in AOSP.
Per i file
video/*
eaudio/*
, MediaProvider continua a consultareMediaMetadataRetriever
. Utilizza gli estrattori multimediali di Android 10 per restituire metadati per formati personalizzati.Per i file
image/*
, MediaProvider continua la standardizzazione suExif
per i metadati. Puoi estendereandroid.media.ExifInterface
per estrarre e restituire 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. È possibile personalizzare l'elenco dei volumi restituiti per influenzare ciò che viene indicizzato, ma sconsigliamo di includere volumi temporanei (come le unità USB OTG).Sostituzione dello stack MTP. Android 11 posiziona lo stack MTP completamente all'esterno dei limiti 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, utilizzare i test nel pacchetto
CtsProviderTestCases
di Android Compatibility Test Suite (CTS).Per verificare la funzionalità dei componenti interni di MediaProvider, utilizzare i test in
MediaProviderTests
.
Per eseguire entrambi i set di test insieme, utilizzare il seguente comando atest
:
atest --test-mapping packages/providers/MediaProvider