发送带附件的电子邮件时出错

时间:2011-12-28 06:16:30

标签: android

我遇到一个问题,我想发送带有图片附件的电子邮件,但是从弹出菜单中选择Gmail选项时,它总是会返回错误。我没有找到同样背后的原因。请建议我正确的解决方案。

代码:

Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Halosys Greetings");
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT,"");
emailIntent.putExtra(Intent.EXTRA_STREAM, bm);
emailIntent.setType("image/png");
startActivity(Intent.createChooser(emailIntent, "Send mail..."));

错误堆栈:

12-28 11:42:37.456: ERROR/AndroidRuntime(21930): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.google.android.gm/com.google.android.gm.ComposeActivity}: java.lang.NullPointerException
12-28 11:42:37.456: ERROR/AndroidRuntime(21930):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
12-28 11:42:37.456: ERROR/AndroidRuntime(21930):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
12-28 11:42:37.456: ERROR/AndroidRuntime(21930):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
12-28 11:42:37.456: ERROR/AndroidRuntime(21930):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
12-28 11:42:37.456: ERROR/AndroidRuntime(21930):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-28 11:42:37.456: ERROR/AndroidRuntime(21930):     at android.os.Looper.loop(Looper.java:123)
12-28 11:42:37.456: ERROR/AndroidRuntime(21930):     at android.app.ActivityThread.main(ActivityThread.java:4627)
12-28 11:42:37.456: ERROR/AndroidRuntime(21930):     at java.lang.reflect.Method.invokeNative(Native Method)
12-28 11:42:37.456: ERROR/AndroidRuntime(21930):     at java.lang.reflect.Method.invoke(Method.java:521)
12-28 11:42:37.456: ERROR/AndroidRuntime(21930):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
12-28 11:42:37.456: ERROR/AndroidRuntime(21930):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
12-28 11:42:37.456: ERROR/AndroidRuntime(21930):     at dalvik.system.NativeStart.main(Native Method)
12-28 11:42:37.456: ERROR/AndroidRuntime(21930): Caused by: java.lang.NullPointerException
12-28 11:42:37.456: ERROR/AndroidRuntime(21930):     at com.google.android.gm.provider.Gmail$AttachmentOrigin.localFileExtras(Gmail.java:2194)
12-28 11:42:37.456: ERROR/AndroidRuntime(21930):     at com.google.android.gm.ComposeArea.addAttachment(ComposeArea.java:732)
12-28 11:42:37.456: ERROR/AndroidRuntime(21930):     at com.google.android.gm.ComposeArea.initFromExtras(ComposeArea.java:685)
12-28 11:42:37.456: ERROR/AndroidRuntime(21930):     at com.google.android.gm.ComposeActivity.initFromExtras(ComposeActivity.java:1482)
12-28 11:42:37.456: ERROR/AndroidRuntime(21930):     at com.google.android.gm.ComposeActivity.finishOnCreateAfterAccountSelected(ComposeActivity.java:1021)
12-28 11:42:37.456: ERROR/AndroidRuntime(21930):     at com.google.android.gm.ComposeActivity.onCreate(ComposeActivity.java:259)
12-28 11:42:37.456: ERROR/AndroidRuntime(21930):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
12-28 11:42:37.456: ERROR/AndroidRuntime(21930):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
12-28 11:42:37.456: ERROR/AndroidRuntime(21930):     ... 11 more

提前致谢。

3 个答案:

答案 0 :(得分:3)

不知道你如何发送它,但这段代码工作正常。

public void doSendFile() {
    String fileName = "myFileName.txt";

    String externalStorageDirectory = Environment
        .getExternalStorageDirectory().toString();
    String myDir = externalStorageDirectory + "/myDir/";  // the file will be in myDir
    Uri uri = Uri.parse("file://" + myDir + fileName);
    Intent i = new Intent(Intent.ACTION_SEND);
    try {
        myFileHandle.close(); // you may want to be sure that the file is closed correctly
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    i.setType("text/plain"); // as you can see I am sending a simple txt file here
    i.putExtra(Intent.EXTRA_EMAIL, new String[] { "sendTo@gmail.com" });
    i.putExtra(Intent.EXTRA_SUBJECT, "the subject text");
    i.putExtra(Intent.EXTRA_TEXT, "extra text body");
    Log.i(getClass().getSimpleName(), "logFile=" + uri);
    i.putExtra(Intent.EXTRA_STREAM, uri);

    try {
        startActivity(Intent.createChooser(i, "Send mail..."));
    } catch (android.content.ActivityNotFoundException ex) {
        Toast.makeText(getBaseContext(),
            "There are no email clients installed.", Toast.LENGTH_SHORT)
                .show();
    }
}

也确定你有

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
在您的清单中

,这样您就可以在外部商店中实际创建文件。

P.S。我从未设法直接从内部存储发送文件。

答案 1 :(得分:2)

使用此代码..

Intent i = new Intent(Intent.ACTION_SEND);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setType("image/jpg");
i.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:///sdcard/Pictures/image.jpg")); // Path to your image in sdcard.
startActivity(i);

答案 2 :(得分:2)

我遇到了同样的问题,发现我以错误的方式使用了Intent.EXTRA_STREAM。

我通过使用类似的东西来解决它:

i.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:///sdcard/Pictures/image.jpg"));

这解决了这个问题。