Cómo obtener una lista de aplicaciones de Android instaladas y elegir una para ejecutar

Resuelto 2Real asked hace 54 años • 24 respuestas

Hice una pregunta similar a esta a principios de esta semana, pero todavía no entiendo cómo obtener una lista de todas las aplicaciones instaladas y luego elegir una para ejecutar.

He intentado:

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

y esto solo muestra las aplicaciones que están preinstaladas o que pueden ejecutar el ACTION_MAINtipo Intent.

También sé que puedo usar PackageManagerpara obtener todas las aplicaciones instaladas, pero ¿cómo uso esto para ejecutar una aplicación específica?

2Real avatar Jan 01 '70 08:01 2Real
Aceptado

Aquí hay una forma más limpia de usar elPackageManager

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() 

Más información aquí http://qtcstation.com/2011/02/how-to-launch-another-app-from-your-app/

Nelson Ramirez avatar Feb 23 '2011 22:02 Nelson Ramirez

A continuación se muestra el código para obtener la lista de actividades/aplicaciones instaladas en Android:

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

Obtendrá todos los datos necesarios para ResolveInfoiniciar una aplicación. Puedes consultar ResolveInfojavadoc aquí .

Karan avatar Apr 23 '2010 06:04 Karan

Otra forma de filtrar por aplicaciones del sistema (funciona con el ejemplo de 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);
}
Kenneth Evans avatar Dec 13 '2011 03:12 Kenneth Evans

Aquí un buen ejemplo:

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; 
}
king9981 avatar Nov 08 '2011 15:11 king9981

Obtener una lista de aplicaciones instaladas que no pertenecen al sistema

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);
        }
    }
}
XXX avatar Apr 21 '2013 08:04 XXX

Para filtrar por aplicaciones basadas en el sistema:

private boolean isSystemPackage(ResolveInfo ri) {
    return (ri.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
}
SamCsharpAs3 avatar Jan 10 '2011 11:01 SamCsharpAs3