Le API del provider di contenuti/resolver forniscono un metodo complicato, ma efficace per trasferire dati tra processi utilizzando un URI e i metodi openInputStream()
e openOutputStream()
. I fornitori di contenuti personalizzati hanno la possibilità di ignorare il metodo openFile()
con codice personalizzato per risolvere efficacemente un URI in un Stream
; tuttavia, la firma del metodo di openFile()
ha un tipo di ritorno ParcelFileDescriptor
e non è chiaro in che modo si possa generare una rappresentazione corretta per il contenuto generato dinamicamente da restituire da questo metodo.ContentProvider personalizzato - openInputStream(), openOutputStream()
Returning a memory mapped InputStream from a content provider?
ci sono esempi di attuazione ContentProvider.openFile()
metodo per il contenuto dinamico nella base di codice esistente? Se no, puoi suggerire codice sorgente o processo per farlo?
Ci sono piani per includere una conversione tra un file di memoria e parcelfiledescriptor in futuro? Qualcosa lungo queste linee sarebbe più bello che ingombrare/inquinare il filesystem con file temporanei che hanno una durata sconosciuta. Forse c'è un modo per rilevare la chiusura del flusso all'interno del fornitore di contenuti che potrebbe offrire un modo un po 'più sicuro di pulizia dopo te stesso? Mi preoccupo di inviare allegati a un client di posta elettronica (gmail/standaed) anche se sono sicuro che ci sono altri posti in cui potrebbero sorgere questi problemi. – hannasm
Sì, MemoryFile.java ha attualmente un metodo 'public ParcelFileDescriptor getParcelFileDescriptor()'. Questo è stato commesso come parte di Donut, ma come diceva Jeff, non è ancora stato finalizzato. Ho confermato che il "concetto" funziona almeno, e può essere fatto al momento, usando la riflessione. È molto sporco però e non consigliato :) Sfortunatamente, anche 'ParcelFileDescriptor.fromSocket()' non può essere usato perché 'Memory.isMemoryFile()' genera un'eccezione perché il socket non è né un PFD né un file di memoria. – Joe
Attenzione con MemoryFile. Se ho capito bene, memorizza l'intero contenuto di un file in memoria, quindi non puoi usare file più grandi della memoria disponibile. –