【问题标题】:Android: Can't Attach File to Email in Non-Gmail ClientAndroid:无法在非 Gmail 客户端中将文件附加到电子邮件
【发布时间】:2013-03-21 20:40:38
【问题描述】:

使用下面的代码,我可以毫无问题地将文件附加到我的应用程序的电子邮件中 ​​- 如果我使用 Gmail 应用程序作为我的电子邮件客户端。但是,任何其他电子邮件客户端都会忽略我发送给它的附件。

这是我的代码:

public static void sendEmail(Context context, String toAddress, String subject, String body, String attachmentPath) throws Exception{
        try {
            Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", toAddress, null));
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.putExtra(Intent.EXTRA_SUBJECT, subject);
            intent.putExtra(Intent.EXTRA_TEXT, body);

            File file = new File(attachmentPath);
            Uri uri = Uri.fromFile(file);

            intent.putExtra(Intent.EXTRA_STREAM, uri);

            context.startActivity(intent);
        }
        catch(Exception ex) {
            ex.printStackTrace();
            throw ex;
        }
}

有谁知道如何设置 Intent 以使任何非 Gmail 电子邮件客户端都能识别并接受附件?

谢谢。

【问题讨论】:

    标签: android email gmail attachment email-client


    【解决方案1】:

    这里有一些有效的代码。为什么它会有所作为,我不知道,但它确实有效。

    public static void sendEmail(Context context, String toAddress, String subject, String body, String attachmentPath, String attachmentMimeType) throws Exception{
            try {
                Intent intent = new Intent(Intent.ACTION_SEND);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    intent.putExtra(Intent.EXTRA_EMAIL, new String[]{toAddress});
                    intent.putExtra(Intent.EXTRA_SUBJECT, subject);
                    intent.putExtra(Intent.EXTRA_TEXT, body);
    
                    File file = new File(attachmentPath);
                    Uri uri = Uri.fromFile(file);
    
                    intent.putExtra(Intent.EXTRA_STREAM, uri);
                    intent.setType(attachmentMimeType);
    
                    context.startActivity(Intent.createChooser(intent, "Choose an email application..."));
            }
            catch(Exception ex) {
                ex.printStackTrace();
                throw ex;
            }
    }
    

    注意使用 ACTION_SEND 而不是 ACTION_SENDTO,以及对 setType(...) 的调用。它似乎有效,但它没有过滤掉作为发送选项呈现的非电子邮件应用程序列表。现在对我来说已经足够了 - 除非有人对如何使这项工作有任何想法并且仍然过滤掉目标应用列表。

    感谢提供建议的人。希望这对其他人也有帮助。

    【讨论】:

    • 你见过那个吗:stackoverflow.com/questions/3132889/…?上面写着“...(丢弃蓝牙和其他)...”
    • 您的先生,是我的救命稻草。我几乎跳过了您的代码尝试,因为我认为这行不通(可能是因为投票率低),但它确实有效!太棒了
    【解决方案2】:

    您是否有特定的电子邮件客户端?他们中的许多人甚至不处理意图中的附件或期望意图以不同方式填充。

    【讨论】:

    • 我想我想到的特定客户端是 Droid Razr 附带的默认客户端。但是,如果我只针对那个人,那么任何其他人都可能会被排除在外,正如 Andre 上面提到的那样。
    【解决方案3】:

    通常,只有当应用供应商提供有关您可以传入的参数的规范或您查看源代码时,这才有可能。您需要首先找出用于电子邮件客户端的 activity/intent,然后在该活动中处理哪些 extra。

    如果幸运的话,您可能会找到类似 http://developer.android.com/guide/appendix/g-app-intents.html 或 Where is a list of available intents in Android? 的列表,或者该应用的作者会帮助您实现正确的意图调用。

    【讨论】:

    • 男人!那真不幸。人们会认为供应商会希望遵守一个标准。疯狂的想法,我知道。 :^)
    • 如果你有一个特定的客户——试试吧——他们可能会坚持谷歌标准;无论如何,我会简单地向供应商发送一封电子邮件,因为他们可能有兴趣提供此类详细信息;最后,这意味着他们的应用程序被更频繁地使用:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 2015-11-25
    • 1970-01-01
    相关资源
    最近更新 更多