Solucionado (ver solução)
Solucionado
(ver solução)
9
respostas

Lista Android

Olá eu estou com uma duvida. Aprendemos a criar uma lista e alimentala utilizando strings no android. Ai me surgiu uma duvida que é a seguinte, eu gostaria de criar um app que listasse os outros aplicativos instalados no aparelho. Como seria a função para alimentar essa lista?

9 respostas

olá Francisco

Você pode pegar todas as apps dessa forma:

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

Com essa lista você vai poder pegar toda a informação necessária e popular uma List<String> para listar visualmente.

Eu tentei implementar mas não deu certo, o código ficou da seguinte forma. O Android Studio diz que não pode resolver o ResolverInfo e o mainIntet.

       Intent intent = new Intent(Intent.ACTION_MAIN, null);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        Context context = null;

        List<ResolveInfo> list = context.getPackageManager().queryIntentActivities( intent, 0);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, list);

        ListView lista_apps = (ListView) findViewById(R.id.ListaApp);
        lista_apps.setAdapter(adapter);

O código que foi feito em aula e que gerava uma lista a partir de strings é esse :

String[] alunos = {"Daniel", "Ronaldo", "Jefferson", "Felipe"};
        ListView lista_alunos = (ListView) findViewById(R.id.ListaAlunos);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1,alunos);
        lista_alunos.setAdapter(adapter);

Francisco, troque o mainIntent por intent. Eu digitei errado antes.

E o ResolveInfo basta você fazer o import, correto? Do pacote android.content.pm

Sim, fiz essas mudanças, o problema agora é que diz que não posso especificar o list no ArrayAdapter

Agora você precisa pegar essa List<ResolveInfo> e criar um novo List<String>, chamando o toString de cada um dos ResolveInfo, e ai passar o List<String> para o adapter

Me desculpe a demora para responder, é que estava continuando o curso e tentando fazer funcionar esse lista de apps. Mas não consegui, você poderia desenvolver o activity para eu poder estudar o código?

Caso queira mandar no e-mail é francisco.frazzon@outlook.com

obg

oi Francisco

Voce manda pra gente o código que ja tem dessa lista e o erro que está dando? Ai corrigimos aqui.

O erro esta acontecendo quando passo o apps para o ArrayAdapter.

public class ListaActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.content_lista);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(ListaActivity.this, android.R.layout.simple_expandable_list_item_1, apps);
        ListView lista_apps = (ListView) findViewById(R.id.ListaApps);
        lista_apps.setAdapter(adapter);

    }

        void listApps() {
        List<ApplicationInfo> apps = getApplicationsInfo(this);
        for (ApplicationInfo info : apps) {

        }
    }

    public static class ApplicationInfo {
        public String label;
        public String name;
        public String packageName;
        public Drawable icon;

        @Override
        public String toString() {
            return "label:" + label + " name:" + name + " packageName:"
                    + packageName + " icon: " + icon.toString();
        }
    }

    ;

    public List<ApplicationInfo> getApplicationsInfo(Context context) {
        List<ApplicationInfo> apps = new ArrayList<ApplicationInfo>();

        Intent intent = new Intent(Intent.ACTION_MAIN, null);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        PackageManager pm = context.getPackageManager();
        List<ResolveInfo> activities = pm.queryIntentActivities(intent, 0);
        Collections.sort(activities, new ResolveInfo.DisplayNameComparator(pm));
        for (ResolveInfo ri : activities) {
            ApplicationInfo info = new ApplicationInfo();
            info.packageName = ri.activityInfo.packageName;
            info.name = ri.activityInfo.name;
            info.label = (String) ri.loadLabel(pm);
            info.icon = ri.activityInfo.loadIcon(pm);
            apps.add(info);
        }


        return apps;
    }


}
solução!

Você ainda não tem a lista instanciada quando chama o adapter. Basta fazer assim:

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.content_lista);

        List<ApplicationInfo> apps = getApplicationsInfo(this);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(ListaActivity.this, android.R.layout.simple_list_item_1, apps);
        ListView lista_apps = (ListView) findViewById(R.id.ListaApps);
        lista_apps.setAdapter(adapter);
    }