アプリを起動するショートカットを作成する流れ

大まかなにはこんな感じ。

  1. ショートカットでドキュメント情報付きでアプリが起動するインテントを作成
  2. 1. で作ったインテントを含んだショートカットを作成するインテントを作成
  3. 2. で作ったインテントを起動

これでホーム画面に「タップするとドキュメント情報付きでアプリが起動する」ショートカットが作成される。


以下、それぞれのコード。
1. ショートカットでドキュメント情報付きでアプリが起動するインテントを作成
アプリを scheme で起動する方法については前にメモをしてある。

というわけで、ここでのキモはドキュメント情報を Intent#setData() でセットしているところ。

Intent createAppStartIntent() {
	Intent shortcutIntent = new Intent(Intent.ACTION_VIEW);
	shortcutIntent.setClassName(this, MainActivity.class.getName());
	String url = String.format("myScheme://open?var1=%s&var2=%s", "何か適当な", "渡したい値")
	Uri uri = Uri.parse(url);
	shortcutIntent.setData(uri);

	return shortcutIntent;
}

こうしておけば、アプリが受け取った時に Intent#getData() で Uri にしてそれぞれのパーツに分けて取り出せる。
更に Uri なので Web からのリンクでも同じように起動できるので楽チン!


2. 1. で作ったインテントを含んだショートカットを作成するインテントを作成
今度はショートカットを作成するインテントを作成する。
キモはショートカットのインテントに 1. で作ったインテントをセットするってこと。これでショートカットをタップすると 1. で作ったインテントが起動するようになる。
後はショートカットの名前とアイコンをセットすれば OK。


ところで、なぜか web で見たサンプルだと Intent.EXTRA_SHORTCUT_ICON_RESOURCE を使ってリソースからアイコンを取得しているものが多い。
けど、今回はドキュメントの中に入っている情報をアイコンにするので、Intent.EXTRA_SHORTCUT_ICON にして渡す Bitmap を毎回作るようにしてる。

Intent createShortcutIntent(String shortcutName, Intent shortcutIntent, Bitmap icon) {
	Intent intent = new Intent();

	intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
	intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, shortcutName);
	intent.putExtra(Intent.EXTRA_SHORTCUT_ICON, icon);

	intent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");

	return intent;
}


3. 2. で作ったインテントを起動
あとは、2. で作ったインテントを起動するだけ。
下記のコードはそれぞれの行が手順の 1, 2, 3 になってる。

void createShortcut() {
	Intent appStartIntent = createAppStartIntent();
	Intent createShortcutIntent = createShortcutIntent(shortcutName, appStartIntent, icon);
	sendBroadcast(createShortcutIntent);
}

これでショートカットがみょ〜んってホームにできあがるわけだけれども、Android のバージョンによって微妙な挙動の差がある???
v2.3.6 の Galaxy S2 だとショートカット作成時に「ショートカット xxxx を作成しました」ってトーストで表示される。
だけど v4.1.1 の Nexus だとトーストが表示されない…。
う〜ん、OS のバージョンを見てトーストを自前で出すってのもありかもしれないけど、機種毎に挙動が違ったりとかも怖いので今回は辞めておいた。


あ、最後にハマったところ!
単純に Manifest にパーミションを入れ忘れてた…
ショートカット作成にはこれが必要。

<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />


参考にしたページ