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)
我只是試過你的代碼,它在我的android上工作,也許這是一個特定的設備問題?嘗試使用不同的設備 – Chen
不幸的是,我沒有其他設備。我正在使用Android 5.1的Moto E(第二代) 我確實發現我對setMimeType()的調用是錯誤的。它需要setAttachmentMimeType(),但這並沒有解決任何問題。 這非常令人沮喪。我使用的是以前在我的手機上工作的代碼,可以在其他人的手機上工作,但沒有人可以重現該問題以解決問題。 – MiguelMunoz