インストール済みホームアプリケーションの一覧を作成する


インストール済パッケージを取得するおよびインストール済みアプリケーションのアプリケーション名とアイコンを取得するでは、インストールされているすべてのアプリケーションのパッケージ名を取得することで、アプリケーション一覧画面を作成しました。

Androidでは、アプリケーションパッケージ名の取得の際に、カテゴリやその他インテントフィルターの属性を指定することで、インストールされているアプリケーションの中から、すべてではなく一部のアプリケーションのパッケージ名のみを取得することも可能です。
今回は、インストール済みアプリケーションのアプリケーション名とアイコンを取得するで作成したサンプルアプリをベースに、デフォルト設定を解除するサンプルアプリを作成しながら解説します。デフォルト設定を解除するには、アプリケーション管理の詳細画面に遷移する必要がありますので、その方法も一緒に学んでみてください。
※「デフォルト設定」とは、ブラウザアプリやホームアプリが暗黙的IntentやブロードキャストIntentによって起動される際に、選択式にせずに、起動されるブラウザ、もしくはホームアプリケーションを、決め打ちで指定しておくことです。

▲図:ホームアプリ選択画面。チェックボックスにチェックを付けると、選択したホームアプリがデフォルト設定となり、ホームボタンを押すとそれが起動することになる。

なお、手順としては、前回作成したインストール済みアプリケーションのアプリケーション名とアイコンを取得するで作成したサンプルアプリを以下の手順で改良を加えますので、そちらの記事も参考にしてください。
・すべてのアプリケーションの情報を取得していた部分を、インテントフィルタを用いてホームアプリのみ取得できるようにする。
・ホームアプリ一覧を取得したら、アプリケーション管理画面の詳細画面(上図右)に遷移させることで、デフォルト設定の解除を可能にする。

では続きをどうぞ

インストール済みホームアプリケーションの情報の取得
すべてのアプリケーションの中から一部のアプリだけ抽出するには、PackageManagerクラスのqueryIntentActivities()メソッドを使用します。
以下のサンプルコードでは、カテゴリにCATEGORY_HOMEを指定することで、ホームアプリのインテントフィルターに引っ掛けています。

SwitcherSampleActivity.java

@Override
public void onCreate(Bundle savedInstanceState) {
(…省略...)
        PackageManager pm = this.getPackageManager();
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_MAIN);
        //呼び出したいActivityのカテゴリを指定する
        intent.addCategory(Intent.CATEGORY_HOME);
        //カテゴリとアクションに一致するアクティビティの情報を取得する
        final List<ResolveInfo> appInfoList = pm.queryIntentActivities(intent, 0);

	//以下、取得したアクティビティ情報からアプリケーションリストの作成
        for(ResolveInfo ri : appInfoList){
        	itemData = new CustomData();

        	if(ri.loadLabel(pm).toString()!=null){
	        	itemData.setTextData(ri.loadLabel(pm).toString());
        	}else{
        		itemData.setTextData("NoName");
        	}

        	try {
				icon = pm.getApplicationIcon(ri.activityInfo.packageName);
			} catch (NameNotFoundException e) {
				e.printStackTrace();
			}
        	itemData.setImageData(icon);

        	objects.add(itemData);
        	customAdapater = new CustomAdapter(this, 0, objects);
            listView.setAdapter(customAdapater);
        }
}

queryIntentActivities()メソッドは、すべてのアプリケーションの中から、引数に指定したIntentによって起動するアクティビティの情報を持った<ResolveInfo>を取得します。
ResolveInfoクラスは、指定したインテントフィルターに(部分的に)一致したアクティビティやアイコン、ラベルなどの情報を保持するクラスです。

アプリケーションの管理(詳細)画面に遷移する

リストから選択したアプリケーションの、管理詳細画面(下図参照)に遷移させます。
管理詳細画面では、アプリケーションのアンインストールや、デフォルト設定の解除を行うことが可能です。

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            	ResolveInfo ri = appInfoList.get(position);
            	Uri uri=Uri.fromParts("package",ri.activityInfo.packageName,null);
                Intent intent=new Intent();
		//アプリケーションのパッケージ名を登録する
                intent.setData(uri);
		//アプリケーション管理の詳細画面を登録する
                ComponentName cn = ComponentName.unflattenFromString("com.android.settings/.applications.InstalledAppDetails");
                intent.setComponent(cn);
                startActivity(intent);
            }
        });

9行目で、選択されたアプリケーションのURIをIntentに登録しています。
11行目、12行目で、遷移先のActivity(設定画面のアプリケーション詳細画面)を指定しています。ComponentNameクラスのunflattenFromString()メソッドは、引数に指定した<パッケージ名/.クラス名>に該当するコンポーネント名(ComponentNameのオブジェクト)を返します。
取得したComponentNameのオブジェクトには、Activityのパッケージ名およびクラス名がString型で格納されています。このComponentNameオブジェクトを、setComponent()メソッドを用いてIntentに登録することで、該当のActivityを呼び出すことが可能です。

以上で、簡単なデフォルト設定変更アプリが完成です。