Android - 如何通过检查发送的项目来确定是否发送了电子邮件

时间:2014-06-03 03:42:08

标签: android email

我有一个应用程序,我使用intent发送EMails,如下所示:

//TODO attach and send here
try {           

    Log.i(getClass().getSimpleName(), "send  task - start");

    String address = "emailHere@yahoo.com";
    String subject = "Order of " + customer + " for " + date;
    String emailtext = "Please check the attached file. Attached file contains order of " + customer;

    final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND_MULTIPLE);
    emailIntent.setType("plain/text");
    emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] { address });
    emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, subject);
    emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, emailtext);

    ArrayList<Uri> uris = new ArrayList<Uri>();
    Uri uriList = Uri.fromFile(orderListFile);
    uris.add(uriList);

    emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);

    this.startActivity(Intent.createChooser(emailIntent, "Send mail..."));

} 
catch (Throwable t) {
    Toast.makeText(this, "Request failed: " + t.toString(),
    Toast.LENGTH_LONG).show();
}

现在,用户选择他或她想要使用哪个应用程序来发送该电子邮件。但是,一旦选定的电子邮件应用程序接管,我知道无法确定电子邮件是否正确发送。这里已经讨论了几个问题,使用startActivityForIntent()没有帮助,因为电子邮件或GMail Ap永远不会发送RESULT_OK所以我不知道用户是否发送,丢弃或保存了电子邮件作为草案。

但是,一种可能的解决方法是检查该电子邮件帐户的已发送邮件,并检查用户是否发送了电子邮件。现在,有没有办法知道Android中电子邮件帐户的已发送项目?我过去一小时一直在谷歌搜索,我似乎无法得到任何东西。

2 个答案:

答案 0 :(得分:6)

您无法检查电子邮件内容提供者的内容,因为这需要只有系统应用才能请求的权限。这在AndroidManifest for Email

中定义
<permission
    android:name="com.android.email.permission.ACCESS_PROVIDER"
    android:protectionLevel="signature"
    android:label="@string/permission_access_provider_label"
    android:description="@string/permission_access_provider_desc"/>
…
<application>
    …
    <!-- This provider MUST be protected by strict permissions, as granting access to
         it exposes user passwords and other confidential information. -->
    <provider
        android:name=".provider.EmailProvider"
        android:authorities="com.android.email.provider;com.android.email.notifier"
        android:exported="true"
        android:permission="com.android.email.permission.ACCESS_PROVIDER"
        android:label="@string/app_name"
        />
    …
</application>

答案 1 :(得分:1)

对于第一个选项,标准AOSP电子邮件应用和Gmail应用都不会像这样。如果电子邮件已发送,保存为草稿或完全丢弃,则它们不会返回任何不同的信息。

即使他们这样做了,用户可能已经安装了不同的电子邮件应用程序,但您无法保证它会很好用。即使所有电子邮件应用程序都以这种方式运行,用户也可能已经编辑了主题,正文或“收件人”字段,因此它甚至不能保证“您打算将电子邮件设置为”发送“实际发送。

对于第二个选项,电子邮件应用通常不会导出内容提供商。例如,manifest for the AOSP email app表明com.android.email.permission.ACCESS_PROVIDER权限的protectionLevel signature com.google.android.gm.permission.READ_GMAIL,这意味着只有同一方签署的应用(在本例中为Google)才能访问它们。

Gmail曾经拥有内容提供商(通过protectionLevel="signature"权限),但很久以前就已经更改了(根据this answer上的评论,在Android 2.2附近有{{1} (以及)现在只提供有关标签的信息(参见the documentation)。

鉴于涉及隐私风险,我认为其他电子邮件客户端不太可能在电子邮件上公开内容提供商。

根据您的实际使用情况,替代第三个选项将是在没有用户互动的情况下发送这些电子邮件(例如,使用JavaMail或类似的库)。例如,如果您使用这些电子邮件作为与后端通信的方式(例如,如果是这种情况,http帖子将更合适),这将起作用。