【问题标题】:Sending Email with attachment from Asset folder从资产文件夹发送带有附件的电子邮件
【发布时间】:2015-07-26 23:32:10
【问题描述】:
    //EMAIL SENDING CODE  FROM ASSET FOLDER
    email = editTextEmail.getText().toString();
    subject = editTextSubject.getText().toString();
    message = editTextMessage.getText().toString();
    final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
    emailIntent.setType("file/html");
    emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://com.example.deepa.xmlparsing/file:///android_assets/Combination-1.html"));
    startActivity(Intent.createChooser(emailIntent, "Send email using"));

最后,我从资产文件夹 (Combination-1.html) 中获取文件。

越来越多了

找不到运行时错误文件异常。

还有其他方式发送文件附件吗?

【问题讨论】:

  • openAssetFile(Uri uri, 。请告诉 uri.getPath() 的值。还有 uri.getLastPathSegment()。
  • "file/html"。你的意思是“文本/html”。
  • My AssetFileDescriptor.java class file:。不,您的自定义内容提供程序类。您也可以在主题中提到尝试使用自定义内容提供程序从资产发送 html 文件。请提供更多信息。
  • @Ramesh Sambu - 请阅读帖子:How to copy files from assets folder to sdcard?。将资产保存到外部存储后,继续下面我的帖子以将其作为附件发送。

标签: android email email-attachments


【解决方案1】:

发送电子邮件的最简单方法是创建 ACTION_SEND 类型的 Intent:

Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_SUBJECT, "Test");
intent.putExtra(Intent.EXTRA_EMAIL, new String[]{recipient_address});
intent.putExtra(Intent.EXTRA_TEXT, "Attachment test");

要附加单个文件,请在 Intent 中添加一些扩展数据:

intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File("/path/to/file")));
intent.setType("text/html");

或者使用 Html.fromHtml() 构建 html 内容:

intent.putExtra( Intent.EXTRA_TEXT,
                 Html.fromHtml(new StringBuilder()
                 .append("<h1>Heading 1</h1>")
                 .append("<p><a>http://www.google.com</a></p>")
                 .toString()));

对于多个附件:

Intent intent = new Intent(Intent.ACTION_SEND_MULTIPLE);
intent.setType("text/html");
intent.putExtra(Intent.EXTRA_SUBJECT, "Test multiple");
intent.putExtra(Intent.EXTRA_TEXT, "multiple attachments");
intent.putExtra(Intent.EXTRA_EMAIL, new String[]{recipient_address});
ArrayList<Uri> uris = new ArrayList<Uri>();
uris.add(Uri.fromFile(new File("/path/to/first/file")));
uris.add(Uri.fromFile(new File("/path/to/second/file")));
intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);

以调用 startActivity() 传递意图结束。

【讨论】:

    【解决方案2】:

    为您的资产文件夹文件创建一个 File 对象,并将此对象附加到您的电子邮件 Intent。

    正如您的问题 runtime error file not found exception 中所述,这可能是导致 URL "file:///android_asset/" 不指向特定的目录,它仅被 WebView 用于寻址资产。拉了from

    您可以将其作为输入流打开并将此InputStream 转换为File

    in = new BufferedReader(new InputStreamReader(activity.getAssets().open(myfile.pdf))); 
    

    通过电子邮件发送此文件对象,如下所示。

    Intent intent = new Intent(Intent.ACTION_SEND ,Uri.parse("mailto:")); 
    intent.setType("text/plain");
    intent.putExtra(Intent.EXTRA_SUBJECT, "Card Set ");
    intent.putExtra(Intent.EXTRA_TEXT, "");
    intent.putExtra(Intent.EXTRA_STREAM,Uri.fromFile(file));
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    activity.startActivity(intent);
    

    Intent.ACTION_SEND 用于发送电子邮件,Intent.EXTRA_STREAM 用于电子邮件附件。您可以有多个Intent.EXTRA_STREAMin 单一意图以使用intent.setAction(Intent.ACTION_SEND_MULTIPLE); 引用多个附件。

    intent.setType(String mimeType) 输入参数表示您希望从触发意图(此处为意图实例)返回的 MIME 类型数据。其中 setype 可以是

    image/jpeg
    audio/mpeg4-generic
    text/html
    audio/mpeg
    audio/aac
    audio/wav
    audio/ogg
    audio/midi
    audio/x-ms-wma
    video/mp4
    video/x-msvideo
    video/x-ms-wmv
    image/png
    image/jpeg
    image/gif
    .xml ->text/xml
    .txt -> text/plain
    .cfg -> text/plain
    .csv -> text/plain
    .conf -> text/plain
    .rc -> text/plain
    .htm -> text/html
    .html -> text/html
    .pdf -> application/pdf
    .apk -> application/vnd.android.package-archive
    

    【讨论】:

      【解决方案3】:

      您可以使用以下代码来实现您的目标,并且可以根据您的要求更改硬编码字符串。

      String filename="contacts_sid.vcf"; 
      File filelocation = new 
      File(Environment.getExternalStorageDirectory().getAbsolutePath(), filename);
      Uri path = Uri.fromFile(filelocation); 
      Intent emailIntent = new Intent(Intent.ACTION_SEND);
      // Here you can set the type to 'email'
      emailIntent .setType("abc.xyz.cursor.dir/email");
      String to[] = {"android@gmail.com"};
      emailIntent .putExtra(Intent.EXTRA_EMAIL, to);
      //  For the attachment
      emailIntent .putExtra(Intent.EXTRA_STREAM, path);
      // the mail subject
      emailIntent .putExtra(Intent.EXTRA_SUBJECT, "Find Attachments with email");
      startActivity(Intent.createChooser(emailIntent , "Sending  email..."));
      

      【讨论】:

        【解决方案4】:

        您不能在没有 ContentProvider 的情况下将 Asset 文件夹文件共享给其他应用程序。您可以发送每个应用程序都可以访问的文件。比如内置手机内存或 sd 卡中的某些文件。

        分享资产Check This Answer of @CommonsWare

        或者 阅读您的文本文件并使用@RonTLV 回答和邮件。

        或者 在内部内存中复制文件并添加到发送启动。 希望这个答案会有所帮助。

        【讨论】:

          猜你喜欢
          • 2012-06-15
          • 2015-09-09
          • 2017-09-06
          • 1970-01-01
          • 2018-07-24
          • 1970-01-01
          相关资源
          最近更新 更多