2009-12-02 7 views
10

Mi aplicación almacena datos localmente en la base de datos SQLite nativa, y quiero permitir que los usuarios exporten estos datos enviándose un archivo .csv por correo electrónico. Con el fin de hacer esto que estoy generando el .csv desde la base de datos y escribirlo en la tarjeta SD, luego adjuntar a un correo electrónico:Android: ¿es posible adjuntar un archivo al correo electrónico sin escribir en 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")); 

cosas que todas las grandes obras. Lo que me pregunto, sin embargo, es si es posible omitir primero el paso de escribir en SD y adjuntar directamente los datos.

+1

No voy a publicar esto como una respuesta, pero ¿no puede simplemente escribir el archivo CSV en una secuencia en la memoria y luego pasar esa secuencia en el intento de correo electrónico? – MattC

+2

@MattC: no, porque no hay un tipo "extra" que sea una transmisión. – CommonsWare

+1

+1 buena pregunta .. – SRam

Respuesta

3

Incluso si es posible, recomiendo que no lo haga.

Intents utilizados para iniciar actividades se mantendrán durante (potencialmente) un tiempo bastante largo, siempre que la actividad en cuestión esté "viva" y pueda ser devuelta a (por ejemplo, de nuevo en la pila, porque el usuario tomó una llamada mientras redactaba el correo electrónico y luego conversó por SMS durante media hora).

Además, Intents se copia entre procesos un poco como parte de esto. Por ejemplo, el cliente de correo electrónico estará en un proceso diferente al de su aplicación.

Por estas dos razones, necesita mantener su Intents pequeño. La única alternativa a un Uri para el contenido sería tener el contenido directamente en el extra en sí ... y ese archivo CSV, presumiblemente, podría ser un poco grande.

+0

Quería lograr esto porque parecía que sería realmente frustrante y parecería no estar relacionado con el punto de vista del usuario para fallar en el caso de que no hubiera una tarjeta SD montada. Pero este es un buen consejo, y puedo trabajar con eso. – Bee

+3

Puede intentar colocarlo en el área de almacenamiento de archivos local de la aplicación (getFilesDir()) y hacerlo legible por todo el mundo. Normalmente no juego con las banderas de control de acceso, pero necesitas que el cliente de correo electrónico pueda leer el archivo. La tarjeta SD funciona para eso, pero como usted señala, posiblemente no haya una tarjeta SD. – CommonsWare

+0

FYI: TransactionTooLargeException si se pasan demasiados datos a Intent. – kaay

Cuestiones relacionadas