« 燃料切れ | トップページ | 中華Padふたつめがやってきた »

2011年3月24日 (木)

ACTION_SENDの結果

Androidでは他のアプリに処理をお願いしたい場合にIntentという機構を使います。

メールを送ったりする場合にはACTION_SENDという種類のIntentを発行することになります。(実際はTwitterのクライアントなどもACTION_SENDのIntentFilterを持っているのですが)

今回のお話しは、じゃぁ、実際ACTION_SENDを発行するとどうなるの?というお話しです。

DeveloperサイトにはIntentとExtraの項にEXTRA_EMAILという項目があって、私が読む範囲では発行時にはメール送信先を指定できて、送信後に(ユーザが実際に指定した)アドレスを返してくれるように読めます。

じゃあ、Intentからこれを読み出して、次回メール送るときに渡せば親切じゃん。という発想がでてきますよね?やってみました。

      private OnClickListener textListener = new OnClickListener(){

            public void onClick(View v) {
                  String[] email = {"foo@example.com"};
                  Intent req = new Intent();
                  req.setAction(Intent.ACTION_SEND);
                  req.setType("text/plain");
                  req.putExtra(Intent.EXTRA_EMAIL,email);
                  req.putExtra(Intent.EXTRA_SUBJECT, title());
                  req.putExtra(Intent.EXTRA_TEXT, mSendMessage);
                  startActivityForResult(Intent.createChooser(req, getString(R.string.intent_chooser_title)),PLAIN_SEND);
            }
      };
コードとしてはこんな感じです。これ、実際発行するとどうなるのかというと、ほとんどのMailクライアントはメール送信後にActivity.RESULT_CANCELを返してきます。受ける側はというと、
      protected void onActivityResult(int req, int res ,Intent intent){
            super.onActivityResult(req, res, intent);
            
            Log.d(TAG,"onActivityResult: res = "+Integer.toString(res));
            if (res == Activity.RESULT_OK){
                  String classname = intent.getClass().getName();
                  Bundle extra = intent.getExtras();
                  String[] email = extra.getStringArray(Intent.EXTRA_EMAIL);
                  String[] cc    = extra.getStringArray(Intent.EXTRA_CC);
                  String[] bcc   = extra.getStringArray(Intent.EXTRA_BCC);
                  Log.d(TAG, "email ="+email[0]);
                  switch (req) {
                  case PLAIN_SEND:
                        break;
                  case XHTML_SEND:
                  }
            }
      }
こんな感じのコードで結果を受け取るわけでうすが、そもそも、最初のifのところを通りません。そして、その条件判定を外してExtraが付いているかを見ると、そもそもIntentがnullか、Extraが付いていてもその中がnullかのどちらかです。
すくなくともXperiaにインストールしている標準Mail、Gmail、SPモードメ-ルのどれもがRESULT_CANCELを返してきました。(もちろん、メールの送信は成功していますし、EvernoteクライアントはちゃんとRESULT_OKを返したので、chooserなりの中でResultが書き換えられているということはないはずです)。まぁ、1.6のエミュレータのMailクライアントは送信後に呼び出し元に戻りさえしないので、進歩しているといえばそうなのかもしれませんが。
ということで、小さな親切機能はボツになりそうです。

« 燃料切れ | トップページ | 中華Padふたつめがやってきた »

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/60027/51207781

この記事へのトラックバック一覧です: ACTION_SENDの結果:

« 燃料切れ | トップページ | 中華Padふたつめがやってきた »