0

为了通过设备的默认 Gmail 意图发送邮件,我正在使用以下功能:

private void initShareIntent(String type) {
        boolean found = false;
        Intent share = new Intent(android.content.Intent.ACTION_SEND);
        share.setType("text/plain");
        share.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);

        // gets the list of intents that can be loaded.
        List<ResolveInfo> resInfo = getPackageManager().queryIntentActivities(
                share, 0);
        if (!resInfo.isEmpty()) {
            for (ResolveInfo info : resInfo) {

                if (info.activityInfo.packageName.toLowerCase().contains(type)
                        || info.activityInfo.name.toLowerCase().contains(type)) {
                    share.putExtra(Intent.EXTRA_SUBJECT,
                            "Reg:xxx");
                    share.putExtra(Intent.EXTRA_TEXT, shareText);
                    share.setPackage(info.activityInfo.packageName);
                    found = true;
                    break;
                }
            }
            if (!found) {
                return;
            }
            startActivity(Intent.createChooser(share, "Select"));
        }
    }

并像这样调用函数:

initShareIntent("mail");

有没有办法获得这个动作的发送状态(成功或失败)?

提前致谢

4

1 回答 1

0

有没有办法获得这个动作的发送状态(成功或失败)?

不,对不起。您甚至不知道用户是否真的发送了电子邮件。

除此之外,您对此的总体方法很糟糕。ACTION_SEND与其简单地使用并允许用户选择他们希望如何发送此文本,不如将它们限制为某些随机应用程序,这些应用程序包含mail在包名称中并支持ACTION_SEND. text/plain这其中的缺陷简直令人震惊:

  • 您假设所有电子邮件应用程序mail的软件包名称中都有,花几分钟检查 Play 商店会证明这是不正确的

  • 您假设mail包名称中的最后一个应用程序是正确的,即使这不是用户实际使用的应用程序(例如,安装在设备上但未配置)

  • 您假设用户实际上想通过电子邮件发送

鉴于您的主题行 ( "Reg:Clock In Clock Out"),我的猜测是您正试图向某人发送电子邮件以进行时间表管理。在这种情况下,以下是您的主要选项,按有效性降序排列:

  1. 不要使用电子邮件,而是通过 Web 服务提交时间表

  2. 使用电子邮件,但让 Web 服务发送它,以便您知道它已发送

  3. 使用email,但是使用JavaMail发送,这样就知道是发送了

  4. 使用ACTION_SENDTO和 a mailto: Uri,因为据推测,此时间表信息应该发送到特定的电子邮件帐户,而不是用户可能从他们的联系人列表中选择的任何人,因为这不仅会设置目标地址,还会自动将用户限制为支持mailto: Uri方案的电子邮件应用程序

  5. 使用ACTION_SEND并摆脱您有缺陷的过滤机制,只允许用户选择正确的应用程序,然后摆脱,createChooser()以便他们可以将他们的选择作为未来使用的默认设置

于 2013-09-18T12:56:51.757 回答