(2011-07の一覧)
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
2011-07-12 Tue (他の年の同じ日: 2005)
ショートカット一覧の取得
2011-07-12-1 / カテゴリ: [Android] / [permlink]
アプリ一覧はいくらでも出てくるのに、ショートカットは検索しても出てこなかった(多分探し方が悪い)ので標準のホームアプリ(ランチャー)のソースを見て調べてみた。
ショートカットの一覧の取得は、アプリ一覧と異なり「Gmailのラベル」や「ブックマーク」などの「選択した後にアプリ固有の設定(選択)」があるので、単純なリスト取得ではできず、startActivityForResult()による起動と、onActivityResult()による結果の取得が必要。
たぶん
(ダイアログのタイトル(EXTRA_TITLE))はリソースに記述して getText(res_id) が良いけどとりあえず)
こんな感じ
この時点(startActivityForResult()コール)で、ショートカット一覧のダイアログは起動する。
その中から一つ選択すると、onActivityResult()がコールバックされる。
とりあえず全体。
これで、「Gmailのラベル選択」や「twiccaのリスト選択」などのActivityが起動する。固有設定が特にないショートカットについては、startActivityForResult()のあとすぐに onActivityResult()がコールバックされる。
固有設定がある項目の場合は、設定(選択)が完了すれば onActivityResult() がコールバックされる。
で case REQUEST_CREATE_SHORTCUT の部分。
あとはこのリストをListViewに突っ込み、タップ時に
一応、ResolveInfo の情報を保持するためのクラスと、ListViewにsetするためのAdapterとListView内のレイアウトファイル
全体でこんな感じ
以下、調べたときのログ。↑でうまくいかないときはチェックしてみて(ぇ
ショートカットの一覧の取得は、アプリ一覧と異なり「Gmailのラベル」や「ブックマーク」などの「選択した後にアプリ固有の設定(選択)」があるので、単純なリスト取得ではできず、startActivityForResult()による起動と、onActivityResult()による結果の取得が必要。
たぶん
- インテント ACTION_PICK_ACTIVITY を起動し、標準(?)の選択ダイアログを起動して固有設定を選択させる(ホーム画面のロングタップの「ショートカット」と同じ要領)
- ショートカットの大元の一覧を取得し、自前のListViewなどで表示・ユーザに更に固有設定を選択させる
ACTION_PICK_ACTIVITYを使ったショートカット一覧の取得
適当なとこで以下のIntentを起動。(ダイアログのタイトル(EXTRA_TITLE))はリソースに記述して getText(res_id) が良いけどとりあえず)
Intent intent = new Intent(Intent.ACTION_PICK_ACTIVITY); intent.putExtra(Intent.EXTRA_INTENT, new Intent(Intent.ACTION_CREATE_SHORTCUT)); intent.putExtra(Intent.EXTRA_TITLE, "ショートカットのリスト"); startActivityForResult(intent, REQUEST_PICK_SHORTCUT);startActivityForResult()は、一覧の取得と、固有設定の結果取得の2度呼ばれるので、第2引数のフラグ値は2種類定義しておく。
こんな感じ
private static final int REQUEST_PICK_SHORTCUT = 0x100; private static final int REQUEST_CREATE_SHORTCUT = 0x200;
この時点(startActivityForResult()コール)で、ショートカット一覧のダイアログは起動する。
その中から一つ選択すると、onActivityResult()がコールバックされる。
とりあえず全体。
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Log.d(TAG, "onActivityResult()" + resultCode); if (resultCode == RESULT_OK) { switch (requestCode) { case REQUEST_PICK_SHORTCUT: Log.d(TAG, "REQUEST_PICK_SHORTCUT"); processShortcut(data); break; case REQUEST_CREATE_SHORTCUT: Log.d(TAG, "REQUEST_CREATE_SHORTCUT"); completeAddShortcut(data); break; default: Log.d(TAG, "default"); break; } } else { Log.d(TAG, "canceled"); } }最初(リストからの選択)は、case REQUEST_PICK_SHORTCUT の部分。
void processShortcut(Intent intent) { startActivityForResult(intent, REQUEST_CREATE_SHORTCUT); }とくに処理なし(笑)、onActivityResult()でコールバックされてきた Intent 変数を、再度 startActivityForResult() する。
これで、「Gmailのラベル選択」や「twiccaのリスト選択」などのActivityが起動する。固有設定が特にないショートカットについては、startActivityForResult()のあとすぐに onActivityResult()がコールバックされる。
固有設定がある項目の場合は、設定(選択)が完了すれば onActivityResult() がコールバックされる。
で case REQUEST_CREATE_SHORTCUT の部分。
private void completeAddShortcut(Intent data) { String name = data.getStringExtra(Intent.EXTRA_SHORTCUT_NAME); Log.d(TAG, "shortcut name: " + name); Intent intent = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_INTENT); // とりあえず startActivity(intent); }getParcelableExtra()で、対象のショートカットのIntentが取得できる。
自前で取得・表示・選択処理
アプリの一覧取得と同じく、android.content.pm.PackageManager を使う。PackageManager pm = getPackageManager(); List<ResolveInfo> infos = pm.queryIntentActivities(new Intent(Intent.ACTION_CREATE_SHORTCUT), 0); for (ResolveInfo info : infos) { Log.d(TAG, "packagename: " + info.activityInfo.packageName); // パッケージ名 Log.d(TAG, "activityname: " + info.activityInfo.name); // アクティビティ名 Log.d(TAG, "appname: " + info.loadLabel(pm).toString()); // 表示名 Log.d(TAG, "icon: " + info.loadIcon(pm)); // アイコン }これで表示に必要なショートカット名とアイコン、起動に必要なパッケージ名とアクティビティ名が取れる。
あとはこのリストをListViewに突っ込み、タップ時に
@Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { ListView list = (ListView) parent; /* 中略 */ String packagename = "パッケージ名"; // ↑のinfo.activityInfo.packageName の値 String activityname = "アクティビティ名"; // ↑のinfo.activityInfo.name の値 Intent intent = new Intent(Intent.ACTION_CREATE_SHORTCUT); intent.setClassName(packagename, activityname); startActivityForResult(intent, 1); }などすれば、ACTION_PICK_ACTIVITY 使用の場合と同じく、固有設定のActivityが起動される(なければすぐ onActivityResult()がコールバック)ので、後はcompleteAddShortcut()と同じ。
一応、ResolveInfo の情報を保持するためのクラスと、ListViewにsetするためのAdapterとListView内のレイアウトファイル
全体でこんな感じ
ArrayList<AppInfoItem> items = new ArrayList<AppInfoItem>(); AppInfoItem item; ListView listView = (ListView) findViewById(R.id.listView1); PackageManager pm = getPackageManager(); List<ResolveInfo> infos = pm.queryIntentActivities(new Intent(Intent.ACTION_CREATE_SHORTCUT), 0); for (ResolveInfo info : infos) { item = new AppInfoItem(); Log.d(TAG, "packagename: " + info.activityInfo.packageName); Log.d(TAG, "classname: " + info.activityInfo.name); Log.d(TAG, "appname: " + info.loadLabel(pm).toString()); Log.d(TAG, "activityname: " + info.activityInfo.name); item.setAppName(info.loadLabel(pm).toString()); item.setAppPackageName(info.activityInfo.packageName); item.setAppIcon(info.loadIcon(pm)); item.setActivityName(info.activityInfo.name); items.add(item); } AppInfoAdapter adapter = new AppInfoAdapter(this, items); listView.setAdapter(adapter); listView.setOnItemClickListener(this);
以下、調べたときのログ。↑でうまくいかないときはチェックしてみて(ぇ
《続きを読む》
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
最終更新時間: 2013-05-02 16:12