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 として設定しないためです。

では、どうすれば私の要件を満たすことができますか。提案してください。

ありがとう

4

3 に答える 3

7

この問題に関するスタッフの声を読んだ後、ユーザーが「送信」を押したのか、単にキャンセルしたのかを正確に知る方法がないことを理解しました.

ただし、少なくともユーザーがメール クライアント アプリケーションを開いたかどうか、または [操作を完了する] ダイアログから押し戻したかどうかを確認する方法があります。(私の場合、ユーザーがメールクライアントを開いた場合はアクティビティを終了し、ユーザーがダイアログから押し戻した場合は何もしませんでした)。トリックは非常に簡単です。

ダイアログはフローティング ウィンドウであるため、アクティビティの上にダイアログが表示されているときは、アクティビティで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
        }
    }

PSこれが質問に対する正確な回答ではないことはわかっていますが、これが誰かの役に立てば幸いです。

于 2014-01-11T18:22:56.830 に答える
2

このリンクに従って

  • できません。これは API の一部ではありません。送信しなくても一度送信ボタンを押すと戻ってきます

確かではありませんが、ユーザーが Result ok を設定していないデフォルトのように見えるため、 RESULT_CANCELED を取得しています。その後、 RESULT_CANCELED と見なされ、電子メールアクティビティが結果 RESULT_OK を設定しないため、 RESULT_CANCELED として取得されます。

  • チークで確認できます インテント データが戻ってくると、メールの送信または破棄のいずれかが常に null になります。
于 2013-06-14T07:02:06.810 に答える
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);

参照: 2 つの別々の SMS の配信レポートの区別

于 2013-06-14T06:50:46.040 に答える