2010-08-25 47 views
14

Tôi có hình ảnh được tạo theo chương trình mà tôi muốn gửi dưới dạng tệp đính kèm qua phương thức ACTION_SENDEXTRA_STREAM.Android: Làm cách nào để đính kèm hình ảnh tạm thời, được tạo vào email?

Nhưng làm cách nào để thực hiện việc này?

Lần đăng nhập đầu tiên của tôi (xem đường dẫn tệp context.getCacheDir()) xuất hiện trong bản xem trước Gmail (không xem trước hình ảnh, nhưng tên tệp và biểu tượng kèm theo), nhưng tệp đính kèm không bao giờ xuất hiện bên người nhận. Tôi đoán điều này có một cái gì đó để làm với các điều khoản trên các tập tin được tạo ra, nhưng làm thế nào để tránh điều này? Tôi có cần đặt các cài đặt dễ dãi hơn trên các tệp được tạo này (để hoạt động của Gmail có thể truy cập) không? Điều đó thậm chí có thể cho thư mục bộ nhớ cache của ứng dụng không?

Có vị trí tệp nào khác phù hợp hơn để ghi tệp của tôi không? Tôi coi thư mục tải xuống, nhưng nghĩ rằng đó sẽ là một vị trí khó xử cho thứ gì đó chỉ cần tồn tại cho đến khi nó được gửi qua email.

Tôi thậm chí đã thử mã hóa hình ảnh của mình hoàn toàn theo URI kiểu data:image/png;base64,ABCD.... Điều này cũng xuất hiện trong bản xem trước Gmail (biểu tượng tệp đính kèm, nhưng không có tên tệp), nhưng không dẫn đến tệp đính kèm bên người nhận.

Có ai có thể đính kèm hình ảnh được tạo một lần vào mục đích email bằng bất kỳ phương tiện nào không? Tôi có thể bỏ qua những lựa chọn nào?

Trả lời

18

Vấn đề của tôi thực sự bao gồm hai phần:

  1. context.getCacheDir() là tin ứng dụng của bạn. Bạn không thể đặt một cái gì đó ở đó và mong đợi một ứng dụng khác có thể truy cập nó.
  2. Tôi hiểu nhầm loại MIME nào tôi nên sử dụng. Mặc dù tôi đã gửi văn bản email, tôi thực sự cần phải chỉ định image/png vì mục đính kèm của tôi.

Ngoài ra, nghiên cứu chỉ ra rằng việc đưa hình ảnh (tiềm năng lớn) vào bộ nhớ chính không phải là ý tưởng hay, ngay cả khi bạn định làm sạch ngay lập tức.

Khi tôi đã làm những việc này và đã viết hình ảnh đã tạo của mình đến một vị trí công cộng trên Thẻ SD, nó hoạt động tốt.

Vì vậy, trong cái nhìn tổng quan:

Yêu cầu SD Card Access trong manifest

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

Hãy chắc chắn rằng thẻ SD của bạn có sẵn

if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) 
{ 
    //Bail gracefully 
} 

Tạo một thư mục trên Thẻ SD

File pngDir = new File(
    Environment.getExternalStorageDirectory(), 
    //Loose convention inferred from app examples 
    "Android/data/com.somedomain.someapp/flotsam"); 

if (!pngDir.exists()) 
    pngDir.mkdirs(); 

Viết tập tin của bạn vào thư mục đó và nắm bắt được Uri

File pngFile = new File(pngDir, "jetsam.png"); 
//Save file encoded as PNG 
Uri pngUri = Uri.fromFile(pngFile); 

Xây dựng một ACTION_SEND ý định

Intent intent = new Intent(android.content.Intent.ACTION_SEND); 
intent.setType("image/png"); // 
intent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] { "[email protected]" }); 
intent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Portable Network Graphics"); 
intent.putExtra(android.content.Intent.EXTRA_CC, new String[] { "[email protected]" }); 
intent.putExtra(Intent.EXTRA_TEXT, "Something textual"); 
intent.putExtra(Intent.EXTRA_STREAM, pngUri); 

Và sau đó bắt đầu hoạt động

context.startActivity(Intent.createChooser(intent, "Something Pithy")); 

Và sau đó đảm bảo tất cả mọi thứ bạn làm sạch ...

Caveat 1

Có vẻ như hỗ trợ nhiều hơn đến cho các thư mục SD Card ứng dụng cụ thể, nhưng than ôi, không phải trong yêu cầu của tôi Phiên bản SDK.

Caveat 2

Đây là một tổng quan về các giải pháp mà cuối cùng làm việc cho tôi. Nó không nhất thiết phải là phương pháp "thực hành tốt nhất".

Caveat 3

này có nghĩa là các ứng dụng phải có một thẻ nhớ SD gắn trong để có hình ảnh đính kèm tính năng sẵn có, nhưng điều này là hoàn toàn có thể chấp nhận đối với trường hợp sử dụng của tôi. Số dặm của bạn có thể thay đổi. Nếu không có Thẻ SD, tôi sẽ thêm một ghi chú thân thiện vào email giải thích lý do không thể đính kèm hình ảnh và cách khắc phục tình huống.

+0

này có thể được thực hiện với một phong tục 'ContentProvider'. Nó sẽ không yêu cầu thêm sự cho phép, và cũng loại bỏ sự phụ thuộc vào thẻ SD. – HRJ

+0

@HRJ bạn có thể giải thích về khả năng này bằng câu trả lời không?Tôi rất muốn xem chi tiết hơn về cách thức này có thể được thực hiện ... – el2iot2

+0

giải pháp này không hoạt động cho tôi. điều kỳ lạ nhất là tệp hình ảnh được tạo trên thẻ sd! – Paschalis

4

Tôi vừa chạy chính xác cùng một vấn đề (muốn đính kèm tệp văn bản trong trường hợp của tôi). Nếu bạn nhìn vào các bản ghi Android, lý do cho nó là:

02-28 21:01:28.434: E/Gmail(19673): file:// attachment paths must point to file:///mnt/sdcard. Ignoring attachment file:///data/data/com.stephendnicholas.gmailattach/cache/Test.txt 

Là một workaround (như đã đề cập bởi HRJ), bạn có thể sử dụng một ContentProvider để cung cấp quyền truy cập vào các file trong bộ nhớ cache nội bộ của ứng dụng của bạn để Gmail có thể đính kèm chúng. Tôi vừa viết một số blog post về cách thực hiện.

Hy vọng đó là giúp đỡ một số :)

+0

ContentProvider là giải pháp tôi đã sử dụng. Tôi không muốn mọi người có thể đọc các tệp của tôi từ thẻ SD. – Carlos

0
tableLayout.buildDrawingCache(); 
     Bitmap test = Bitmap.createBitmap(tableLayout.getDrawingCache()); 
     tableLayout.destroyDrawingCache(); 

     Log.d("Image", test.toString()); 

     String path = Environment.getExternalStorageDirectory().toString(); 
     Log.d("Path", path); 
     File file = new File(path,"mail_image.png"); 
     Uri pngUri = Uri.fromFile(file); 
     Log.d("Real Image Path", pngUri.toString()); 

     Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); 
     emailIntent.setType("image/png"); 
     emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, "email to"); 
     emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,"Subject"); 
     emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "From My App"); 
        emailIntent.putExtra(android.content.Intent.EXTRA_STREAM, pngUri); 

     startActivity(Intent.createChooser(emailIntent, "Send mail...")); 
Các vấn đề liên quan