Como obter uma lista de aplicativos Android instalados e escolher um para executar


326

Fiz uma pergunta semelhante a esta no início desta semana, mas ainda não estou entendendo como obter uma lista de todos os aplicativos instalados e, em seguida, escolher um para executar.

Eu tentei:

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

e isso mostra apenas aplicativos pré-instalados ou que podem executar o ACTION_MAINtipo Intent.

Também sei que posso usar PackageManagerpara obter todos os aplicativos instalados, mas como faço para executar um aplicativo específico?


Como você pode obter apenas as informações sobre o aplicativo escolhido na lista?
Pedrum

Respostas:


277

A seguir, está o código para obter a lista de atividades / aplicativos instalados no Android:

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

Você receberá todos os dados necessários ResolveInfopara iniciar um aplicativo. Você pode verificar o ResolveInfojavadoc aqui .


3
Como posso iniciar um desses? Eu recebi o activityInfo dentro do ResolveInfo, mas não consigo inicializá-lo.
Spidey

1
Deixa pra lá, achei. Eu devo criar um novo Intent usando o nome completo da classe (pacote + classe).
Spidey

Como você pode obter apenas as informações sobre o aplicativo escolhido na lista?
Pedrum

1
Eu queria entender a política da loja android / play sobre o meu aplicativo lendo e armazenando uma lista de todos os aplicativos e potencialmente se comunicando com um servidor. Existe alguma orientação?
precisa

1
@ dowjones123 Você encontrou as diretrizes sobre isso?
RmK 27/07

415

Aqui está uma maneira mais limpa de usar o 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() 

Mais informações aqui http://qtcstation.com/2011/02/how-to-launch-another-app-from-your-app/


Funciona gr8. Mas quando tentei isso no Android 4.0.3, nada é impresso !! Qualquer pista ??
Saurabh Verma

Verifique se você não está filtrando as instruções do log de depuração.
QED

Este código está funcionando, no entanto, você tem alguma idéia de como colocar essas listas de aplicativos em um ListView?
androidBoomer

@androidBoomer estou fazendo o mesmo. leia isto aqui - vogella.com/tutorials/AndroidListView/article.html
David T.

@DavidT. Eu já descobri. Agora, estou trabalhando em como acessar esses aplicativos instalados para criar um atalho dentro do meu aplicativo. Isso é possível?
AndroidBoomer

61

Outra maneira de filtrar os aplicativos do sistema (funciona com o exemplo 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);
}

4
Esta é a melhor resposta para filtrar os aplicativos do sistema.
Bjorn

5
Mas eu t filtra appliaction como configurações, mapas ou ..., como listar-los também
Ata

7
A "verdadeira:? Falso" parte de sua instrução de retorno é redundante
k2col

simplifique return ((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)! = 0);
Bhavesh Rangani 05/10

como filtrar aplicativos pagos?
Pemba Tamang 28/11

55

Aqui está um bom exemplo:

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
Como você executa um desses se precisar? Quero dizer, você pode obter a intenção?
Ton

Ótimo. Obrigado pela sua resposta. Eu usei sua resposta no meu aplicativo e tenho um pequeno problema com o tamanho do ícone. a maioria deles é normal e alguns são muito grandes ou pequenos. Como posso consertar isso. Você tem alguma ideia? obrigado
Meysam Valueian

37

Obtendo a lista de aplicativos não pertencentes ao sistema instalados

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

Para filtrar em aplicativos baseados em sistema:

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

18

Para obter todos os aplicativos instalados, você pode usar o Gerenciador de Pacotes.

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

Para executar, você pode usar o nome do pacote

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

Para mais detalhes, você pode ler este blog http://codebucket.co.in/android-get-list-of-all-installed-apps/


Isso é mais direto ao ponto. Podemos definir uma verificação adequada descobrindo nosso aplicativo necessário.
Noman

13

Você pode encontrar a lista de aplicativos instalados no dispositivo Android usando o código abaixo, "packageInfo" Contém informações de aplicativos instalados no dispositivo. podemos recuperar Intent para o aplicativo instalado a partir do objeto packageinfo e, usando startactivity (intent), pode iniciar o aplicativo. depende de você como você organiza a interface do usuário, seja Listview ou Gridview. Assim, no evento de clique com base na posição, é possível recuperar o objeto de intenção e iniciar a intenção de atividade.

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

Eu tinha um requisito para filtrar os aplicativos do sistema que o usuário realmente não usa (por exemplo, "com.qualcomm.service", "serviços de atualização" etc.). Por fim, adicionei outra condição para filtrar a lista de aplicativos. Acabei de verificar se o aplicativo tem 'intenção do iniciador'.

Então, o código resultante se parece com ...

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

        }

Obrigado. O getLaunchIntentForPackage é muito útil para obter os aplicativos presentes na App Drawer :-)
Gabriel Hautclocq

10

Se houver vários lançadores em um pacote acima, o código terá um problema. Por exemplo: no LG Optimus, o Facebook para LG, o MySpace para LG, o Twitter para LG contém o nome de um pacote SNS e, se você usar acima, o SNS repetirá. Depois de horas de pesquisa, eu vim com o código abaixo. Parece funcionar bem.

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: Eu não tenho mais esse código, mas encontrei algo próximo. Eu fiz isso para procurar "componentes" do meu aplicativo, são apenas atividades com uma determinada categoria.

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

Eu comentei a parte em que ele recebe o nome da atividade, mas é bem direto.


6

Solução limpa que filtra aplicativos do sistema com êxito

A idéia por trás dessa solução é que a atividade principal de todo aplicativo do sistema não tenha um ícone de atividade personalizado . Este método me fornece um excelente resultado:

 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

Eu tenho outra solução:

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

Obtenha todos os aplicativos:

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

Verifique se o aplicativo instalado e abra:

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

você pode usar isso:

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);
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.