2010-08-25 91 views
14

我有一個程序生成的圖像,我想通過ACTION_SENDEXTRA_STREAM方法作爲附件發送。Android:如何將臨時生成的圖像附加到電子郵件中?

但我該怎麼做?

我的第一次嘗試(寫入我的context.getCacheDir()的文件路徑)看起來可以在Gmail預覽(無圖像預覽,但附加的文件名和圖標可見)中工作,但附件永遠不會到達收件人一方。我想這與生成的文件的權限有關,但如何避免這種情況?我是否需要對這些生成的文件設置更多寬容設置(以便Gmail活動可以訪問)?這甚至可能是應用程序的緩存文件夾?

是否有更適合將文件寫入的另一個文件位置?我考慮過下載文件夾,但認爲這將是一個尷尬的地方,只有通過電子郵件發送才需要存在。

我甚至試圖在data:image/png;base64,ABCD...風格的URI中純粹編碼我的圖像。這也顯示在Gmail預覽(附件圖標,但沒有文件名),但沒有導致收件人端附件。

有沒有人能夠通過任何方式將一次性生成的圖像附加到電子郵件意圖?我可以忽略哪些選項?

回答

18

我的問題確實由兩個部分組成:

  1. context.getCacheDir()是私有的應用程式。你不能把東西放在那裏,並期望另一個應用程序能夠訪問它。
  2. 我誤解了我應該使用的MIME類型。即使我正在發送電子郵件文本,爲了我的依戀,我確實需要指定image/png

此外,研究表明,即使您要立即清理它,將(可能較大的)圖像放在主存儲器上也不是一個好主意。

一旦我做了這些事情,並將我生成的圖像寫入SD卡上的公共位置,它工作得很好。

所以,在概述:在您的清單

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

確保SD卡

請求SD卡接入服務提供

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

上創建一個目錄SD卡

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

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

寫您的文件到該目錄,並捕獲烏里

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

建立一個ACTION_SEND意圖

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

然後啓動活性

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

然後確保你清理了一切......

買者1

似乎有更多的支持來爲特定的應用程序,SD卡目錄,但很可惜,不是我需要的SDK版本。

買者2

這是最終爲我工作的解決方案的概述。這不一定是「最佳實踐」方法。

買者3

這並不意味着該應用程序必須有安裝纔能有圖像附件功能可用SD卡,但是這是我的使用情況下,完全可以接受的。你的旅費可能會改變。如果SD卡不可用,我會在電子郵件中附加一個友好的註釋,說明爲什麼無法連接圖像以及如何糾正這種情況。

+0

難道這是一個自定義'ContentProvider'完成。它不需要額外的權限,也可以取消對SD卡的依賴。 – HRJ 2011-09-17 10:13:25

+0

@HRJ你能否用一個答案來詳細說明這種可能性?我很想看到更詳細的信息,說明如何做到這一點...... – el2iot2 2011-10-27 17:44:17

+0

這個解決方案不適合我。最奇怪的是,圖像文件是在SD卡上創建的! – Paschalis 2012-08-05 08:37:22

4

我剛剛遇到完全相同的問題(想在我的情況下附加一個文本文件)。如果您在Android日誌看,其原因是:

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 

作爲一種變通方法(如HRJ提到的),你可以使用的ContentProvider,以提供應用程序的內部緩存訪問文件,以便Gmail能附加他們。我剛剛寫了一篇關於如何做的blog post

希望這是一些幫助:)

+0

ContentProvider是我所用的解決方案。我不希望每個人都能夠從SD卡上讀取我的文件。 – Carlos 2014-08-05 14:08:43

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...")); 
相關問題