首页 文章

尝试将SD卡中的文件附加到电子邮件中

提问于
浏览
69

我正在尝试启动Intent来发送电子邮件 . 所有这一切都有效,但当我尝试实际发送电子邮件时,会发生一些“奇怪”的事情 .

这是代码

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发布中获得新的权限才能发送带附件的电子邮件?我究竟做错了什么?

13 回答

  • 95

    也得到了同样的问题

    码:

    Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); 
        emailIntent.setType("image/jpeg");
        emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] 
        {"me@gmail.com"}); 
        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/me@gmail.com(null, null)
    D/Gmail   ( 2507):      URI FOUND:file://sdcard/DumbDumpers/DumbDumper.jpg
    

    看起来电子邮件提供商附加了0长度文件 . 当我检查文件系统时,文件就在那里并且正确 . 在尝试通过电子邮件发送之前,创建图像文件的代码已经完成 .

    有人在没有魔术重启的情况下解决了这个问题(我已经试过了)?

    问候,

    Update

    我的道路应该是

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

    你需要额外的 / ,因为它指向根目录,即:

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

    合并为

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

    在上面的代码片段中,您需要:

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

    我希望这有帮助 . 我花了很长时间来调试 .

    问候,
    芬利

  • 0

    只是我身边的一点评论 . 我一直遇到与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));
    

    确实 .

    问候,迈克尔

  • 0

    而不是“Uri.parse”使用“Uri.fromFile(新文件(Environment.getExternalStorageDirectory(),”文件名“))”

    Environment.getExternalStorageDirectory() - SDcard或任何其他外部存储的路径

  • 4

    看来这实际上是正确的,不确定发生了什么,但重启后它开始工作:/

  • 21
    Intent i = new Intent(Intent.ACTION_SEND);
        i.setType("message/rfc822");
        i.putExtra(Intent.EXTRA_EMAIL  , new String[]{"example@mail.com"});
        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

    我遇到了同样的问题,到处寻找解决方案 . 最后,我通过找到一个开箱即用的开源应用程序来解决它,看看他们是如何做到的 . 代码相当长,所以我不会在这里引用它,但发布一个链接 . 查看第449行中的sendEmail函数

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

    我重构了我的代码是相似的,现在它的工作原理 . 我希望这会在同样的情况下帮助其他人 .

  • 4

    RFC 1738第3.10节:

    文件URL采用以下形式:

    file://<host>/<path>
    

    其中host是可以访问路径的系统的完全限定域名,path是表单目录/ directory /.../ name的分层目录路径 .

    所以它的文件:/// path / from / root就像http://host/path/from/root因为在第二个和第三个斜杠之间有's an implicit ' localhost' . 但如上所述,使用Uri.FromFile()来构建它 .

  • 0

    我有同样的症状 . 在我的情况下,这是因为我最初使用权限 MODE_PRIVATE 保存附件 . 一旦我将其更改为 MODE_WORLD_READABLE ,似乎GMail就可以访问该文件并正确发送附件 .

    See more

  • 0

    它对我来说很完美:在这个解决方案中,Nicolas在Cache文件夹中创建了一个副本,这里gmail intent可以访问! http://stephendnicholas.com/archives/974

  • 3
    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..."));
            }
    
  • 3

    还可以尝试添加Intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);这有助于解决我的问题 .

  • 7

    我在4天后得到了解决方案,请注意以下几点,同时给出Android(Java)中File类的路径:

    1)使用内部存储路径String path =“/ storage / 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

    发送附件附件的电子邮件:(按文档)

    Intent emailIntent = new Intent(Intent.ACTION_SEND); emailIntent.setType(HTTP.PLAIN_TEXT_TYPE); emailIntent.putExtra(Intent.EXTRA_EMAIL,new String [] {“jon@example.com”}); emailIntent.putExtra(Intent.EXTRA_SUBJECT,“电子邮件主题”); emailIntent.putExtra(Intent.EXTRA_TEXT,“电子邮件消息文本”); emailIntent.putExtra(Intent.EXTRA_STREAM,Uri.parse( “内容://路径/到/电子邮件/附件”));

    //您还可以通过传递Uris的ArrayList来附加多个项目

相关问题