Intent.ACTION_SENDで他のアプリケーションと連携する
|Androidにはアプリ間の連携をするために便利なIntentという仕組みが用意されています。
TechBoosterでも明示的Intet、暗黙的Intentを以前に取り上げました。
前回の暗黙的Intentの記事ではACTION_VIEWというIntentを取り上げましたが、今回はACTION_SENDを取り上げます。
ACTION_SENDは標準のアプリいくつか対応しており、AndroidMarketに公開されているアプリでも比較的多くのアプリが対応しています。
多くのアプリで対応しているIntentに自作のアプリも対応することで、Intentと送る立場からすれば自分のアプリで実装すること無く、世の中にある多くのアプリの機能を自分のアプリから使うことが可能になります。
またそのような多くのアプリで対応しているIntentを受けることができるようにしておくと、優秀なアプリと一緒に使ってくれるようになるかもしれません。
ACTION_SEND はテキストや画像などいくつかの形式に対応していますが今回はテキストのやり取りを紹介します。
それではIntent.ACTION_SENDを使った他のアプリとのテキストの受け渡しをサンプルソースとともに紹介します。
Intent.ACTION_SENDの発行
まずはIntent.ACTION_SENDを発行して、他のアプリに受け取ってもらいましょう。
ボタンとEditTextを1つずつ用意して、ボタンを押すとEditTextに入力されている文字列を他のアプリに送るものをサンプルとして紹介します。
public class ActionSendActivity extends Activity { static final private String TAG = "ActionSendSample"; private EditText editText_; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); editText_ = (EditText)findViewById(R.id.Text); Button sendButton = (Button)findViewById(R.id.SendButton); sendButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { try { Intent intent = new Intent(); intent.setAction(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TEXT, editText_.getText().toString()); startActivity(intent); } catch (Exception e) { Log.d(TAG, "Error"); } } }); } }
ボタンに登録したリスナでIntentを発行しています。上で説明した通りACTION_SENDは画像等も送ることができるのでここではテキストを設定します。
intent.setAction(Intent.ACTION_SEND); intent.setType("text/plain");
そして、EditTextから文字列を取得してExtraに設定します。
intent.putExtra(Intent.EXTRA_TEXT, editText_.getText().toString());
文字を入力してボタンを押すとIntent.ACTION_SENDを発行します。そうするとACTION_SENDを受け取ることができるアプリケーションの一覧が表示されます。
今回はメッセージアプリを立ち上げてみます。
このようにメッセージアプリが立ち上がり、先ほど入力していた文字列がメッセージの本文のところに入力されていることが分かるかと思います。
TwiccaなどのTwitterクライアントアプリケーションなども対応しているので、自分のアプリでTwitterへのつぶやき機能を実装しなくても、ACTION_SENDでTwitterクライントへの送ることで代わりに実現することが可能です。
Intent.ACTION_SENDを受け取る
次は、ACTION_SENDを受け取ってみましょう。Intentを受け取るにはマニフェストファイルに該当のActivityに対しIntentFilterを記述する必要があります。サンプルではテキストのみを受け付けるようにします。
<intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/*" /> </intent-filter>
AndroidManifest.xmlにこのように記述することで他のアプリがACTION_SENDを発行した際に、先ほどのような一覧に表示されるようになります。
次にACTION_SEND によって起動された場合の処理を記述します。サンプルのonCreateに以下のソースを追加します。
Intent intent = getIntent(); String action = intent.getAction(); if (Intent.ACTION_SEND.equals(action)) { Bundle extras = intent.getExtras(); if (extras != null) { CharSequence ext = extras.getCharSequence(Intent.EXTRA_TEXT); if (ext != null) { editText_.setText(ext); } } }
getIntentでIntentを取得します。Intentが通常の起動(android.intent.action.MAIN)ではなくACTION_SENDだった場合にだけgetExtrasでBundleを取得して文字列を取り出します。
これで他のアプリからACTION_SEND でテキストを受けとると、EditTextにそのテキストを設定するサンプルの出来上がりです。
試しにTwitterクライアントからつぶやきをACTION_SENDで連携してみましょう。
「このツイート全体を共有する」を選択すると、このように他のアプリケーションに並んで今回のサンプル(ActionSendSample)が表示されています。そして選択するとアプリが立ち上がります。
まとめ
このようにIntentを投げることも受け取ることも少しのコードで実現可能です。様々な機能を自作のアプリに盛り込むのはハードルが高いという方や、アプリはシンプルな方が良いという方は、Androidの便利な連携機能であるIntentを活用してみては如何でしょうか。