2009-12-02 8 views
10

La mia applicazione memorizza i dati localmente nel db SQLite nativo e voglio consentire agli utenti di esportare questi dati inviando loro stessi un file .csv. Per fare questo ho generare il .csv dal database e la scrittura sulla scheda SD, quindi allegarlo a un e-mail:Android: è possibile allegare un file all'e-mail senza scrivere su SD?

StringBuilder csv = generateFile(); 
writeFile(csv.toString(),"file.csv"); 
Intent email = new Intent(android.content.Intent.ACTION_SEND); 
email.setType("application/octet-stream"); 
email.putExtra(android.content.Intent.EXTRA_STREAM, Uri.parse("file://sdcard/file.csv")); 

che tutte le grandi opere. Quello che mi sto chiedendo, però, è se è possibile saltare prima la fase di scrittura su SD e allegare direttamente i dati.

+1

Non ho intenzione di postare questo come risposta, ma non puoi semplicemente scrivere il file CSV in uno streaming in memoria e quindi passare quel flusso nell'intento dell'email? – MattC

+2

@MattC: no, perché non esiste un tipo "extra" che è uno stream. – CommonsWare

+1

+1 buona domanda .. – SRam

risposta

3

Anche se è possibile, consiglio di non farlo.

Intents utilizzato per il lancio di attività per (potenzialmente) un tempo abbastanza lungo - finché l'attività in questione è "viva" e potrebbe essere restituita (ad esempio, di nuovo in pila, perché il l'utente ha preso una telefonata mentre componeva l'email, quindi ha chattato via SMS per mezz'ora).

Inoltre, Intents vengono copiati equamente tra i processi come parte di questo. Ad esempio, il client di posta elettronica si troverà in una procedura diversa dalla tua app.

Per entrambi questi motivi, è necessario mantenere il Intents piccolo. L'unica alternativa a un Uri per il contenuto sarebbe quella di avere il contenuto direttamente nell'ext extra stesso ... e probabilmente il file CSV potrebbe diventare abbastanza grande.

+0

Volevo realizzare questo perché sembrava che sarebbe davvero frustrante e sembra non correlato dal pov dell'utente a fallire nel caso in cui non fosse montato alcun SD. Ma questo è un buon consiglio e posso lavorarci. – Bee

+3

Si potrebbe provare a metterlo nell'area di archiviazione file locale dell'app (getFilesDir()) e renderlo leggibile a livello mondiale. Di solito non mi pasticcio con i flag di controllo degli accessi, ma è necessario che il client di posta elettronica sia in grado di leggere il file. La scheda SD funziona per questo, ma come si fa notare, in teoria non esiste una scheda SD. – CommonsWare

+0

FYI: TransactionTooLargeException se troppi dati sono passati a Intent. – kaay

Problemi correlati