Android Developers Blogの、“Can I use this Intent?”というポストが役に立ちそうだった、かつ、誰も翻訳してなさそうだったので日本語にしてみました。訳はそれほど正確ではありませんので、オリジナルの方もご覧下さい。
http://android-developers.blogspot.com/2009/01/can-i-use-this-intent.html
Can I use this Intent? - このIntentって使える? 2009/1/5 Romain Guy
Androidは、Intentと呼ばれるとてもパワフルで使いやすいツールを提供しています。Intentによって、アプリケーションをハイレベルなライブラリとして利用することが出来ますし、従来よりもコードを再利用しやすくなります。例えば、AndroidのホームスクリーンとAnyCutアプリは、ショートカットキーを定義するためにIntentをたくさん使っています。疎結合なAPIを使って作れることはとてもナイスなんですが、その反面、あなたが送ったIntentが別のアプリケーションで受け取られているという保証はありません。これは、「Panoramio」とその「RADAR Intent」のような、サードパーティのアプリで特に起こりがちです。
私は新しいアプリを作っている最中に、あなたが使いたいIntentに反応してくれるアプリケーションがシステム中に存在するかどうかを知る、とても簡単な方法があることを思いつきました。私のアプリではメニュー項目をユーザーがクリックするとIntentが出るようになってるのですが、この方法を使って(利用できない)メニュー項目を灰色表示にするよう実装しました。コードはとてもシンプルで追いかけるのも簡単です。
/**
* 引数で指定したActionを使えるIntentがあるかどうかを返します。
* このメソッドは、引数で指定したActionを設定したIntentに応答できる
* インストール済パッケージをパッケージマネージャーに問い合わせます。
* 適切なパッケージが存在しない場合はfalseを返します。
*
* @param context アプリのContext
* @param action 使えるかどうかチェックしたいAction文字列
*
* @return true:引数で指定したActionが設定されたIntentを扱える場合
* false:それ以外
*/
public static boolean isIntentAvailable(Context context, String action) {
final PackageManager packageManager = context.getPackageManager();
final Intent intent = new Intent(action);
List<ResolveInfo> list =
packageManager.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}
使い方はこんな感じです。
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
final boolean scanAvailable = isIntentAvailable(this,
"com.google.zxing.client.android.SCAN");MenuItem item;
item = menu.findItem(R.id.menu_item_add);
item.setEnabled(scanAvailable);return super.onPrepareOptionsMenu(menu);
}
この例では、バーコードスキャナのアプリがインストールされていなければメニュー項目を灰色表示にします。他のもっとシンプルな方法としては、startActivityメソッドを呼ぶときにActivityNotFoundException例外をキャッチする方法があります。しかしこの方法は、問題が発生した時に対応することしか出来ません。したがって、ユーザーがうまく動作しない何らかの操作をしてしまうことを防止するために、事前に予測してUIを更新することが出来ません。ここで示したテクニックは、足りないパッケージをインストールするかどうかをアプリ起動時にユーザーに尋ね、適切なURIを使ってAndroid Marketへリダイレクトするといったような使い方も出来ます。
注釈:この記事のオリジナルは私の個人BLOGの投稿です。