网上关于"获取未安装的APK图标"的文章满天飞,但都是转帖,运行后的效果却是获取到Android的默认小机器人图标.那个暴寒....
现提供解决方法如下,废话不说,上效果图,见代码:
本方法需要使用到Java反射的知识,具体请参考:
http://java.sun.com/developer/technicalArticles/ALT/Reflection/index.html
借鉴的Android源码出处:
XXoo这个链接好长ooXX
/**
* 获取未安装的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;
}
转自:http://blog.csdn.net/sodino/archive/2011/03/01/6215224.aspx
- 大小: 13.7 KB
分享到:
相关推荐
android获取未安装APK文件的图标 android开发技巧整理
在Android开发中,有时我们需要在运行时加载未安装的APK资源,这通常是出于扩展性或模块化的考虑。本文将详细讲解如何实现这一功能,主要涉及Android加载未安装apk资源的相关知识点。 首先,加载未安装的APK资源...
本文将详细讲解如何通过编程方式获取Android设备上已安装的apk信息,包括应用图标、应用名称、工程名(包名)以及安装路径。 首先,我们需要了解在Android SDK中提供了一个名为`PackageManager`的类,它是获取应用...
在Android平台上,获取手机上所有APK包名的需求通常是用于分析设备上安装的应用程序信息,例如统计应用数量、分析特定应用是否存在或者进行批量操作。这个过程涉及到对Android系统的权限访问以及对文件系统的操作。...
本文将详细讲解如何在Android 7.0设备上下载并安装APK应用,以及在这个版本中与APK安装相关的知识点。 1. **APK 文件**:APK 是 Android 应用程序的安装包,类似于 Windows 上的 .exe 文件。它包含了应用的代码、...
2. 获取APK的`PackageInfo`:使用`PackageManager`的`getPackageArchiveInfo()`方法解析APK,获取其包含的类信息、权限等。 3. 创建ClassLoader:通过`DexClassLoader`实例化一个类加载器,它能加载APK中的`.dex`...
1. **读取APK**:首先,我们需要获取到未安装APK的二进制数据。这可以通过FileInputStream或AssetManager完成,将APK文件视为一个普通的二进制文件。 2. **解析APK**:然后,使用ZipFile或JarFile类解析APK,提取...
首先,获取APK文件的路径,然后使用`Intent`和`PackageInstaller`来完成安装过程。以下是一个示例函数: ```java public void installApk(Context context, String apkFilePath) { if (Build.VERSION.SDK_INT >=...
然而,有一种特殊的技术使得Android App能够调用并使用未安装的APK文件,这种技术被称为“插件化开发”。本项目名为"ApkDemo",它是一个Android Studio工程,包含两个模块:一个是主应用程序(主apk工程),另一个是...
在Android开发中,有时我们需要获取手机上已安装的APK应用信息,这可能涉及到应用的元数据、权限、版本信息等。本示例将详细解释如何实现这一功能,并通过异步加载来避免阻塞主线程,提升用户体验。下面我们将深入...
在Android系统中,静默安装APK(Silent Install)是指在用户无感知的情况下自动安装应用程序。这通常需要系统的特殊权限,因为出于安全考虑,Android系统默认不允许非系统应用进行后台安装。在Android 10中,由于...
本示例“android应用下载安装apk升级版本实现demo适配Android10”聚焦于如何在Android 10(API级别29)及更高版本中实现这一过程。以下是关于这一主题的详细知识: 1. **安全下载APK**:在Android 10中,为了保障...
Android 获取未安装的APK图标、版本号、包名等信息方法 Android 获取未安装的APK图标、版本号、包名等信息方法是 Android 应用程序开发中的一种常见需求。通过本文,我们将学习如何获取未安装的APK图标、版本号、包...
在Android系统中,获取本机已安装的APK(应用程序)信息是一项常见的需求,这有助于开发者分析设备上的应用状态,或者实现类似应用管理的功能。本文将深入探讨如何通过编程方式获取这些信息,主要关注Java和Kotlin两...
1. **网络请求**:Android设备通过HTTP或HTTPS协议向服务器发送请求,获取APK文件。可以使用Android的`HttpURLConnection`或者第三方库如OkHttp来实现。 2. **保存APK**:下载的APK文件通常被保存到设备的下载目录,...
1. 网络请求:首先,需要通过HTTP或HTTPS协议从服务器获取APK文件。可以使用Android的HttpURLConnection类,或者第三方库如Volley、OkHttp等进行网络请求。 2. 文件保存:下载的APK数据会被保存到设备的特定目录,...
在Android开发过程中,为了测试和调试应用程序,我们通常需要在设备或模拟器上安装APK文件。本篇文章将深入探讨如何在Android模拟器上安装APK,这对于开发者来说是一项基本技能,尤其当实体设备不在手边时。我们将...
这款APK安装器允许用户从第三方来源安装APK,扩展了Android设备的应用获取途径。 首先,我们来了解一下APK文件。APK是Android应用程序的编译结果,包含了应用的所有代码、资源、库和配置文件。当开发者完成一个...
获取APK权限列表的方法主要有以下几种: 1. **使用Android SDK工具**: - `aapt`(Android Asset Packaging Tool)是Android SDK的一部分,可以用来解析APK文件。通过运行命令`aapt dump permissions <apk_path>`...
在Android开发中,有时我们需要实现一个特定的需求:客户端在安装APK后,通过网络通知服务端这个过程已经完成。这通常涉及到Android系统的广播接收器(BroadcastReceiver)和Socket通信技术。接下来,我们将深入探讨...