Modulo MediaProvider

Il modulo MediaProvider ottimizza i metadati indicizzati (audio, video e immagini da schede SD e dispositivi USB) e rende questi dati disponibili alle app tramite le API pubbliche di MediaStore. Per tutelare la privacy degli utenti, il modulo MediaProvider applica il modello di sicurezza dell'archiviazione in ambito introdotto in Android 10, che include la modifica dei metadati di posizione sensibili. Questo modulo è aggiornabile, il che consente ad Android di rispondere più rapidamente ai problemi di sicurezza (mantenendo protetti i dati utente sensibili) e di aggiungere più rapidamente nuovi formati multimediali (garantendo coerenza sia per gli utenti che per gli 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 contenuto del file utilizzando la prima parte del tipo MIME di un file. Ad esempio, il sistema operativo sa che sia image/png sia image/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 il rilevamento del tipo di contenuto per evitare problemi di sicurezza).

  • Determinazione del tipo MIME di un file arbitrario utilizzando una combinazione di mapping Debian Linux e Android upstream.

  • Restituzione dei dati pertinenti dai file video/* e audio/* (tramite MediaMetadataRetriever) e dai file image/* (tramite ExifInterface).

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 i metadati disponibili con le API pubbliche di MediaStore. Le modifiche includono:

    • Nuova colonna is_favorite e nuovo argomento QUERY_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_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 collettiva di più elementi con un singolo prompt di dialogo utente, tra cui createDeleteRequest(), createFavoriteRequest(), createTrashRequest() e createWriteRequest().

    • Nuove colonne GENERATION_ADDED e GENERATION_MODIFIED da utilizzare per rilevare in modo rapido e affidabile le modifiche apportate rispetto a un punto di sincronizzazione precedente.

    • Nuova API pubblica GROUP BY da utilizzare con colonne di metadati aggiuntive non menzionate sopra.

  • Miglioramento di ExifInterface per estrarre i metadati dai contenitori PNG e WebP.

  • Miglioramenti a SystemUI per scrivere i metadati DateTimeOriginal nelle acquisizioni dello schermo.

Inoltre, ora puoi personalizzare MediaProvider aggiungendo nuovi formati multimediali, indicando quali dispositivi di archiviazione devono essere indicizzati e persino sostituendo lo stack 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 confine del modulo a 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 la tua 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 slot per schede SD e porte USB) utilizzati in un'implementazione StorageManagerService, imposta il flag VolumeInfo.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 l'indicizzazione dei dispositivi di archiviazione e sostituire lo stack MTP.

  • Formati multimediali personalizzati. Per ogni nuovo formato multimediale personalizzato, devi fornire una mappatura dall'estensione 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à definiti in AOSP.

    • Per i file video/* e audio/*, MediaProvider continua a consultare MediaMetadataRetriever. Utilizza gli estrattori di contenuti multimediali di Android 10 per restituire i metadati per i formati personalizzati.

    • Per i file image/*, MediaProvider continua a standardizzare Exif per i metadati. Puoi estendere android.media.ExifInterface per estrarre e restituire i metadati Exif per qualsiasi formato immagine personalizzato.

  • Flag di indicizzazione dei dispositivi di archiviazione. MediaProvider indicizza tutti i volumi restituiti da StorageManager.getStorageVolumes() dove StorageVolume.getMediaStoreVolumeName() non è null. Puoi personalizzare l'elenco dei volumi restituiti per influire su ciò che viene indicizzato, ma ti sconsigliamo di includere volumi temporanei (come le unità USB OTG).

  • Sostituzione dello stack MTP. Android 11 posiziona lo stack MTP completamente al di fuori del limite del modulo e garantisce che funzioni con API pubbliche.

Test

Puoi verificare la funzionalità di MediaProvider utilizzando i seguenti test:

  • Per verificare la funzionalità delle API pubbliche MediaStore, utilizza i test nel pacchetto CtsProviderTestCases della suite di test di compatibilità (CTS) di Android.

  • 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