检测邮件是否在onActivityResult中已发送

4
我希望能在我的onActivityResult方法中检测是否有人发送了邮件、按下了返回按钮或放弃了它。请问我该如何做到这一点?
我是这样做的:
String[] reciepients = result.toArray(new String[result.size()]);
        Intent email = new Intent(android.content.Intent.ACTION_SEND);
        email.putExtra(android.content.Intent.EXTRA_EMAIL,reciepients);
        email.putExtra(android.content.Intent.EXTRA_SUBJECT, subject);
        email.putExtra(android.content.Intent.EXTRA_TEXT, emailMessage);
        email.setType("text/plain");
        email.setType("message/rfc822");
        Intent intent =  Intent.createChooser(email, "Choose Email Client");
        //context.start(Intent.createChooser(email, "Choose Email.."));
        ((Activity)context).startActivityForResult(intent, FinalVariables.SEND_EMAIL);

onActivityResult

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {


        case FinalVariables.SEND_EMAIL:
            if(resultCode==Activity.RESULT_CANCELED){
                showToast("Cancelled");
            }
            else if(resultCode==Activity.RESULT_OK){
                showToast("Success");
            }
            break;

        default:
            break;
        }

    }

但是我一直得到取消的结果,因为电子邮件客户端从不将RESULT设置为RESULT_OK。
那么我该如何满足我的要求,请提供建议。
谢谢
3个回答

7
阅读了许多关于这个问题的内容后,我理解到没有办法确切知道用户是按下了"发送"按钮还是取消了操作。但是至少有一种方法可以找出用户是否打开了任何邮件客户端应用程序或从“使用完整操作”对话框中返回。 (在我的情况下,如果用户打开邮件客户端,我只想完成活动,如果用户从对话框中返回,则什么也不做)。 这个技巧非常简单。由于对话框是一个浮动窗口,在显示在活动上方时,只调用activity的 onPause() 方法,但当用户选择邮件客户端并打开它时,activity 的 onStop() 方法也会被调用。 因此,您可以使用 startActivityForResult() 启动 ACTION_SEND:
startActivityForResult(intent, CODE_SEND);

还需要一个布尔标志,您将在 onPause()onStop() 中更改:

public class MainActivity extends Activity {
...

private boolean mailClientOpened = false;

@Override
protected void onResume() {
   super.onResume();
   mailClientOpened = false;
}

@Override
protected void onStop() {
    super.onStop();
    mailClientOpened = true;
}

在您的onActivityResult()中,您可以检查requestCode和布尔值mailClientOpened来确定客户端是否已打开或用户取消了对话框:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode == CODE_SEND && mailClientOpened){
    finish(); // Or do something else that you need to do when you know that user at least opened the mail client app
        }
    }

PS:我知道这不是问题的确切答案,但我希望这对某些人有用。


2
根据此链接所述:
  • 您无法这样做,因为它不是API的一部分。即使未发送,一旦按下发送按钮,它就会返回。

不确定,但您收到了RESULT_CANCELED,因为它看起来是默认用户未设置Result ok,然后它将其视为RESULT_CANCELED,并且电子邮件活动从未设置结果RESULT_OK,因此它将其视为RESULT_CANCELED。

  • 您可以通过检查Intent数据是否始终为空来验证。

1
请详细说明第二种情况?我如何使用意图数据进行检查? - Gaurav Arora
意图数据在两种情况下始终返回“null”。您无法检查意图数据。 - Josh Laird

0

这可能会对你有所帮助

String DELIVERED = "SMS_DELIVERED" + serialnum; // Unique ACTION every time
Intent delivered = new Intent(context, MessageStatusReceiver.class);
delivered.setAction(DELIVERED ); // Set action to ensure unique PendingIntent
delivered.putExtra("MsgNum", serialnum);
PendingIntent deliveredPI = PendingIntent.getBroadcast(this,
Integer.parseInt(serialnum), delivered,
PendingIntent.FLAG_ONE_SHOT);

参考:区分两个独立短信的发送报告


获取您发送的邮件的送达报告 - Ponmalar
你是否参考了附带链接中提到的内容? - Ponmalar
问题是关于电子邮件而不是短信。 - philk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接