网上找的大都是已安装应用的判断方法,那么如何判断未安装的apk是否是桌面应用呢?
直接上代码:
private boolean isLauncherApp(String dexPath) {
boolean isHomeCategory = false;
try {
Class classPackageParser = Class.forName("android.content.pm.PackageParser");
Object objectPackageParser = classPackageParser.newInstance();
File sourceFile = new File(dexPath);
Method method = classPackageParser.getDeclaredMethod("parsePackage", File.class, int.class);
method.setAccessible(true);
Object objectPackage = method.invoke(objectPackageParser, sourceFile, 0);
Field fieldActivities = objectPackage.getClass().getDeclaredField("activities");
fieldActivities.setAccessible(true);
ArrayList objectActivities = (ArrayList) fieldActivities.get(objectPackage);
p1: for (int i = 0; i < objectActivities.size(); i++) {
Object objectActivity = objectActivities.get(i);
Field fieldIntents = objectActivity.getClass().getField("intents");
fieldIntents.setAccessible(true);
ArrayList<IntentFilter> objectIntents = (ArrayList<IntentFilter>) fieldIntents.get(objectActivity);
for (int j = 0; j < objectIntents.size(); j++) {
// int actionCounts = objectIntents.get(j).countActions();
/*for (int k = 0; k < actionCounts; k++) {
String strAction = objectIntents.get(j).getAction(k);
if (strAction != null && strAction.equals(Intent.ACTION_MAIN)) {
isMainAction = true;
}
}*/
int categoryCounts = objectIntents.get(j).countCategories();
for (int l = 0; l < categoryCounts; l++) {
String strCategory = objectIntents.get(j).getCategory(l);
if (strCategory != null && strCategory.equals(Intent.CATEGORY_HOME)) {
isHomeCategory = true;
break p1;
}
}
}
}
} catch (Exception e) {
System.out.println(e.toString());
}
return isHomeCategory;
}
补充一下,改方法的参数为APK的路径+文件名。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)