getPackageManager和MockPackageManager

时间:2017-12-04 15:05:11

标签: java android

我希望使用getInstalledApplications()类中的MockPackageManager方法 在设备上获取已安装应用的列表(是的,不推荐使用)。我使用了以下代码(在我的活动中):

MockPackageManager mpm = new MockPackageManager();
List<ApplicationInfo> appInfoList = mpm.getInstalledApplications(0);

但它给了我这个错误:

java.lang.NoClassDefFoundError: Failed resolution of: Landroid/test/mock/MockPackageManager;

然后找到了这种方式(有效):

 List<ApplicationInfo> appInfoList = getPackageManager().getInstalledApplications(0);

我查看了Android文档,但只找到了这些:

  

用于检索与当前安装在设备上的应用程序包相关的各种信息的类。您可以通过getPackageManager()找到此类。 [PackageManager docs]

     

返回PackageManager实例以查找全局包信息。[有关getPackageManager()的上下文文档

我真的不明白为什么第一种方式是错误的为什么我应该首先使用getPackageManager() 做什么它呢?)。

提前Tnx。

P.S:对不起,如果这是一个简单的(愚蠢的!)问题:)

2 个答案:

答案 0 :(得分:0)

如官方文档here中所述,MockPackageManager是一个(不推荐使用的)测试类,用于模拟包管理器行为。

在说明中有说明:

  

所有方法都是非功能性的并抛出   UnsupportedOperationException异常。覆盖它以提供操作   你需要的。

仅当您想要测试涉及包管理器的一些代码时,这才有用。

要访问真实的实现,您必须使用真正的PackageManager

PackageManager pManager = getPackageManager(); //in a context environment

PackageManager pManager = context.getPackageManager(); //in a non-context environment

答案 1 :(得分:0)

    try {
        if (ActivityCompat.checkSelfPermission(this, mPermission)
                != MockPackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(this, new String[]{mPermission},
                    REQUEST_CODE_PERMISSION);

            //  If any permission above not allowed by user, this condition will
            //  execute every time, else your else part will work
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

那是我的代码段。我有一个错误MockPackageManager。然后我将其更改为PackageManager。并解决了问题