5

私が電話したら

    PackageManager pm = getPackageManager () ;
    List<PackageInfo> pis = pm.getInstalledPackages (PackageManager.GET_PROVIDERS) ;

インストールされているパッケージのリストを取得します。これには、パッケージが宣言するすべてのプロビダーが含まれます (つまり、pis[i].providers が null でない可能性があります)。

ただし、次のように、フラグの中に PackageManager.GET_ACITIVITIES を含めると、

    PackageManager pm = getPackageManager () ;
    List<PackageInfo> pis = pm.getInstalledPackages (PackageManager.GET_ACTIVITIES | PackageManager.GET_PROVIDERS) ;

インストール済みパッケージの「同じ」リストを取得することを期待していますが、pis[i].activities も null ではありません。しかし、そうではありません。空のリストが表示されます。

ドキュメントに記載されていないフラグの中に PackageManager.GET_ACTIVITES を含めることについて何か特別なことはありますか?

私の現在の回避策は、 PackageManager.GET_ACTIVITIES をフラグから除外し、返されたリストを次のようにループすることです。

    for (PackageInfo pi : pis) {
        try {
            PackageInfo tmp = pm.getPackageInfo (pi.packageName, PackageManager.GET_ACTIVITIES) ;
            pi.activities = tmp.activities ;
            }
        catch (NameNotFoundException e) {
            Log.e (TAG, e.getMessage ()) ;
            }

しかし、それは本当のクラッジのようです。

getInstalledPackages (PackageManager.GET_ACTIVITIES) が空のリストを返すことについて私が見つけた唯一の言及はhereですが、その場合の問題は、メインアプリケーションスレッドの外側で getInstalledPackages() を呼び出すことに関するものだったようで、私の場合はそうではありません.

psこれはジンジャーブレッドの.602 VZWビルドです。

4

1 に答える 1

4

私は同じ問題に遭遇し、より良い回避策を見つけました:

public void listAllActivities() throws NameNotFoundException
{
    List<PackageInfo> packages = getPackageManager().getInstalledPackages(0);
    for(PackageInfo pack : packages)
    {
        ActivityInfo[] activityInfo = getPackageManager().getPackageInfo(pack.packageName, PackageManager.GET_ACTIVITIES).activities;
        Log.i("Pranay", pack.packageName + " has total " + ((activityInfo==null)?0:activityInfo.length) + " activities");
        if(activityInfo!=null)
        {
            for(int i=0; i<activityInfo.length; i++)
            {
                Log.i("PC", pack.packageName + " ::: " + activityInfo[i].name);
            }
        }
    }
}

クエリをPackageManager2 回行う必要があることに注意してください。一度使っgetPackageManager().getInstalledPackages(...)てまた使ってgetPackageManager().getPackageInfo(...)

お役に立てば幸いです。

于 2011-12-14T08:09:28.750 に答える