getPackageManager () .getInstalledPackages (PackageManager.GET_ACTIVITIES) возвращает ноль - PullRequest
5 голосов
/ 11 сентября 2011

Если я позвоню

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

Я получаю список установленных пакетов, включая любых провайдеров, которых они объявляют (т. Е. Pis [i] .providers, возможно, не равен нулю).

Однако, если я включу PackageManager.GET_ACITIVITIES среди флагов, как в

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

Я ожидаю получить «тот же» список установленных пакетов, но с pis [i] .activities также ненулевым. Но я не получаю, я получаю пустой список.

Есть ли что-то особенное в том, чтобы включить 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), возвращающий пустой список, можно найти только здесь , но проблема в этом случае заключается в вызове getInstalledPackages () вне основного потока приложения. и это не ситуация в моем случае.

p.s. это сборка Gingerbread .602 VZW на случай, если

1 Ответ

4 голосов
/ 14 декабря 2011

Я столкнулся с той же проблемой и нашел лучший обходной путь:

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);
            }
        }
    }
}

Обратите внимание, что мне нужно запросить PackageManager дважды.После использования getPackageManager().getInstalledPackages(...) и еще раз с помощью getPackageManager().getPackageInfo(...)

Надеюсь, это поможет.

...