Как использовать getPackageManager? - PullRequest
0 голосов
/ 23 ноября 2011

Чтобы показать установленные приложения на эмуляторе Android, я попробовал этот код.Он успешно компилируется, но не работает.Что не так?

package pack.GetAllInstalledApplications;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.pm.PackageInfo;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

 public class GetAllInstalledApplicationsExample extends Activity {

 public  ArrayList <PackageInfoStruct> res = new ArrayList <PackageInfoStruct>();

 public ListView list;
 public String app_labels[];


 public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        getPackages();

        list = (ListView)findViewById(R.id.ListView01);
        try{
            list.setAdapter(new ArrayAdapter<String>         (this,android.R.layout.simple_dropdown_item_1line,app_labels));
        }catch(Exception e){
            System.out.println("Err ++> " + e.getMessage());
               Toast.makeText(getApplicationContext(),e.getMessage(),Toast.LENGTH_SHORT).show();
        }

 }
private ArrayList
 <PackageInfoStruct> getPackages() {
    ArrayList
 <PackageInfoStruct> apps = getInstalledApps(false);
    final int max = apps.size();
    for (int i=0; i < max; i++) {
        apps.get(i);
    }
    return apps;
}

private ArrayList
  <PackageInfoStruct> getInstalledApps(boolean getSysPackages) {

    List
  <PackageInfo> packs = getPackageManager().getInstalledPackages(0);
    try{
        app_labels = new String[packs.size()];
    }catch(Exception e){
                   Toast.makeText(getApplicationContext(),e.getMessage(),Toast.LENGTH_SHORT).show();
    }
    for(int i=0;i < packs.size();i++) {
        PackageInfo p = packs.get(i);
        if ((!getSysPackages) && (p.versionName == null)) {
            continue ;
        }
        PackageInfoStruct newInfo = new PackageInfoStruct();
        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);

        app_labels[i] = newInfo.appname;
    }
    return res;
}
    }  
  class PackageInfoStruct {             
 String appname = "";           
 String pname = "";             
 String versionName = "";      
 int versionCode = 0;           
 Drawable icon;                 
  }

Ответы [ 4 ]

0 голосов
/ 15 октября 2014

Это может быть проблема с вашим списком.Вы можете создать собственный элемент ListView, который имеет как ImageView, так и текстовое представление для отображения как нарисованного изображения вашего пакета, так и имени пакета.

создать элемент списка - list_single.xml

поместите этот XML-файлв вашем ресурсе / макете.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:orientation="horizontal" >
 <ImageView
 android:id="@+id/icon"
 android:layout_width="50dp"
 android:layout_height="50dp"
 android:layout_marginBottom="5dp"
 android:layout_marginLeft="5dp"
 android:layout_marginRight="5dp"
 android:layout_marginTop="5dp"
 android:src="@drawable/ic_launcher" />
 <TextView
 android:id="@+id/Itemname"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:textSize="20sp" 
 android:paddingTop="5dp"/>
</LinearLayout>

main_activity.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="{relativePackage}.${activityClass}" >

 <ListView
 android:id="@+id/android:list"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent" />
</RelativeLayout>

Наконец, ваш файл MainActivity.java

public class MainActivity extends ListActivity {

 String[] itemname ={
 "Safari",
 "Camera",
 "Global",
 "FireFox",
 "UC Browser",
 "Android Folder",
 "VLC Player",
 "Cold War"
 };

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

 this.setListAdapter(new ArrayAdapter<String>(
 this, R.layout.mylist,
 R.id.Itemname,itemname));
 }
}

ПРИМЕЧАНИЕ. Обратите внимание, что вместо использованияодин из типов макетов по умолчанию, в этом примере вы используете свой собственный определяемый макет:

this.setListAdapter(new ArrayAdapter<String>(
 this, R.layout.mylist,
 R.id.Itemname,itemname));
0 голосов
/ 23 ноября 2011

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

Помните, что конструктор ArrayAdapter получает в качестве второго параметра идентификатор ресурса текстового представления (в противном случае происходит сбой), поэтому убедитесь в этом.

Более того, для сброса системного пакета я использую следующую строку кода:

... if ((pi.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)! = 0) continue;...

где pi - это PackageInfo.

Дайте мне знать, если это работает

0 голосов
/ 11 мая 2012

Я меняю раскладку адаптера, использую android.R.layout.simple_list_item_1 в вашем коде, и он работает.

0 голосов
/ 23 ноября 2011

При звонке на list.setAdapter вам, вероятно, следует использовать другую раскладку. Я пытался simple_list_item_1

list.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, app_labels));

и, следовательно, элементы отображаются правильно.

...