检测onActivityResult中是否已发送电子邮件

时间:2013-06-14 06:43:27

标签: android email

我想在我的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 个答案:

答案 0 :(得分:6)

在阅读了这个问题的工作人员的语气之后,我明白没有办法确切地知道用户是按下“发送”还是只是取消了。

但有一种方法可以找出至少用户是否已打开任何邮件客户端应用程序或从“使用完成操作”对话框中退回。 (在我的情况下,我只想在用户打开邮件客户端时完成活动,如果用户从对话框中按下则不执行任何操作)。诀窍很简单。

由于对话框是一个浮动窗口,当它显示在活动上时,只在活动中调用 onPause()方法,但是当用户选择了一个邮件客户端时,它是正在打开 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
        }
    }

P.S。我知道这不是问题的确切答案,但我希望这对某人有用。

答案 1 :(得分:2)

根据此link

  • 你不能,这不是API的一部分。一旦你有,它就会返回 即使没有发送也按下发送按钮

不确定但是你得到的是RESULT_CANCELED,因为它看起来是默认的,用户没有设置结果确定然后它考虑RESULT_CANCELED并且电子邮件活动从不设置结果RESULT_OK所以它需要RESULT_CANCELED。

  • 您可以通过cheeking检查它。返回的Intent数据将始终为null 邮件发送或丢弃。

答案 2 :(得分: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);

参考: Differentiating delivery reports of two separate SMS's