我希望使用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()
( 做什么它呢?)。
P.S:对不起,如果这是一个简单的(愚蠢的!)问题:)
答案 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。并解决了问题