Як отримати список встановлених додатків для Android та вибрати одне для запуску


326

Я задавав подібне запитання до цього на початку цього тижня, але я все ще не розумію, як отримати список усіх встановлених програм, а потім вибрати одне для запуску.

Я спробував:

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

і це показує лише програми, які попередньо встановлені або можуть запускати ACTION_MAINтип Intent.

Я також знаю, що можу PackageManagerотримати всі встановлені програми, але як це використовувати для запуску певної програми?


Як ви можете отримати лише інформацію про вибраний додаток у списку?
Педрум

Відповіді:


277

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

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

Ви отримаєте всі необхідні дані у програмі ResolveInfoдля запуску програми. Ви можете перевірити ResolveInfojavadoc тут .


3
Як я можу розпочати одне з них? Я отримав ActivityInfo всередині ResolveInfo, але не можу його запустити.
Spidey

1
Не забувай, знайшов. Я повинен створити новий Намір, використовуючи повне ім’я класу (пакет + клас).
Spidey

Як ви можете отримати лише інформацію про вибраний додаток у списку?
Педрум

1
Я хотів розібратися в політиці магазину Android / Play щодо того, як моє додаток читає та зберігає список усіх додатків та потенційно спілкується з сервером. Чи є якісь вказівки?
dowjones123

1
@ dowjones123 Чи траплялось вам знайти вказівки щодо цього?
RmK

415

Ось більш чистий спосіб використання 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/


Працює гр8. Але якщо спробувати це на Android 4.0.3, нічого не надрукується !! Будь-який підказ ??
Саурах Верма

Переконайтеся, що ви не фільтруєте оператори журналу налагодження.
QED

Цей код працює, однак ви маєте уявлення про те, як розмістити цей список додатків у ListView?
androidBoomer

@androidBoomer ім робить те саме. читайте тут - vogella.com/tutorials/AndroidListView/article.html
Девід Т.

@DavidT. Я вже зрозумів це. Тепер я працюю над тим, як я можу отримати доступ до встановленого додатка, щоб створити ярлик у моєму додатку. Це можливо?
androidBoomer

61

Ще один спосіб фільтрації на системних додатках (працює з прикладом king9981):

/**
 * Return whether the given PackageInfo 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);
}

4
Це найкраща відповідь для фільтрації системних програм.
Бьорн

5
Але я т фільтрує appliaction як настройки, карти, або ..., як перерахувати їх теж
Ata

7
Частина вашої заяви про повернення "? True: false" є зайвою
k2col

спростити повернення ((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)! = 0);
Bhavesh Rangani

як відфільтрувати платні додатки?
Pemba Tamang

55

Ось хороший приклад:

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

1
Як виконати одну з таких, якщо потрібно? Я маю на увазі, чи можете ви отримати наміри?
Тон

Чудово. Дякую за вашу відповідь. Я використав вашу відповідь у своїй заяві, і у мене є невелика проблема з розміром піктограми. більшість з них є нормальними, а деякі - дуже великими або маленькими. Як я можу це виправити. У вас є ідея? спасибі
Мейсам Валуеян

36

Отримання списку встановлених несистемних додатків

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

19

Щоб фільтрувати на додатках на основі синтезу:

private boolean isSystemPackage(ResolveInfo ri) {
    return (ri.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
}

18

Щоб отримати інстальовані додатки, ви можете скористатися Менеджером пакунків ..

    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/


Це більше до речі. Ми можемо встановити правильну перевірку, дізнавшись потрібну програму.
Номан

13

Ви можете знайти Список встановлених програм на пристрої Android, скориставшись наведеним нижче кодом, "packageInfo" Містить інформацію про встановлену програму на пристрої. ми можемо отримати інтенцію для програми, встановленої з об'єкта packageinfo, і, використовуючи стартактивність (наміри), можемо запустити додаток. від вас залежить, як ви впорядковуєте інтерфейс або 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++;

}
}

13

У мене була вимога відфільтрувати системні додатки, які користувач насправді не використовує (наприклад, "com.qualcomm.service", "служби оновлення" тощо). Зрештою я додав ще одну умову відфільтрувати список програм. Я щойно перевірив, чи додаток має "наміри запуску".

Отже, отриманий код виглядає як ...

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

        }

Дякую. GetLaunchIntentForPackage дуже корисний, щоб отримати програми, присутні в
ящику

10

Якщо в одному пакеті вище коду є кілька пускових установок, є проблема. Наприклад: в 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

@Jas: У мене цього коду більше немає, але я знайшов щось близьке. Я зробив це для пошуку "компонентів" моєї програми, вони є лише діяльністю із заданою категорією.

private List<String> getInstalledComponentList() {
    Intent componentSearchIntent = new Intent();
    componentSearchIntent.addCategory(Constants.COMPONENTS_INTENT_CATEGORY);
    componentSearchIntent.setAction(Constants.COMPONENTS_INTENT_ACTION_DEFAULT);
    List<ResolveInfo> ril = getPackageManager().queryIntentActivities(componentSearchIntent, PackageManager.MATCH_DEFAULT_ONLY);
    List<String> componentList = new ArrayList<String>();
    Log.d(LOG_TAG, "Search for installed components found " + ril.size() + " matches.");
    for (ResolveInfo ri : ril) {
        if (ri.activityInfo != null) {
            componentList.add(ri.activityInfo.packageName);// + ri.activityInfo.name);
            Log.d(LOG_TAG, "Found installed: " + componentList.get(componentList.size()-1));
        }
    }
    return componentList;
}

Я прокоментував частину, де вона отримує назву діяльності, але це досить просто.


6

Чисте рішення, яке успішно фільтрує системні програми

Ідея цього рішення полягає в тому, що основна діяльність кожного системного додатка не має спеціального значка активності . Цей метод дає мені відмінний результат:

 public static Set<PackageInfo> getInstalledApps(Context ctx) {
    final PackageManager packageManager = ctx.getPackageManager();

    final List<PackageInfo> allInstalledPackages = packageManager.getInstalledPackages(PackageManager.GET_META_DATA);
    final Set<PackageInfo> filteredPackages = new HashSet();

    Drawable defaultActivityIcon = packageManager.getDefaultActivityIcon();

    for(PackageInfo each : allInstalledPackages) {
        if(ctx.getPackageName().equals(each.packageName)) {
            continue;  // skip own app
        }

        try {
            // add only apps with application icon
            Intent intentOfStartActivity = packageManager.getLaunchIntentForPackage(each.packageName);
            if(intentOfStartActivity == null)
                continue;

            Drawable applicationIcon = packageManager.getActivityIcon(intentOfStartActivity);
            if(applicationIcon != null && !defaultActivityIcon.equals(applicationIcon)) {
                filteredPackages.add(each);
            }
        } catch (PackageManager.NameNotFoundException e) {
            Log.i("MyTag", "Unknown package name " + each.packageName);
        }
    }

    return filteredPackages;
}

3
private static boolean isThisASystemPackage(Context context, PackageInfo  packageInfo ) {
        try {
            PackageInfo sys = context.getPackageManager().getPackageInfo("android", PackageManager.GET_SIGNATURES);
            return (packageInfo != null && packageInfo.signatures != null &&
                    sys.signatures[0].equals(packageInfo.signatures[0]));
        } catch (NameNotFoundException e) {
            return false;
        }
    }

2

У мене є ще одне рішення:

ArrayList<AppInfo> myAppsToUpdate;

    // How to get the system and the user apps.
    public ArrayList<AppInfo> getAppsToUpdate() {

        PackageManager pm = App.getContext().getPackageManager();
        List<ApplicationInfo> installedApps = pm.getInstalledApplications(0);
        myAppsToUpdate = new ArrayList<AppInfo>();
        for (ApplicationInfo aInfo : installedApps) {

            if ((aInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
                // System apps 
            } else {
                // Users apps
                AppInfo appInfo = new AppInfo();
                appInfo.setAppName(aInfo.loadLabel(pm).toString());
                appInfo.setPackageName(aInfo.packageName);
                appInfo.setLaunchActivity(pm.getLaunchIntentForPackage(aInfo.packageName).toString());
                try {
                    PackageInfo info = pm.getPackageInfo(aInfo.packageName, 0);
                    appInfo.setVersionName(info.versionName.toString());
                    appInfo.setVersionCode("" + info.versionCode);
                    myAppsToUpdate.add(appInfo);
                } catch (NameNotFoundException e) {
                    Log.e("ERROR", "we could not get the user's apps");
                }

            }
        }
        return myAppsToUpdate;
    }

2

Отримайте всі програми:

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

Перевірте, чи встановлено додаток, а потім відкрийте:

if((app.flags & (ApplicationInfo.FLAG_UPDATED_SYSTEM_APP | ApplicationInfo.FLAG_SYSTEM)) > 0) {
                String app_package = app.packageName;
Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage(app_package);
context.startActivity(launchIntent);

0

Ви можете скористатися цим:

PackageManager pm = getApplicationContext().getPackageManager();
                List<ResolveInfo> activityList = pm.queryIntentActivities(shareIntent, 0);
                for (final ResolveInfo app : activityList) 
                {
                   if ((app.activityInfo.name).contains("facebook")) 
                   {
                     // facebook  
                   }

                   if ((app.activityInfo.name).contains("android.gm")) 
                   {
                     // gmail  
                   }

                   if ((app.activityInfo.name).contains("mms")) 
                   {
                     // android messaging app
                   }

                   if ((app.activityInfo.name).contains("com.android.bluetooth")) 
                   {
                     // android bluetooth  
                   }
                }

0
public static List<ApplicationInfo> getApplications(Context context) {
    return context.getPackageManager().getInstalledApplications(PackageManager.GET_META_DATA);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.