2016-05-13 27 views
1

Message.setAttachment()方法的javadoc會說「設置消息附件(如果存在)」,這意味着如果文件不存在,它將以靜默方式失敗。Message.setAttachment默默無效

我的代碼中的if()語句確保Message.setAttachment()不會被調用,除非該文件存在。但電子郵件到達,所以我知道該文件存在,setAttachment被調用。我也知道這是15823字節長,因爲電子郵件告訴我這一點。但沒有附加任何東西。兩個月前,這工作得很好。難道我做錯了什麼?或者這是setAttachment()方法中的一個新bug?

String imageFile = appHomePath + baseName; 
try (OutputStream os = FileSystemStorage.getInstance().openOutputStream(imageFile)) { 
    ImageIO.getImageIO().save(screenShot, os, ImageIO.FORMAT_PNG, 1); 
} 
if (FileSystemStorage.getInstance().exists(imageFile)) { 
    long size = FileSystemStorage.getInstance().getLength(imageFile); 
    Message emailMessage = new Message(imageFile + "\n\n" + size + " bytes\n" + notes); 
    emailMessage.setAttachment(imageFile); 
    // emailMessage.setAttachment("file://" + imageFile); // Didn't work either 
    emailMessage.setMimeType("image/png"); 
    String[] recipients = {"[email protected]"}; 
    Message.sendMessage(recipients, "Snap", emailMessage); 
} else { 
    Dialog.show("Missing file", "Missing: "+imageFile, Dialog.TYPE_ERROR, null, "OK", null); 
} 

附錄: 這裏有一個對堆棧的痕跡是我得到:(我要指出,我不明白爲什麼FileNotFoundException異常給這不是我指定什麼路徑我指定的路徑記錄在下面的第二行,作爲圖像文件路徑:)

D/EmailAttachmentTest(12124): [EDT] 0:0:13,592 - appHomePath: /data/data/com.mycompany.myapp/files/ 
D/EmailAttachmentTest(12124): [EDT] 0:0:13,614 - image file path: /data/data/com.mycompany.myapp/files/snapshot19.png 
D/EmailAttachmentTest(12124): [EDT] 0:0:13,852 - Attachments: 1 
D/EmailAttachmentTest(12124): [EDT] 0:0:13,853 - Attachment: /data/data/com.mycompany.myapp/files/snapshot19.png maps to image/png 
W/ResourceType(12124): No package identifier when getting value for resource number 0x00000000 
W/ResourceType(12124): No package identifier when getting value for resource number 0x00000000 
W/ResourceType(12124): No package identifier when getting value for resource number 0x00000000 
W/ResourceType(12124): No package identifier when getting value for resource number 0x00000000 
W/ResourceType(12124): No package identifier when getting value for resource number 0x00000000 
E/AndroidImplementation(12124): null 
E/AndroidImplementation(12124): java.io.FileNotFoundException: /storage/emulated/legacy/tmp/snapshot19.png: open failed: EACCES (Permission denied) 
E/AndroidImplementation(12124):  at libcore.io.IoBridge.open(IoBridge.java:456) 
E/AndroidImplementation(12124):  at java.io.FileOutputStream.<init>(FileOutputStream.java:87) 
E/AndroidImplementation(12124):  at java.io.FileOutputStream.<init>(FileOutputStream.java:127) 
E/AndroidImplementation(12124):  at java.io.FileOutputStream.<init>(FileOutputStream.java:116) 
E/AndroidImplementation(12124):  at com.codename1.impl.android.AndroidImplementation.createFileOuputStream(AndroidImplementation.java:4380) 
E/AndroidImplementation(12124):  at com.codename1.impl.android.AndroidImplementation.openFileOutputStream(AndroidImplementation.java:4301) 
E/AndroidImplementation(12124):  at com.codename1.io.FileSystemStorage.openOutputStream(FileSystemStorage.java:274) 
E/AndroidImplementation(12124):  at com.codename1.impl.android.AndroidImplementation.fixAttachmentPath(AndroidImplementation.java:4485) 
E/AndroidImplementation(12124):  at com.codename1.impl.android.AndroidImplementation.sendMessage(AndroidImplementation.java:4537) 
E/AndroidImplementation(12124):  at com.codename1.ui.Display.sendMessage(Display.java:3252) 
E/AndroidImplementation(12124):  at com.codename1.messaging.Message.sendMessage(Message.java:159) 
E/AndroidImplementation(12124):  at com.mycompany.myapp.EmailAttachmentTest$MainForm.saveSnapshot(EmailAttachmentTest.java:249) 
E/AndroidImplementation(12124):  at com.mycompany.myapp.EmailAttachmentTest$MainForm.dumpScreen(EmailAttachmentTest.java:206) 
E/AndroidImplementation(12124):  at com.mycompany.myapp.EmailAttachmentTest$MainForm.lambda$new$0(EmailAttachmentTest.java:93) 
E/AndroidImplementation(12124):  at com.mycompany.myapp.EmailAttachmentTest$MainForm.access$lambda$1(EmailAttachmentTest.java) 
E/AndroidImplementation(12124):  at com.mycompany.myapp.EmailAttachmentTest$MainForm$$Lambda$2.actionPerformed(Unknown Source) 
E/AndroidImplementation(12124):  at com.codename1.ui.util.EventDispatcher.fireActionEvent(EventDispatcher.java:349) 
E/AndroidImplementation(12124):  at com.codename1.ui.Button.fireActionEvent(Button.java:411) 
E/AndroidImplementation(12124):  at com.codename1.ui.Button.released(Button.java:442) 
E/AndroidImplementation(12124):  at com.codename1.ui.Button.pointerReleased(Button.java:530) 
E/AndroidImplementation(12124):  at com.codename1.ui.Form.pointerReleased(Form.java:2620) 
E/AndroidImplementation(12124):  at com.codename1.ui.Form.pointerReleased(Form.java:2556) 
E/AndroidImplementation(12124):  at com.codename1.ui.Component.pointerReleased(Component.java:3147) 
E/AndroidImplementation(12124):  at com.codename1.ui.Display.handleEvent(Display.java:2024) 
E/AndroidImplementation(12124):  at com.codename1.ui.Display.edtLoopImpl(Display.java:1066) 
E/AndroidImplementation(12124):  at com.codename1.ui.Display.mainEDTLoop(Display.java:995) 
E/AndroidImplementation(12124):  at com.codename1.ui.RunnableWrapper.run(RunnableWrapper.java:120) 
E/AndroidImplementation(12124):  at com.codename1.impl.CodenameOneThread$1.run(CodenameOneThread.java:60) 
E/AndroidImplementation(12124):  at java.lang.Thread.run(Thread.java:818) 
E/AndroidImplementation(12124): Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied) 
E/AndroidImplementation(12124):  at libcore.io.Posix.open(Native Method) 
E/AndroidImplementation(12124):  at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) 
E/AndroidImplementation(12124):  at libcore.io.IoBridge.open(IoBridge.java:442) 
E/AndroidImplementation(12124):  ... 28 more 
W/Bundle (12124): Key android.intent.extra.TEXT expected ArrayList<CharSequence> but value was a java.lang.String. The default value <null> was returned. 
W/Bundle (12124): Attempt to cast generated internal exception: 
W/Bundle (12124): java.lang.ClassCastException: java.lang.String cannot be cast to java.util.ArrayList 
W/Bundle (12124): at android.os.BaseBundle.getCharSequenceArrayList(BaseBundle.java:1060) 
W/Bundle (12124): at android.os.Bundle.getCharSequenceArrayList(Bundle.java:884) 
W/Bundle (12124): at android.content.Intent.getCharSequenceArrayListExtra(Intent.java:5182) 
W/Bundle (12124): at android.content.Intent.migrateExtraStreamToClipData(Intent.java:7865) 
W/Bundle (12124): at android.content.Intent.migrateExtraStreamToClipData(Intent.java:7828) 
W/Bundle (12124): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1561) 
W/Bundle (12124): at android.app.Activity.startActivityForResult(Activity.java:3755) 
W/Bundle (12124): at android.app.Activity.startActivityForResult(Activity.java:3716) 
W/Bundle (12124): at com.codename1.impl.android.CodenameOneActivity.startActivityForResult(CodenameOneActivity.java:541) 
W/Bundle (12124): at com.codename1.impl.android.AndroidNativeUtil.startActivityForResult(AndroidNativeUtil.java:140) 
W/Bundle (12124): at com.codename1.impl.android.AndroidImplementation.sendMessage(AndroidImplementation.java:4566) 
W/Bundle (12124): at com.codename1.ui.Display.sendMessage(Display.java:3252) 
W/Bundle (12124): at com.codename1.messaging.Message.sendMessage(Message.java:159) 
W/Bundle (12124): at com.mycompany.myapp.EmailAttachmentTest$MainForm.saveSnapshot(EmailAttachmentTest.java:249) 
W/Bundle (12124): at com.mycompany.myapp.EmailAttachmentTest$MainForm.dumpScreen(EmailAttachmentTest.java:206) 
W/Bundle (12124): at com.mycompany.myapp.EmailAttachmentTest$MainForm.lambda$new$0(EmailAttachmentTest.java:93) 
W/Bundle (12124): at com.mycompany.myapp.EmailAttachmentTest$MainForm.access$lambda$1(EmailAttachmentTest.java) 
W/Bundle (12124): at com.mycompany.myapp.EmailAttachmentTest$MainForm$$Lambda$2.actionPerformed(Unknown Source) 
W/Bundle (12124): at com.codename1.ui.util.EventDispatcher.fireActionEvent(EventDispatcher.java:349) 
W/Bundle (12124): at com.codename1.ui.Button.fireActionEvent(Button.java:411) 
W/Bundle (12124): at com.codename1.ui.Button.released(Button.java:442) 
W/Bundle (12124): at com.codename1.ui.Button.pointerReleased(Button.java:530) 
W/Bundle (12124): at com.codename1.ui.Form.pointerReleased(Form.java:2620) 
W/Bundle (12124): at com.codename1.ui.Form.pointerReleased(Form.java:2556) 
W/Bundle (12124): at com.codename1.ui.Component.pointerReleased(Component.java:3147) 
W/Bundle (12124): at com.codename1.ui.Display.handleEvent(Display.java:2024) 
W/Bundle (12124): at com.codename1.ui.Display.edtLoopImpl(Display.java:1066) 
W/Bundle (12124): at com.codename1.ui.Display.mainEDTLoop(Display.java:995) 
W/Bundle (12124): at com.codename1.ui.RunnableWrapper.run(RunnableWrapper.java:120) 
W/Bundle (12124): at com.codename1.impl.CodenameOneThread$1.run(CodenameOneThread.java:60) 
W/Bundle (12124): at java.lang.Thread.run(Thread.java:818) 
+0

我只是試過你的代碼,它在我的android上工作,也許這是一個特定的設備問題?嘗試使用不同的設備 – Chen

+0

不幸的是,我沒有其他設備。我正在使用Android 5.1的Moto E(第二代) 我確實發現我對setMimeType()的調用是錯誤的。它需要setAttachmentMimeType(),但這並沒有解決任何問題。 這非常令人沮喪。我使用的是以前在我的手機上工作的代碼,可以在其他人的手機上工作,但沒有人可以重現該問題以解決問題。 – MiguelMunoz

回答

0

在哪個操作系統上?

如果這是在Android上,那麼它對文件的位置非常敏感,我建議您始終將它放在實際的應用程序主目錄中,而不是其他地方。

由於我們產生了一個發送消息的外部進程,我們並不真正知道出了什麼問題,因爲在某些操作系統中沒有來自進程的錯誤響應。

+0

這是在Android上,因此該文件位於實際的應用程序主目錄中。我應該提到,我不確定參數是否應該只是文件的路徑。該參數被聲明爲一個字符串,但它被稱爲fileUri而不是pathToFile。它需要一個協議嗎?這裏是一個示例路徑:/data/data/com.mycompany.myapp/files/snapshot-May-17--2016-2.59.13.13-AM.png 我這樣做了一個月前,它工作正常。 – MiguelMunoz

+0

它應該位於從getAppHome返回的路徑中。原因是由於安全限制,郵件應用程序無法在物理上看到您的文件。因此,我們會自動檢測文件在應用程序主頁中的這種特殊情況,並將文件傳輸到一個公共位置。 –

+0

它位於從getAppHomePath()返回的路徑上。你確定這仍然適用於Android?上個月它爲我工作,現在它不再工作了。我沒有做任何不同的事情。 – MiguelMunoz