カタバミさんのプログラミングノート

日曜プログラマーがプログラミング関係のメモを記録するブログです。

[覚書]Androidでインストールされたパッケージ&アプリケーションを列挙する

パッケージマネージャーをからインストールされたパッケージと関連するアプリケーションの一覧を取得して、アクティビティに貼り付けたリストビューに二段表示するサンプルコードです。とてもシンプルです。

開発環境:Eclipse 4.4 Luna Pleiades All in One for Java 64 bit Standard Edition, ADT, Android 仮想デバイスIntel Atom (x86)) 最小必須 SDKAPI 15: Android 4.0.3 (IceCream Sandwich) ターゲット SDKAPI 15: Android 4.0.3 (IceCream Sandwich) コンパイル SDKAPI 15: Android 4.0.3 (IceCream Sandwich)

サンプルコード

package com.example.app;

import java.util.ArrayList;
import java.util.HashMap;

import android.app.Activity;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // アプリケーション情報を取得する
        PackageManager pm = getPackageManager();
        ArrayList<HashMap<String, String>> items = new ArrayList<HashMap<String, String>>();
        for (PackageInfo info : pm.getInstalledPackages(PackageManager.GET_META_DATA)) {
            HashMap<String, String> item = new HashMap<String, String>();
            item.put("PackageName", info.packageName);
            item.put("ApplicationName", info.applicationInfo.loadLabel(pm).toString());
            items.add(item);
        }

        // リストビューにさっきの情報を持つアダプターを設定する
        SimpleAdapter adapter = new SimpleAdapter(
                this,
                items,
                android.R.layout.simple_list_item_2,
                new String[] {"ApplicationName", "PackageName"},
                new int[] {android.R.id.text1, android.R.id.text2});
        ListView listView1 = new ListView(this);
        listView1.setAdapter(adapter);
        setContentView(listView1);
    }
}

WS004605.JPG

覚書

PackageManagerはActivity(Context)から取得する

パッケージマネージャーはグローバルな関数・変数でなく、Activityが継承しているContextのContext::getPackageManager()で取得します。

PakageManager pm = getPackageManager(); // Activity内部で!

ここで取得したPakageManagerからgetInstalledApplications()等で各種情報を取得することができます。メソッドによってはIntentの種類を指定して列挙することもできます。

他にもgetSystemServices()等がContextから提供されています。

ListViewとSimpleAdapter

WindowsのListBox/ListViewに対応するコントロール(ビュー)としてAndroid アプリケーションではListViewが使われるそうです。ListBox/ListViewでは直に項目を追加するかオーナードローを行いましたが、AndroidではSimpleAdapter等のAdapterがその役割を担うそうです。

サンプルではSimpleAdapterを利用してリストビューを二段表示しています。SimpleAdapterは作成時にList<Map<String, ?>>を第二引数へ取り、第三引数はレイアウトで用いるXMLのID、第四引数は表示したい項目のMap内でのKeyの配列、第五引数はKeyに関連付けるレイアウト内部のIDの配列です。

蛇足

AtivityにListViewだけ表示するのであればListActivityを使用した方がきれいにまとまります。今回はビューの配置も兼ねてActivityを用いました。