Modulo MediaProvider

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 che image/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/* e audio/* (tramite MediaMetadataRetriever ) e file image/* (tramite ExifInterface ).

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 argomento QUERY_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() e createWriteRequest() .

    • Nuove colonne GENERATION_ADDED e GENERATION_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 metadati DateTimeOriginal 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 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 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/* e audio/* , MediaProvider continua a consultare MediaMetadataRetriever . Utilizza gli estrattori multimediali di Android 10 per restituire metadati per formati personalizzati.

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

  • Flag di indicizzazione dei dispositivi di archiviazione. MediaProvider indicizza tutti i volumi restituiti da StorageManager.getStorageVolumes() dove StorageVolume.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