【问题标题】:Attachment is not coming in mail programmatically附件未以编程方式发送到邮件中
【发布时间】:2015-09-24 13:39:30
【问题描述】:

我正在用代码将 TEXT 文件附加到电子邮件:

Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto",
                                    "abc@gmail.com", null));

    emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Report");

    emailIntent.putExtra(Intent.EXTRA_TEXT, prepareBodyMail());
    File root = Environment.getExternalStorageDirectory();
    File file = new File(root, "/MyFolder/report.txt");

    Uri uri = Uri.fromFile(file);
    emailIntent.putExtra(Intent.EXTRA_STREAM, uri);
    startActivity(Intent.createChooser(emailIntent, "Pick an Email provider"));

此代码与 Gmail、电子邮件 和其他应用程序完美配合

但这不是通过 Google 的INBOX 应用程序附加文件

只有身体和主体来了,没有任何依恋

我已通过Inbox Problem 向 Google 网上论坛报告此问题

任何人都可以帮助我在代码中缺少什么吗?

【问题讨论】:

  • 嘿,您解决了问题还是仍在搜索。请尝试我提供的解决方案希望这对你有用
  • 我仍在寻找解决方案。我也已向 Google 群组报告了该问题。希望能得到解决。
  • 对我来说同样的问题,无法在任何地方找到解决方案。
  • 遇到同样的问题 :(
  • @Kushal 你找到解决方案了吗?

标签: android android-intent google-inbox


【解决方案1】:
String fileLocation = Environment.getExternalStorageDirectory() + "/MyFolder/report.txt";    
String to[] = {"abc@gmail.com"};

Intent intentEmail = new Intent(Intent.ACTION_SEND);
intentEmail.setType("vnd.android.cursor.dir/email");
intentEmail.putExtra(Intent.EXTRA_EMAIL, to);
intentEmail.putExtra(Intent.EXTRA_STREAM, fileLocation);
intentEmail.putExtra(Intent.EXTRA_SUBJECT, "Subject");

startActivity(Intent.createChooser(intentEmail , "Pick an Email provider"));

【讨论】:

  • 这也不适用于 Inbox 应用程序。我认为我们应该在意图中提供 Uri 类型参数 wirh Intent.EXTRA_STREAM kay 。这是您代码中的问题
【解决方案2】:

试试这个

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

【讨论】:

    【解决方案3】:
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType("text/plain");
    intent.putExtra(Intent.EXTRA_EMAIL, new String[] {"email@example.com"});
    intent.putExtra(Intent.EXTRA_SUBJECT, "subject here");
    intent.putExtra(Intent.EXTRA_TEXT, "body text");
    File root = Environment.getExternalStorageDirectory();
    File file = new File(root, xmlFilename);
    if (!file.exists() || !file.canRead()) {
        Toast.makeText(this, "Attachment Error", Toast.LENGTH_SHORT).show();
        finish();
        return;
    }
    Uri uri = Uri.fromFile("file://" + file);
    intent.putExtra(Intent.EXTRA_STREAM, uri);
    startActivity(Intent.createChooser(intent, "Send email..."));
    

    【讨论】:

    • 这适用于 Gmail、电子邮件应用程序,但不适用于 Inbox 应用程序..
    • 我已经提到我的代码适用于 Gmail 和电子邮件,但不适用于收件箱..
    【解决方案4】:
      public void sendMailWithIntent(String emailTo,
                                       String subject, String emailText, List<String> filePaths) {
            try {
                //need to "send multiple" to get more than one attachment
                final Intent emailIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
                emailIntent.setType("text/plain");
                emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL,
                        Util.extractEmails(emailTo));
    //            emailIntent.putExtra(android.content.Intent.EXTRA_CC,
    //                    new String[]{emailCC});
                emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
                emailIntent.putExtra(Intent.EXTRA_TEXT, emailText);
                ArrayList<Uri> uris = new ArrayList<Uri>();
                //has to be an ArrayList
                if (filePaths != null) {
                    //convert from paths to Android friendly Parcelable Uri's
                    for (String file : filePaths) {
                        File fileIn = new File(file);
                        Uri u = Uri.fromFile(fileIn);
                        uris.add(u);
                    }
                }
                emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
                Intent chooser = Intent.createChooser(emailIntent, "Send mail...");
                activity.startActivityForResult(chooser, 1);
            } catch (Exception e) {
                new ShowToast(context, e.getMessage());
            }
    
        }
    

    调用方法

        List<String> list = new ArrayList<>();
        list.add(TO_ATTACH_ONE);
        list.add(TO_ATTACH_TWO);
        sendMailWithIntent(toAddresses, subject, body, list);
    

    【讨论】:

      【解决方案5】:

      ACTION_SENDTO 好像官方不支持附件。它仅适用于 Gmail 和默认电子邮件客户端,因为它们使用“未记录”功能。我发现发送带有附件的电子邮件的唯一方法是使用 ACTION_SEND。

      我的解决方案:

      public class EmailSender {
      
      private static final String INTENT_DATA_SCHEME_EMAIL = "mailto:";
      private static final String FILE_PROVIDER_AUTHORIZER = "com.smartinhalerlive.app.fileprovider";
      
      private String subject;
      private String body;
      private File attachment;
      
      public EmailSender(String subject, String body, File attachment) {
          this.subject = subject;
          this.body = body;
          this.attachment = attachment;
      }
      
      public void sendEmail(Context context, EmailSenderListener listener) {
          List<ResolveInfo> emailClients = getEmailClients(context);
      
          if (null != emailClients) {
              ResolveInfo defaultEmailClient = getDefaultEmailClient(emailClients);
      
              if (null != defaultEmailClient) {
                  sendEmailUsingSelectedEmailClient(context, defaultEmailClient, listener);
              } else {
                  showSelectEmailClientsDialog(context, emailClients, listener);
              }
          }
      }
      
      private void showSelectEmailClientsDialog(Context context,
                                                List<ResolveInfo> emailClients,
                                                EmailSenderListener listener) {
          String[] emailClientNames = getEmailClientNames(context, emailClients);
      
          AlertDialog.Builder builder = new AlertDialog.Builder(context);
          builder.setTitle(R.string.email_dialog_title);
          builder.setItems(emailClientNames, (dialog, which) -> {
                      sendEmailUsingSelectedEmailClient(context, emailClients.get(which), listener);
                  }
              );
      
          builder.create().show();
      }
      
      @NonNull
      private static String[] getEmailClientNames(Context context, List<ResolveInfo> emailClients) {
          PackageManager packageManager = context.getPackageManager();
          String[] emailClientNames = new String[emailClients.size()];
          for (int i = 0; i < emailClients.size(); i++) {
              emailClientNames[i] = emailClients.get(i).activityInfo.applicationInfo.loadLabel(packageManager).toString();
          }
          return emailClientNames;
      }
      
      @Nullable
      private static ResolveInfo getDefaultEmailClient(List<ResolveInfo> emailClients) {
          ResolveInfo defaultEmailClient = null;
          if (emailClients.size() == 1) {
              defaultEmailClient = emailClients.get(0);
          } else {
              for (ResolveInfo emailClient : emailClients) {
                  if (emailClient.isDefault) {
                      defaultEmailClient = emailClient;
                      break;
                  }
              }
          }
          return defaultEmailClient;
      }
      
      private static List<ResolveInfo> getEmailClients(Context context) {
          PackageManager pm = context.getPackageManager();
          Intent emailDummyIntent = getEmptyEmailIntent();
          return pm.queryIntentActivities(emailDummyIntent, 0);
      }
      
      public static Intent getEmptyEmailIntent() {
          Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
          emailIntent.setData(Uri.parse(INTENT_DATA_SCHEME_EMAIL));
          return emailIntent;
      }
      
      private static void grantReadPermissionForAttachmentUri(Context context,
                                                              Intent emailIntent,
                                                              Uri attachmentUri) {
          if (emailIntent == null || attachmentUri == null) {
              return;
          }
          context.grantUriPermission(emailIntent.getComponent().getPackageName(),
                  attachmentUri,
                  Intent.FLAG_GRANT_READ_URI_PERMISSION);
      }
      
      private void sendEmailUsingSelectedEmailClient(Context context,
                                                     ResolveInfo emailClient,
                                                     EmailSenderListener listener) {
          try {
              Intent emailIntent = new Intent(Intent.ACTION_SEND);
      
              emailIntent.putExtra(Intent.EXTRA_SUBJECT, null != subject ? subject : "");
              emailIntent.putExtra(Intent.EXTRA_TEXT, null != body ? body : "");
              emailIntent.setComponent(new ComponentName(emailClient.activityInfo.packageName, emailClient.activityInfo.name));
              addAttachment(context, attachment, emailIntent);
      
              listener.onEmailIntentReady(emailIntent);
          } catch (Exception ex) {
              Timber.e("Error sending email", ex);
          }
      }
      
      private static void addAttachment(Context context, File attachment, Intent emailIntent) {
          if (attachment != null) {
              Uri contentUri = FileProvider.getUriForFile(context, FILE_PROVIDER_AUTHORIZER, attachment);
              grantReadPermissionForAttachmentUri(context, emailIntent, contentUri);
              emailIntent.putExtra(Intent.EXTRA_STREAM, contentUri);
          }
      }
      
      public interface EmailSenderListener {
          void onEmailIntentReady(Intent emailIntent);
      }
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-18
        • 1970-01-01
        相关资源
        最近更新 更多