2009-12-02 41 views
10

Ứng dụng của tôi lưu trữ dữ liệu cục bộ trong db SQLite gốc và tôi muốn cho phép người dùng xuất dữ liệu này bằng cách gửi email cho chính họ một tệp .csv. Để thực hiện việc này, tôi tạo tệp .csv từ cơ sở dữ liệu và ghi nó vào thẻ SD, sau đó đính kèm vào email:Android: có thể đính kèm tệp vào email mà không cần ghi vào SD không?

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")); 

Mọi thứ đều hoạt động tốt. Những gì tôi tự hỏi, mặc dù, là nếu nó có thể bỏ qua bước của văn bản để SD đầu tiên, và trực tiếp đính kèm dữ liệu.

+1

Tôi sẽ không đăng câu trả lời này, nhưng bạn không thể chỉ ghi tệp CSV vào luồng trong bộ nhớ và sau đó truyền luồng đó vào mục đích email? – MattC

+2

@ McC: không, bởi vì không có loại "bổ sung" là luồng. – CommonsWare

+1

+1 câu hỏi hay .. – SRam

Trả lời

3

Thậm chí nếu có thể, tôi khuyên bạn nên chống lại nó.

Intents được sử dụng để khởi chạy hoạt động sẽ được giữ trong (có thể) một thời gian khá dài - miễn là hoạt động được đề cập là "còn sống" và có thể tưởng tượng được quay trở lại (ví dụ, trở lại trên ngăn xếp, vì người dùng đã thực hiện cuộc gọi điện thoại trong khi soạn email, sau đó trò chuyện qua SMS trong nửa giờ).

Hơn nữa, Intents được sao chép giữa các quy trình một chút công bằng như một phần của điều này. Ví dụ: ứng dụng email sẽ ở trong một quy trình khác với ứng dụng của bạn.

Vì cả hai lý do này, bạn cần giữ Intents nhỏ của mình. Cách thay thế duy nhất cho một số Uri đối với nội dung sẽ là có nội dung trực tiếp trong chính nó ... và tệp CSV đó có lẽ sẽ trở nên lớn.

+0

Tôi muốn thực hiện điều này vì có vẻ như nó sẽ thực sự bực mình và dường như không liên quan đến việc người dùng bị thất bại trong trường hợp không có thẻ SD. Nhưng đây là lời khuyên âm thanh, và tôi có thể làm việc với nó. – Bee

+3

Bạn có thể thử đặt nó vào vùng lưu trữ tệp ứng dụng cục bộ của bạn (getFilesDir()) và làm cho nó có thể đọc được trên thế giới. Tôi thường không gây rối với cờ kiểm soát truy cập, nhưng bạn cần ứng dụng email để có thể đọc tệp. Thẻ SD hoạt động cho điều đó, nhưng như bạn chỉ ra, có thể hình dung rằng không có thẻ SD. – CommonsWare

+0

FYI: TransactionTooLargeException nếu có quá nhiều dữ liệu được chuyển đến Intent. – kaay

Các vấn đề liên quan