如何正确实现电子邮件意图

Posted

技术标签:

【中文标题】如何正确实现电子邮件意图【英文标题】:How to implement email intent correctly 【发布时间】:2018-01-05 12:49:25 【问题描述】:

我搜索了堆栈溢出和google documentation 的电子邮件意图,发现该代码是转到代码: 但是,每次我在活动中单击“提交”时,我都会选择 gmail。它在 gmail 中打开一封新电子邮件,但它只输入收件人地址。缺少主题和文本(姓名、电子邮件地址和反馈文本)。

public void composeEmail(String[] addresses, String subject) 
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setData(Uri.parse("mailto:")); // only email apps should handle this
    intent.putExtra(Intent.EXTRA_EMAIL, addresses);
    intent.putExtra(Intent.EXTRA_SUBJECT, subject);
    if (intent.resolveActivity(getPackageManager()) != null) 
        startActivity(intent);
    

我将其实现为以下代码。如果没有安装应用程序,else 之后的所有内容都会弹出一个 AlertDialog。

public class EmailActivity extends AppCompatActivity 

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);

    setContentView(R.layout.acitvity_email);

    final EditText nameField = (EditText) findViewById(R.id.editTextName);
    final EditText addressField = (EditText) findViewById(R.id.editTextEmail);
    final EditText subjectField = (EditText) findViewById(R.id.editTextSubject);
    final EditText feedbackField = (EditText) findViewById(R.id.editTextFeedback);
    final Button submitFeedback = (Button) findViewById(R.id.buttonSubmitFeedback);

    final String name = nameField.getText().toString();
    final String address = addressField.getText().toString();
    final String subject = subjectField.getText().toString();
    final String feedback = feedbackField.getText().toString().concat(name).concat(address);

    submitFeedback.setOnClickListener(new View.OnClickListener()
        @Override
        public void onClick(View v) 
            composeFeedback(subject, feedback);
        
    );


public void composeFeedback(String subject, String feedback)
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setData(Uri.parse("mailto:" + "mydeveloperemail@gmail.com"));
    intent.putExtra(Intent.EXTRA_TEXT,feedback);
    intent.putExtra(Intent.EXTRA_SUBJECT, subject);

    if (intent.resolveActivity(getPackageManager()) != null) 
        startActivity(intent);
     else 
        final Drawable fail = getResources().getDrawable(R.drawable.ic_fail);
        AlertDialog.Builder builder = new AlertDialog.Builder(EmailActivity.this);
        builder.setTitle("Fehler");
        builder.setIcon(fail);
        builder.setMessage("Keine Email App verfügbar!");
        builder.setCancelable(false);
        builder.setNeutralButton("Okay", new DialogInterface.OnClickListener()
            @Override
            public void onClick(DialogInterface dialog, int which) 
                dialog.cancel();
            
        );
        AlertDialog alert = builder.create();
        alert.show();
    

编辑:@CommonsWare 在他的回答中指出,删除了意图过滤器

【问题讨论】:

【参考方案1】:

ACTION_SENDTO 是 not required to use any extras。把你的数据放到mailto:Uri,the way a Web page would。

android 清单中,我向 activtiy 声明了一个意图过滤器

除非正在编写电子邮件应用程序,例如 Gmail,否则此 <intent-filter> 对用户来说既不必要又有害。

【讨论】:

所以那里的文档有点错误,因为代码示例表明我应该将 putExtra 与 ACTION_SENDTO 一起使用? @M.Mungenast:是的,这些额外内容是为ACTION_SEND 和在较小程度上为ACTION_SEND_MULTIPLE 准备的。 好的,对于 mailto Uri,我的主题和正文(=feedback)不是硬编码字符串,我如何将它们放入该 mailto: 语句中?我尝试使用“myemail@gmail.com”+主题+反馈来添加它们,这不起作用,我尝试在两者之间添加“主题=”+主题,这也不起作用 @M.Mungenast:我链接到一个显示mailto: URL 结构的***页面。 Internet 上还有许多其他网页,其中包含有关mailto URL 结构的附加文档。使用您的网络浏览器,在您最喜欢的搜索引擎中搜索mailto url。除了 Wikipedia 页面,您可能还会找到 this page 或 this page 等。 @M.Mungenast:然后,您可以使用类like Uri.Builder 来帮助您组装Uri,使用方法like appendQueryParameter() 添加主题等等。

以上是关于如何正确实现电子邮件意图的主要内容,如果未能解决你的问题,请参考以下文章

通过 firebase 项目上的节点发送电子邮件

Android é 在电子邮件意图中显示为黑色菱形

如何解决android电子邮件意图问题?

如何在没有消息的情况下发送电子邮件意图?

如何在 Android 12 的意图中包含电子邮件收件人信息?

如何从电子邮件意图中的回收站视图中获取两个文本视图?