Как получить список установленных приложений для Android и выбрать одно для запуска - PullRequest
304 голосов
/ 23 апреля 2010

В начале этой недели я задавал аналогичный вопрос, но до сих пор не понимаю, как получить список всех установленных приложений, а затем выбрать одно для запуска.

Я пробовал:

Intent intent = new Intent(ACTION_MAIN);
intent.addCategory(CATEGORY_LAUNCHER);

и показывает только предустановленное приложение, которое может запускать тип ACTION_MAIN Intent.

Я также знаю, что могу использовать PackageManager для получения всех установленных приложений, но как мне использовать это для запуска определенного приложения?

Ответы [ 17 ]

382 голосов
/ 24 февраля 2011

Вот более чистый способ использования PackageManager

final PackageManager pm = getPackageManager();
//get a list of installed apps.
List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);

for (ApplicationInfo packageInfo : packages) {
    Log.d(TAG, "Installed package :" + packageInfo.packageName);
    Log.d(TAG, "Source dir : " + packageInfo.sourceDir);
    Log.d(TAG, "Launch Activity :" + pm.getLaunchIntentForPackage(packageInfo.packageName)); 
}
// the getLaunchIntentForPackage returns an intent that you can use with startActivity() 

Подробнее здесь http://qtcstation.com/2011/02/how-to-launch-another-app-from-your-app/

262 голосов
/ 23 апреля 2010

Ниже приведен код для получения списка активностей / приложений, установленных на Android:

Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> pkgAppsList = context.getPackageManager().queryIntentActivities( mainIntent, 0);

Вы получите все необходимые данные в ResolveInfo для запуска приложения.Вы можете проверить ResolveInfo Javadoc здесь .

57 голосов
/ 13 декабря 2011

Другой способ фильтрации системных приложений (работает с примером выше):

/**
 * Return whether the given PackgeInfo represents a system package or not.
 * User-installed packages (Market or otherwise) should not be denoted as
 * system packages.
 * 
 * @param pkgInfo
 * @return
 */
private boolean isSystemPackage(PackageInfo pkgInfo) {
    return ((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0);
}
52 голосов
/ 08 ноября 2011

Вот хороший пример:

class PInfo {
    private String appname = "";
    private String pname = "";
    private String versionName = "";
    private int versionCode = 0;
    private Drawable icon;
    private void prettyPrint() {
        Log.v(appname + "\t" + pname + "\t" + versionName + "\t" + versionCode);
    }
}

private ArrayList<PInfo> getPackages() {
    ArrayList<PInfo> apps = getInstalledApps(false); /* false = no system packages */
    final int max = apps.size();
    for (int i=0; i<max; i++) {
        apps.get(i).prettyPrint();
    }
    return apps;
}

private ArrayList<PInfo> getInstalledApps(boolean getSysPackages) {
    ArrayList<PInfo> res = new ArrayList<PInfo>();        
    List<PackageInfo> packs = getPackageManager().getInstalledPackages(0);
    for(int i=0;i<packs.size();i++) {
        PackageInfo p = packs.get(i);
        if ((!getSysPackages) && (p.versionName == null)) {
            continue ;
        }
        PInfo newInfo = new PInfo();
        newInfo.appname = p.applicationInfo.loadLabel(getPackageManager()).toString();
        newInfo.pname = p.packageName;
        newInfo.versionName = p.versionName;
        newInfo.versionCode = p.versionCode;
        newInfo.icon = p.applicationInfo.loadIcon(getPackageManager());
        res.add(newInfo);
    }
    return res; 
}
29 голосов
/ 21 апреля 2013

Получение списка установленных несистемных приложений

public static void installedApps()
{
    List<PackageInfo> packList = getPackageManager().getInstalledPackages(0);
    for (int i=0; i < packList.size(); i++)
    {
        PackageInfo packInfo = packList.get(i);
        if (  (packInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0)
        {
            String appName = packInfo.applicationInfo.loadLabel(getPackageManager()).toString();
            Log.e("App № " + Integer.toString(i), appName);
        }
    }
}
18 голосов
/ 10 января 2011

Чтобы отфильтровать приложения на базе системы:

private boolean isSystemPackage(ResolveInfo ri) {
    return (ri.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
}
16 голосов
/ 16 марта 2012

Чтобы получить все установленные приложения, вы можете использовать Package Manager ..

    List<PackageInfo> apps = getPackageManager().getInstalledPackages(0);

Для запуска вы можете использовать имя пакета

Intent launchApp = getPackageManager().getLaunchIntentForPackage(“package name”)
startActivity(launchApp);

Более подробно вы можете прочитать этот блог http://codebucket.co.in/android-get-list-of-all-installed-apps/

12 голосов
/ 20 февраля 2012

Список установленных приложений на Android-устройстве можно найти с помощью приведенного ниже кода: «packageInfo» содержит информацию об установленных приложениях в устройстве. мы можем получить намерение для приложения, установленного с объект packageinfo и используя startactivity (намерение), может начать приложение. это зависит от вас, как вы организуете интерфейс либо Listview или Gridview. так что на событие клика в зависимости от позиции, вы можете получить намерение объект и начало действия.

final PackageManager pm = getPackageManager();

List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);


for (ApplicationInfo packageInfo : packages) 

{
 if(pm.getLaunchIntentForPackage(packageInfo.packageName)!= null &&   

                   !pm.getLaunchIntentForPackage(packageInfo.packageName).equals(""))


{

    System.out.println("Package Name :" + packageInfo.packageName);

    System.out.println("Launch Intent For Package :"   +  
                  pm.getLaunchIntentForPackage(packageInfo.packageName));

    System.out.println("Application Label :"   + pm.getApplicationLabel(packageInfo));

    System.out.println("Application Label :"   + 
                           pm.getApplicationIcon(packageInfo.packageName).toString());

    System.out.println("i : "+i);

    /*if(i==2)

    {
         startActivity(pm.getLaunchIntentForPackage(packageInfo.packageName));

     break;

    }*/

    i++;

}
}
8 голосов
/ 06 ноября 2012

Если в одном пакете несколько пусковых установок, в коде есть проблема. Например: на LG Optimus Facebook для LG, MySpace для LG, Twitter для LG содержит одно имя пакета SNS, и если вы используете выше, SNS будет повторяться. После нескольких часов исследований я пришел с кодом ниже. Кажется, работает хорошо.

private List<String> getInstalledComponentList()
            throws NameNotFoundException {
        final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
        mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        List<ResolveInfo> ril = getPackageManager().queryIntentActivities(mainIntent, 0);
        List<String> componentList = new ArrayList<String>();
        String name = null;

        for (ResolveInfo ri : ril) {
            if (ri.activityInfo != null) {
                Resources res = getPackageManager().getResourcesForApplication(ri.activityInfo.applicationInfo);
                if (ri.activityInfo.labelRes != 0) {
                    name = res.getString(ri.activityInfo.labelRes);
                } else {
                    name = ri.activityInfo.applicationInfo.loadLabel(
                            getPackageManager()).toString();
                }
                componentList.add(name);
            }
        }
        return componentList;
    }
7 голосов
/ 24 апреля 2015

У меня было требование отфильтровать системные приложения, которые пользователь на самом деле не использует (например, "com.qualcomm.service", "update services" и т. Д.). В конечном итоге я добавил еще одно условие для фильтрации списка приложений. Я только что проверил, имеет ли приложение «намерение запуска».

Итак, результирующий код выглядит как ...

PackageManager pm = getPackageManager();
        List<ApplicationInfo> apps = pm.getInstalledApplications(PackageManager.GET_GIDS);

        for (ApplicationInfo app : apps) {
            if(pm.getLaunchIntentForPackage(app.packageName) != null) {
                // apps with launcher intent
                if((app.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
                    // updated system apps

                } else if ((app.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
                    // system apps

                } else {
                    // user installed apps

                }
                appsList.add(app);
            }

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...