申明不是原创,忘记是在哪看的啦,网上转的那么多,也不知道谁是原创
只是亲测可用:利用的是java的反射机制,恕我愚钝,还没怎么理解
直接上我工具类里面的方法吧:
/**
* 获取未安装的apk信息
*
* @param ctx
* @param apkPath
* @return
*/
public static AppInfoData getApkFileInfo(Context ctx, String apkPath) {
System.out.println(apkPath);
File apkFile = new File(apkPath);
if (!apkFile.exists() || !apkPath.toLowerCase().endsWith(".apk")) {
System.out.println("文件路径不正确");
return null;
}
AppInfoData appInfoData;
String PATH_PackageParser = "android.content.pm.PackageParser";
String PATH_AssetManager = "android.content.res.AssetManager";
try {
//反射得到pkgParserCls对象并实例化,有参数
Class<?> pkgParserCls = Class.forName(PATH_PackageParser);
Class<?>[] typeArgs = {String.class};
Constructor<?> pkgParserCt = pkgParserCls.getConstructor(typeArgs);
Object[] valueArgs = {apkPath};
Object pkgParser = pkgParserCt.newInstance(valueArgs);
//从pkgParserCls类得到parsePackage方法
DisplayMetrics metrics = new DisplayMetrics();
metrics.setToDefaults();//这个是与显示有关的, 这边使用默认
typeArgs = new Class<?>[]{File.class,String.class,
DisplayMetrics.class,int.class};
Method pkgParser_parsePackageMtd = pkgParserCls.getDeclaredMethod(
"parsePackage", typeArgs);
valueArgs=new Object[]{new File(apkPath),apkPath,metrics,0};
//执行pkgParser_parsePackageMtd方法并返回
Object pkgParserPkg = pkgParser_parsePackageMtd.invoke(pkgParser,
valueArgs);
//从返回的对象得到名为"applicationInfo"的字段对象
if (pkgParserPkg==null) {
return null;
}
Field appInfoFld = pkgParserPkg.getClass().getDeclaredField(
"applicationInfo");
//从对象"pkgParserPkg"得到字段"appInfoFld"的值
if (appInfoFld.get(pkgParserPkg)==null) {
return null;
}
ApplicationInfo info = (ApplicationInfo) appInfoFld
.get(pkgParserPkg);
//反射得到assetMagCls对象并实例化,无参
Class<?> assetMagCls = Class.forName(PATH_AssetManager);
Object assetMag = assetMagCls.newInstance();
//从assetMagCls类得到addAssetPath方法
typeArgs = new Class[1];
typeArgs[0] = String.class;
Method assetMag_addAssetPathMtd = assetMagCls.getDeclaredMethod(
"addAssetPath", typeArgs);
valueArgs = new Object[1];
valueArgs[0] = apkPath;
//执行assetMag_addAssetPathMtd方法
assetMag_addAssetPathMtd.invoke(assetMag, valueArgs);
//得到Resources对象并实例化,有参数
Resources res = ctx.getResources();
typeArgs = new Class[3];
typeArgs[0] = assetMag.getClass();
typeArgs[1] = res.getDisplayMetrics().getClass();
typeArgs[2] = res.getConfiguration().getClass();
Constructor<Resources> resCt = Resources.class
.getConstructor(typeArgs);
valueArgs = new Object[3];
valueArgs[0] = assetMag;
valueArgs[1] = res.getDisplayMetrics();
valueArgs[2] = res.getConfiguration();
res = (Resources) resCt.newInstance(valueArgs);
// 读取apk文件的信息
appInfoData = new AppInfoData();
if (info!=null) {
if (info.icon != 0) {// 图片存在,则读取相关信息
Drawable icon = res.getDrawable(info.icon);// 图标
appInfoData.setAppicon(icon);
}
if (info.labelRes != 0) {
String neme = (String) res.getText(info.labelRes);// 名字
appInfoData.setAppname(neme);
}else {
String apkName=apkFile.getName();
appInfoData.setAppname(apkName.substring(0,apkName.lastIndexOf(".")));
}
String pkgName = info.packageName;// 包名
appInfoData.setApppackage(pkgName);
}else {
return null;
}
PackageManager pm = ctx.getPackageManager();
PackageInfo packageInfo = pm.getPackageArchiveInfo(apkPath, PackageManager.GET_ACTIVITIES);
if (packageInfo != null) {
appInfoData.setAppversion(packageInfo.versionName);//版本号
appInfoData.setAppversionCode(packageInfo.versionCode+"");//版本码
}
return appInfoData;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
分享到:
相关推荐
android获取未安装APK文件的图标 android开发技巧整理
总结,获取本机已安装的APK信息涉及到对Android系统的深入理解,特别是`PackageManager`类的使用。通过`getInstalledPackages()`方法,我们可以得到所有应用的信息,并从中提取出我们需要的数据,如应用名称、包名、...
本文将详细讲解如何通过编程方式获取Android设备上已安装的apk信息,包括应用图标、应用名称、工程名(包名)以及安装路径。 首先,我们需要了解在Android SDK中提供了一个名为`PackageManager`的类,它是获取应用...
2. 获取APK的`PackageInfo`:使用`PackageManager`的`getPackageArchiveInfo()`方法解析APK,获取其包含的类信息、权限等。 3. 创建ClassLoader:通过`DexClassLoader`实例化一个类加载器,它能加载APK中的`.dex`...
在未安装的APK中获取这些资源,需要使用`AssetManager`。首先,通过`Context`的`createPackageContext()`方法创建一个Context对象,然后使用这个Context的`getAssets()`方法获取`AssetManager`实例。接下来,调用`...
而当涉及到与Android平台的交互时,C#也能通过各种手段实现,例如使用Unity3D进行跨平台开发或利用特定的库来获取APK(Android应用程序包)的信息。本篇文章将深入探讨如何使用C#获取安卓APK的各类信息,如版本号、...
因此,获取APK信息的过程应当放在后台进行,常用的方式是使用AsyncTask或者Handler/Looper机制。AsyncTask是一种轻量级的异步任务框架,它提供了在后台线程执行任务并在UI线程更新结果的便利接口。 3. **使用...
PackageManager提供了一个getPackageArchiveInfo方法,用于获取APK文件的信息,而PackageInfo则提供了一个loadIcon方法,用于加载APK图标。下面是一个获取APK图标的示例代码: ```java public static Drawable ...
本主题将深入探讨如何获取已安装的APK信息,包括所有APK、第三方APK、系统APK以及安装在SD卡上的APK。 首先,让我们了解什么是“获取apk”。在Android开发中,获取apk通常指的是通过编程方式访问设备上已安装应用的...
而`GetApkInfo.jar`可能是一个已经封装好的工具类库,专门用于获取APK信息。 获取APK信息的具体步骤如下: 1. 使用`File`类创建一个指向APK文件的实例。 2. 创建`ZipFile`对象,将APK文件作为参数传入,这将允许...
本篇文章将详细介绍如何利用`BundleTool`从AAB包获取APK的安装大小,并实现在手机上的安装步骤。 首先,我们需要理解AAB(Android App Bundle)与传统的APK的区别。AAB是一种新的发布格式,它允许Google Play Store...
1. **读取APK**:首先,我们需要获取到未安装APK的二进制数据。这可以通过FileInputStream或AssetManager完成,将APK文件视为一个普通的二进制文件。 2. **解析APK**:然后,使用ZipFile或JarFile类解析APK,提取...
在这个场景下,"Java获取ipa、apk文件配置信息jar包"提供了这样的功能,它是一个Java库,能够帮助开发者以编程方式解析ipa和apk文件,提取出关键的元数据。 首先,我们要理解如何在Java中处理ipa和apk文件。ipa文件...
获取APK信息是一项重要的任务,对于开发者来说,这有助于理解应用的构成、版本控制以及安全分析。本工具名为"获取APK信息工具",旨在智能地提取APK文件的各种元数据,帮助用户快速了解APK的相关属性。 首先,我们要...
在PHP环境中,我们可能需要获取APK文件的一些元数据信息,例如包名、应用名称、版本名称、支持的屏幕尺寸和语言等。这在自动化部署、应用分析或者构建与APK相关的服务时非常有用。以下是如何使用PHP来实现这些功能的...
在Android平台上,获取手机上所有APK包名的需求通常是用于分析设备上安装的应用程序信息,例如统计应用数量、分析特定应用是否存在或者进行批量操作。这个过程涉及到对Android系统的权限访问以及对文件系统的操作。...
首先,获取APK文件的路径,然后使用`Intent`和`PackageInstaller`来完成安装过程。以下是一个示例函数: ```java public void installApk(Context context, String apkFilePath) { if (Build.VERSION.SDK_INT >=...
### 获取本地已安装APK的知识点详解 #### 一、前言 在Android开发中,有时我们需要获取设备上已安装的应用列表,特别是那些非系统预装的应用程序(即用户自行安装的应用)。这样的需求常见于应用商店类应用或者...
2. **调用API**:使用提供的API,例如`ApkInfo`类,来获取APK信息。一般情况下,这些API会提供一个方法,接受APK文件的路径作为参数,然后返回一个包含包名、版本代码和版本名称的对象。 ```java ApkInfo apkInfo...
1. **反射机制**:反射是Java的一个强大特性,允许程序在运行时获取和操作类、接口、字段和方法的信息。在插件化开发中,主应用通过反射调用插件APK中的类和方法,实现功能的调用。 2. **DexClassLoader**:Android...