Java Android Studio mailto Intent不';不显示主题和邮件正文

Java Android Studio mailto Intent不';不显示主题和邮件正文,java,android,email,android-intent,error-handling,Java,Android,Email,Android Intent,Error Handling,我正在尝试从我的Android应用程序发送电子邮件。点击一个按钮,gmail就会打开并显示一封新的邮件,上面有我之前定义的收件人、主题和邮件正文。到目前为止,我已经尝试将Intent.ACTION_视图和Intent.ACTION_发送到。两者都只向收件人显示我的草稿。主题和信息都在被处理。奇怪的是,当使用模拟器时,它工作得很好。还试图锁定android错误日志。好像我没有得到允许。这真的是许可问题还是其他问题? 我真的很感激任何帮助 干杯 这是我的密码: 通过操作视图发送电子邮件 通过A

我正在尝试从我的Android应用程序发送电子邮件。点击一个按钮,gmail就会打开并显示一封新的邮件,上面有我之前定义的收件人、主题和邮件正文。到目前为止,我已经尝试将Intent.ACTION_视图和Intent.ACTION_发送到。两者都只向收件人显示我的草稿。主题和信息都在被处理。奇怪的是,当使用模拟器时,它工作得很好。还试图锁定android错误日志。好像我没有得到允许。这真的是许可问题还是其他问题? 我真的很感激任何帮助 干杯

这是我的密码:

  • 通过操作视图发送电子邮件
  • 通过ACTION_SENDTO发送电子邮件
  • 来自logcat的错误消息
试试这个代码

    val emailIntent = Intent(Intent.ACTION_SEND)
    emailIntent.setType("text/plain")
    emailIntent.putExtra(Intent.EXTRA_EMAIL, arrayOf("jon@example.com")) 
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject")
    emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message text")
    val packageManager = packageManager
    val activities = packageManager.queryIntentActivities(emailIntent, 0)
    val isIntentSafe = activities.size > 0
    if (isIntentSafe) {
        startActivity(emailIntent);
    }else{
        Log.d("MainActivty","Email App not installed");
    }

试试这个代码,它对我有用

Intent intent = new Intent(Intent.ACTION_SENDTO);
            intent.setData(Uri.parse("mailto:")); // only email apps should handle this
            intent.putExtra(Intent.EXTRA_EMAIL, new String[]{email});
            intent.putExtra(Intent.EXTRA_SUBJECT, "Subject here");
            intent.putExtra(Intent.EXTRA_TEXT,"Body Here");
            if (intent.resolveActivity(getPackageManager()) != null) {
                startActivity(intent);
            }
还可以在android清单中添加意图过滤器

<activity ...>
<intent-filter>
    <action android:name="android.intent.action.SENDTO" />
    <data android:scheme="mailto" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>


我想我们也有同样的问题。Android API 29在向其他应用程序发送数据方面引入了一些改进。请参阅此处的更多详细信息:

这是一个适合我的解决方案

Intent selectorIntent = new Intent(Intent.ACTION_SENDTO);
selectorIntent.setData(Uri.parse("mailto:"));

final Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{"address@mail.com"});
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "The subject");
emailIntent.putExtra(Intent.EXTRA_TEXT, "The email body");
emailIntent.setSelector( selectorIntent );

activity.startActivity(Intent.createChooser(emailIntent, "Send email..."));
简单地说,这样你就需要安卓标准应用程序选择器,此外,你还指定要发送电子邮件。因此,电子邮件客户端只会出现。 如果用户只安装了一个电子邮件客户端,则意图将立即重定向到该客户端


希望这对您也有帮助。

我们以前的电子邮件代码几天前就停止工作了

具体如下:

public static void shareTextToEmail(Context context, String[] email, String subject, String text)
    Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:" + TextUtils.join(",", email)));
    emailIntent.putExtra(Intent.EXTRA_EMAIL, email);
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
    emailIntent.putExtra(Intent.EXTRA_TEXT, text);
    try {
        context.startActivity(Intent.createChooser(emailIntent, context.getString(R.string.share_email_title)));
    } catch (android.content.ActivityNotFoundException e) {
        Toast.makeText(context, context.getString(R.string.share_no_intent_handler_found), Toast.LENGTH_SHORT).show();
    }
}
我是根据扎克·安东尼奥的回答采纳的:

public static void shareTextToEmail(Context context, String[] email, String subject, String text)
    Intent selectorIntent = new Intent(Intent.ACTION_SENDTO);
    selectorIntent.setData(Uri.parse("mailto:"));

    final Intent emailIntent = new Intent(Intent.ACTION_SEND);
    emailIntent.putExtra(Intent.EXTRA_EMAIL, email);
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
    emailIntent.putExtra(Intent.EXTRA_TEXT, text);
    emailIntent.setSelector(selectorIntent);

    try {
        context.startActivity(Intent.createChooser(emailIntent, context.getString(R.string.share_email_title)));
    } catch (android.content.ActivityNotFoundException e) {
        Toast.makeText(context, context.getString(R.string.share_no_intent_handler_found), Toast.LENGTH_SHORT).show();
    }
}
重点是:

  • emailIntent中的
    Intent.ACTION\u SENDTO
    替换为
    Intent.ACTION\u SEND
  • Intent.ACTION\u send to
    移动到
    selectorcontent
  • 不要将电子邮件放在意向数据中,只放在
    intent.EXTRA\u EMAIL

    • 为了让它在三星和Pixel设备上运行,我们必须在url和extras上添加参数

      val email = "xxxx@xxxx.com"
      val subject = "xxxx"
      val body = "xxxx"
      
      val selectorIntent = Intent(Intent.ACTION_SENDTO)
      val urlString = "mailto:" + Uri.encode(email) + "?subject=" + Uri.encode(subject) + "&body=" + Uri.encode(body)
      selectorIntent.data = Uri.parse(urlString)
      
      val emailIntent = Intent(Intent.ACTION_SEND)
      emailIntent.putExtra(Intent.EXTRA_EMAIL, arrayOf(email))
      emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject)
      emailIntent.putExtra(Intent.EXTRA_TEXT, body)
      emailIntent.selector = selectorIntent
      
      startActivity(Intent.createChooser(emailIntent, "Send email"))
      

      这个答案对我来说很有用,使用Uri进行解析

      Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:?subject=" + subject + "&to=" + to));
       context.startActivity(emailIntent);
      

      ACTION\u VIEW
      ACTION\u SENDTO
      都不支持
      EXTRA\u SUBJECT
      EXTRA\u TEXT
      。编辑到此集合类型(“文本/普通”)这是什么语言?我试着把它翻译成Java,但我不知道packageManager和activities是什么类型的变量这是Kotlin。packageManager是android.content.pm.packageManager类型的,请您添加一些关于答案的解释好吗?非常感谢,我甚至可以选择使用一个电子邮件客户端作为标准。必须将意图过滤器标记放在服务标记内,并将MainActivity作为名称。所以它看起来是这样的:
      它仍然没有显示主体和主体!最后在Gmail突然停止工作之前,在过去10-11年中,我一直在使用Gmail的代码。这样做才是正确的选择。:)也为我工作。Intent.createChooser是可选的,emailIntent可以直接传递。它的工作非常出色,节省了我几分钟的时间。感谢lotIt,它可以工作,但它要求用户选择“Gmail”,并提供“复制”和“Paypal”选项,这只会导致奇怪或没有behavior@pete这是由于“ACTION_SEND”意图的广泛范围,我同意这对用户来说有点混乱。我还没有尝试过,但我相信你可以在extras中指定MIME数据类型,这将进一步过滤显示的应用列表。我也解决了这个问题,就像你的答案一样。其他答案不太好。这个例子对我仍然不起作用,直到我像其他答案一样将电子邮件“收件人”地址放入一个数组。(我在一个像素上测试,Android 10)。否则,这个示例也很好。@gjj示例中的变量
      email
      String[]
      public static void shareTextToEmail(Context context, String[] email, String subject, String text)
          Intent selectorIntent = new Intent(Intent.ACTION_SENDTO);
          selectorIntent.setData(Uri.parse("mailto:"));
      
          final Intent emailIntent = new Intent(Intent.ACTION_SEND);
          emailIntent.putExtra(Intent.EXTRA_EMAIL, email);
          emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
          emailIntent.putExtra(Intent.EXTRA_TEXT, text);
          emailIntent.setSelector(selectorIntent);
      
          try {
              context.startActivity(Intent.createChooser(emailIntent, context.getString(R.string.share_email_title)));
          } catch (android.content.ActivityNotFoundException e) {
              Toast.makeText(context, context.getString(R.string.share_no_intent_handler_found), Toast.LENGTH_SHORT).show();
          }
      }
      
      val email = "xxxx@xxxx.com"
      val subject = "xxxx"
      val body = "xxxx"
      
      val selectorIntent = Intent(Intent.ACTION_SENDTO)
      val urlString = "mailto:" + Uri.encode(email) + "?subject=" + Uri.encode(subject) + "&body=" + Uri.encode(body)
      selectorIntent.data = Uri.parse(urlString)
      
      val emailIntent = Intent(Intent.ACTION_SEND)
      emailIntent.putExtra(Intent.EXTRA_EMAIL, arrayOf(email))
      emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject)
      emailIntent.putExtra(Intent.EXTRA_TEXT, body)
      emailIntent.selector = selectorIntent
      
      startActivity(Intent.createChooser(emailIntent, "Send email"))
      
      Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:?subject=" + subject + "&to=" + to));
       context.startActivity(emailIntent);