2009-02-25 41 views
67

我試圖啓動一個意圖發送電子郵件。所有這些都有效,但是當我嘗試發送電子郵件時,發生了一些「奇怪」的事情。嘗試附加一個文件從SD卡到電子郵件

這裏是代碼

Intent sendIntent = new Intent(Intent.ACTION_SEND); 
sendIntent.setType("image/jpeg"); 
sendIntent.putExtra(Intent.EXTRA_SUBJECT, "Photo"); 
sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://sdcard/dcim/Camera/filename.jpg")); 
sendIntent.putExtra(Intent.EXTRA_TEXT, "Enjoy the photo"); 
startActivity(Intent.createChooser(sendIntent, "Email:")); 

所以,如果我啓動使用的Gmail菜單方面它顯示了依戀,讓我鍵入電子郵件是誰,和編輯的身體&主題。沒什麼大不了。我點擊發送,然後發送。唯一的是附件不會被髮送。

所以。我想,爲什麼不嘗試使用電子郵件菜單上下文(用於我手機上的備份電子郵件帳戶)。它顯示了附件,但沒有文字在身體或主題。當我發送它時,附件發送正確。那會讓我相信有些事情是錯誤的。我是否需要在Manifest發佈新的權限以發送帶附件的電子郵件?我究竟做錯了什麼?

+1

感謝Chrispix的ArrayList附加多個項目!這個代碼在我的摩托CLIQ工作。 – Jana 2010-10-19 07:09:44

回答

94

也越來越相同的問題

代碼:

Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); 
    emailIntent.setType("image/jpeg"); 
    emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] 
    {"[email protected]"}); 
    emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, 
    "Test Subject"); 
    emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, 
    "go on read the emails"); 
    Log.v(getClass().getSimpleName(), "sPhotoUri=" + Uri.parse("file:/"+ sPhotoFileName)); 
    emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:/"+ sPhotoFileName)); 
    startActivity(Intent.createChooser(emailIntent, "Send mail...")); 

從adb logcat:

V/DumbDumpersMain(3972): sPhotoUri=file://sdcard/DumbDumpers/DumbDumper.jpg 
I/ActivityManager( 56): Starting activity: Intent { action=android.intent.action.CHOOSER comp={android/com.android.internal.app.ChooserActivity} (has extras) } 
I/ActivityManager( 56): Starting activity: Intent { action=android.intent.action.SEND type=jpeg/image flags=0x3000000 comp={com.google.android.gm/com.google.android.gm.ComposeActivityGmail} (has extras) } 
I/ActivityManager( 56): Starting activity: Intent { action=android.intent.action.SEND type=jpeg/image flags=0x2800000 comp={com.google.android.gm/com.google.android.gm.ComposeActivity} (has extras) } 
D/gmail-ls( 120):  MailProvider.query: content://gmail-ls/labels/[email protected](null, null) 
D/Gmail (2507):  URI FOUND:file://sdcard/DumbDumpers/DumbDumper.jpg 

看起來像電子郵件提供商是附屬ng長度爲0的文件。當我檢查文件系統時,文件存在且正確。創建圖像文件的代碼在嘗試發送電子郵件之前已經完成。

任何人修復這個沒有魔術重啓(我已經試過了)?

問候,

更新

我的路徑應該是

file:///sdcard/DumbDumpers/DumbDumper.jpg

你需要額外的/,因爲這點到根目錄下,即:

file://+/sdcard/DumbDumpers/DumbDumper.jpg

合併爲

file:///sdcard/DumbDumpers/DumbDumper.jpg

在上面的代碼中,你需要:

emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://"+ sPhotoFileName)); 

我希望這有助於。我花了很多時間去調試。

問候,
芬利

+6

我upvoted,但它會更好,如果你重新這樣做,最終的解決方案是工作到代碼。解決方案比這裏的故事更重要。 – 2010-01-24 05:47:27

+3

我改變了答案,以反映它需要3個斜線的事實。我也投了這個票。 – Chrispix 2010-11-04 13:04:36

+0

upvote,我不會重寫這個,因爲人們應該知道錯誤在哪裏。感謝您的解決方案。 – mad 2010-12-13 10:42:08

4

看來,這實際上是正確的,不知道發生了什麼事,但重新啓動後它開始工作:/

+0

OP的代碼有一個錯字:路徑應該是`file:/// sdcard`(注意三個斜槓,與兩個相反)。 – 2011-11-20 20:54:56

7

,而不是 「Uri.parse」 使用「Uri.fromFile(新文件(環境。getExternalStorageDirectory(),「文件名」))」

Environment.getExternalStorageDirectory() - 路徑SD卡或其他外部存儲

21

只是一點點的話從我的身邊,我一直有同樣的問題。GMail的,但不知何故,似乎當我第一次有問題的文件存儲在SD卡上,並從那裏,而不是從資產檢索到工作,所以我的代碼如下:

Intent i = new Intent(Intent.ACTION_SEND); 
i.putExtra(Intent.EXTRA_SUBJECT, "Title"); 
i.putExtra(Intent.EXTRA_TEXT, "Content"); 
i.putExtra(Intent.EXTRA_STREAM, uri); 
i.setType("text/plain"); 
startActivity(Intent.createChooser(i, "Send mail")); 

這裏,

uri = Uri.fromFile(new File(context.getFilesDir(), FILENAME)); 

工作,而

uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), FILENAME)); 

一樣。

問候, 邁克爾

3

我得到了同樣的問題,並四處尋找一個解決方案。最後,我通過找到一個開箱即用的應用程序來解決這個問題,並且看看他們是如何做到的。代碼很長,所以我不會在這裏引用它,但發佈一個鏈接。看看sendEmail功能線449

http://rehearsalassist.svn.sourceforge.net/viewvc/rehearsalassist/android/trunk/src/urbanstew/RehearsalAssistant/SessionPlayback.java?revision=94&view=markup

我重構我的代碼是相似的,而現在它的工作原理。我希望這會幫助其他人在相同的情況下。

3

RFC 1738 3.10節:

的文件URL的形式:

file://<host>/<path> 

其中主機是 系統的完全限定域名,其路徑是可訪問的,並路徑是分層的 目錄路徑的形式目錄/目錄/.../名稱

所以它是file:/// path/from/root就像http://host/path/from/root因爲在第二個和第三個斜槓之間有一個隱式的'localhost'。但如上所述,使用Uri.FromFile()來構建它。

0

我有相同的症狀。在我的情況,這是因爲我最初保存附件的權限MODE_PRIVATE。只要我將其更改爲MODE_WORLD_READABLE,似乎GMail就能夠訪問該文件並正確發送附件。

See more

4
Intent i = new Intent(Intent.ACTION_SEND); 
    i.setType("message/rfc822"); 
    i.putExtra(Intent.EXTRA_EMAIL , new String[]{"[email protected]"}); 
    i.putExtra(Intent.EXTRA_SUBJECT, "Data from app"); 
    i.putExtra(Intent.EXTRA_TEXT , "experience number x"); 
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

    Uri uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "filename.txt")); 
    i.putExtra(Intent.EXTRA_STREAM, uri); 
    startActivity(Intent.createChooser(i, "Send email...")); 
0
public void sendMail(String path) { 
     Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); 
     emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, 
     new String[] {AppConstant.server_mail}); 
     emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, 
     "IBPS ERROR Mail"); 
     emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, 
     "This is an autogenerated mail from IBPS app"); 
     emailIntent.setType("image/png"); 
     Uri myUri = Uri.parse("file://" + path); 
     emailIntent.putExtra(Intent.EXTRA_STREAM, myUri); 
     startActivity(Intent.createChooser(emailIntent, "Send mail...")); 
     } 
0

另外嘗試添加Intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);這有助於我的問題。

0

我有這個解決方案後4天,請注意以下,同時給予路徑文件中的Android(Java)的類分:

1)使用路徑內部存儲字符串路徑=「/存儲/ sdcard0/myfile.txt的「;

2)path =「/ storage/sdcard1/myfile.txt」;

3)在Manifest文件中提及權限。

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

4)首先檢查文件長度以確認。

5)檢查在ES文件瀏覽器路徑關於sdcard0 & sdcard1被此相同或其他......

例如

File file=new File(path); 
long=file.length();//in Bytes 
0

發送電子郵件帶有附件:(通過文檔)

意圖emailIntent =新意圖(Intent.ACTION_SEND); emailIntent.setType(HTTP.PLAIN_TEXT_TYPE);

emailIntent.putExtra(Intent.EXTRA_EMAIL,new String [] {「[email protected]」});

emailIntent.putExtra(Intent.EXTRA_SUBJECT,「Email subject」); emailIntent.putExtra(Intent.EXTRA_TEXT,「電子郵件消息文本」); emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(「content:// path/to/email/attachment」));

//你也可以通過傳遞尤里斯

相關問題