Java 尝试检索PackageInfo时获取空上下文

Java 尝试检索PackageInfo时获取空上下文,java,android,android-package-managers,Java,Android,Android Package Managers,花了一整天的时间在这上面,但没能让它发挥作用 我正在尝试创建一个应用程序抽屉。 我想得到一个当前安装的应用程序列表,然后把它放在GridLayout中 当我试图从扩展MainActivity的类调用getPackageManager时,我得到了一个nullPointerException InstalledApp类: public class InstalledApp extends MainActivity { Context context = this; public Installed

花了一整天的时间在这上面,但没能让它发挥作用

我正在尝试创建一个应用程序抽屉。 我想得到一个当前安装的应用程序列表,然后把它放在GridLayout中

当我试图从扩展MainActivity的类调用
getPackageManager
时,我得到了一个nullPointerException

InstalledApp类:

public class InstalledApp extends MainActivity {
Context context = this;

public InstalledApp(Context c) {
    this.context = c;
}

class PInfo {
    public String appname = "";
    public String pname = "";
    public String versionName = "";
    public int versionCode = 0;
    public Drawable icon;
    public void prettyPrint() {
        System.out.println(appname + "\t" + pname + "\t" + versionName + "\t" + versionCode);
    }
}

public ArrayList<PInfo> getPackages() {
    ArrayList<PInfo> apps = getInstalledApps(false); /* false = no system packages */ //Line 29
    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<>();
    List<PackageInfo> packs = getPackageManager().getInstalledPackages(0); //line 39
    for( int i = 0; i < packs.size(); i++ ) {
        PackageInfo p = packs.get(i);
        if ((!getSysPackages) && (p.versionName == null)) {
            continue ;
        }
        InstalledApp.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;
}

提前感谢!:)

您不能只创建
活动的子类
,手动创建它的实例,然后期望它工作


getPackages()
getInstalledApps()
方法移动到
MainActivity
中,您会有更好的运气。

您不能只创建
Activity
的子类,手动创建它的实例,并期望它工作


getPackages()
getInstalledApps()
方法移动到
MainActivity
中,您会有更好的运气。

您正在创建InstalledApp InstalledApp=new InstalledApp(此)installedApp对象,该对象正在扩展活动,但此活动不是由系统创建的,而是由您创建的。因此,此InstalledApp对象没有绑定到系统的上下文对象

调用
getPackageManager().getInstalledPackages(0)是可能的,因为MainActivity扩展了上下文,但它的null


Better不使用InstalledApp扩展MainActivity。并使用
上下文。getPackageManager().getInstalledPackages(0)您在InstalledApp构造函数中传递的上下文字段

您正在创建的InstalledApp InstalledApp=new InstalledApp(此)
installedApp对象,该对象正在扩展活动,但此活动不是由系统创建的,而是由您创建的。因此,此InstalledApp对象没有绑定到系统的上下文对象

调用
getPackageManager().getInstalledPackages(0)是可能的,因为MainActivity扩展了上下文,但它的null


Better不使用InstalledApp扩展MainActivity。并使用
上下文。getPackageManager().getInstalledPackages(0)在InstalledApp构造函数中传递的上下文字段

为什么用于获取包的某些InstalledApp类帮助程序正在扩展活动?为什么用于获取包的某些InstalledApp类帮助程序正在扩展活动?
InstalledApp installedApp = new InstalledApp(this);
    ArrayList<InstalledApp.PInfo> pInfoArrayList = installedApp.getPackages(); //Line 73
    GridAdapter adapter = new GridAdapter(this, pInfoArrayList);
    gridLayout.setAdapter(adapter);

    gridLayout.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
            Toast.makeText(MainActivity.this, "" + position, Toast.LENGTH_SHORT).show();
        }
    });
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.PackageManager android.content.Context.getPackageManager()' on a null object reference
        at android.content.ContextWrapper.getPackageManager(ContextWrapper.java:90)
        at squaredem.materiallauncher.InstalledApp.getInstalledApps(InstalledApp.java:39)
        at squaredem.materiallauncher.InstalledApp.getPackages(InstalledApp.java:29)
        at squaredem.materiallauncher.MainActivity.onCreate(MainActivity.java:73)