简体   繁体   English

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

[英]Getting Null Context when trying to retrieve PackageInfo

Spent the entire day on this but can't get it to work. 花了整整一整天的时间,但无法正常工作。

I'm trying to create an app drawer. 我正在尝试创建一个应用程序抽屉。 I want get a list of currently installed applications and then put it in an GridLayout. 我想要获取当前安装的应用程序列表,然后将其放入GridLayout中。

I'm getting a nullPointerException when I try to call getPackageManager from a class that extends my MainActivity. 当我尝试从扩展MainActivity的类中调用getPackageManager时,出现nullPointerException。

InstalledApp class: 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;
}

} }

In MainActivity: 在MainActivity中:

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

Log cat: 日志猫:

     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)

Thanks in advance! 提前致谢! :) :)

You are creating InstalledApp installedApp = new InstalledApp(this); 您正在创建InstalledApp installedApp = new InstalledApp(this); installedApp object which is extending Activity, but this activity is not created by the system but by you. installedApp对象,它扩展了Activity,但此活动不是由系统而是由您创建的。 So this InstalledApp object does not have Context object bounded to system. 因此,此InstalledApp对象没有与系统绑定的Context对象。

Invoke of getPackageManager().getInstalledPackages(0); 调用getPackageManager().getInstalledPackages(0); is possible because MainActivity extending Context, but its null... 可能是因为MainActivity扩展了Context,但是它的null ...

Better does not extend MainActivity with InstalledApp. Better不会通过InstalledApp扩展MainActivity。 And use context. getPackageManager().getInstalledPackages(0); 并使用context. getPackageManager().getInstalledPackages(0); context. getPackageManager().getInstalledPackages(0); context field which you pass in InstalledApp constructor 您在InstalledApp构造函数中传递的上下文字段

You cannot just create a subclass of Activity , create an instance of it manually, and expect it to work. 您不能只创建Activity的子类,手动创建它的实例,并期望它能工作。

Move the getPackages() and getInstalledApps() methods into MainActivity , and you will have better luck. getPackages()getInstalledApps()方法移至MainActivity ,您会获得更好的运气。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM