各版本通用
/**
* 获取未安装的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;
}
分享到:
相关推荐
总的来说,APK文件图标查看器是一个实用的小工具,它为Android开发者和用户提供了便捷的方式来查看APK的图标,同时也能获取SD卡上的文件信息。结合Visual Studio 2008的强大开发能力,这款工具的使用体验得到了保障...
本主题将深入探讨如何获取已安装的APK信息,包括所有APK、第三方APK、系统APK以及安装在SD卡上的APK。 首先,让我们了解什么是“获取apk”。在Android开发中,获取apk通常指的是通过编程方式访问设备上已安装应用的...
然而,对于非系统应用,用户下载或手动安装的APK可能保存在外部存储(如SD卡)的特定文件夹中。 安装APK的过程分为以下几个步骤: 1. **获取APK文件**:首先,你需要拥有APK文件,这可以通过从Google Play商店下载...
在安卓系统中,SD卡(Secure Digital Card)是设备存储扩展的一种方式,用户可以将照片、音乐、视频、应用程序等数据存储在SD卡上。针对"安卓SD卡文件管理更新信息"这一主题,我们将深入探讨如何获取和管理手机上的...
在Android系统中,获取SD卡(外部存储)信息是开发者常用的功能之一,这通常涉及到读取可用存储空间、总容量等信息。本DEMO提供了一种实现方式,确保了兼容性,可以在多种不同类型的手机上运行。下面我们将详细讨论...
3. 使用具有Root权限的文件管理器,如RE文件管理器,将SD卡上的APK文件移动或复制到系统应用目录下,通常位于/data/app/或/system/app/。 4. 打开移动或复制的APK文件,赋予其适当的权限。在文件属性中,确保“读取...
首先,你需要获取手机中特定应用的APK文件。这些文件通常包括系统自带的应用,如浏览器(Browser.apk)、信息(Conversations.apk)、电话本(Phonebook.apk)、相机(SemcCamera3D.apk和SemcCameraUI.apk)、时钟...
4. **Android权限管理**:为了获取和操作APK,应用可能需要请求`READ_EXTERNAL_STORAGE`和`INTERNET`等权限,前者用于读取存储卡上的APK,后者可能用于上传或下载APK。 5. **用户界面设计**:显示App信息通常会有一...
【描述】这个7z压缩包包含了一个完整的Android项目源代码,通过分析和学习这个源码,开发者可以了解如何在Android平台上获取SD卡的文件系统树,并进行基本的文件操作。这个项目可能是由Java语言编写,遵循了Android...
- 在Android中,访问外部存储(SD卡)需要`READ_EXTERNAL_STORAGE`权限,需要在`AndroidManifest.xml`中声明。 - 使用`Environment.getExternalStorageDirectory()`获取外部存储的根目录。 - 文件操作应处理可能...
您的SD卡正在收集您无法识别的文件和目录。 让我们不要再去了...... 为什么不让一个女仆来清理它? SD Maid将帮助您保持设备整洁,干净整洁:-)! 试一试,你找不到更彻底的清洁工具! 选择一个选项卡,按开始,然后...
如果在开启此功能后遇到"应用程序未安装"的错误,可能是因为SD卡上的临时文件出现问题。具体解决步骤如下: 1. 将手机通过储存模式连接到电脑。 2. 进入SD卡目录下的.android_secure文件夹。 3. 查找并删除名字为...
获取未安装的APK文件通常是指从外部源(如网络、存储卡或文件共享)获取应用程序的安装包。在Android中,你可以允许用户从文件浏览器选择APK文件,然后通过`Intent`进行安装: ```java File apkFile = new File("/...
如果某些程序在SD卡上没有图标,这可能是因为之前未正确安装或卸载的应用留下的数据导致的问题。用户可以进入设置,通过管理应用程序功能,找到那些没有图标的程序并进行卸载,这样再次安装时就不会出错。 3. **...
下载完成后,文件通常会被保存在Android设备的外部存储(SD卡)或内部存储中。Android提供Environment类来获取文件的存储路径,如Environment.DIRECTORY_DOWNLOADS。开发者需要确保拥有写入外部存储的权限(在...
如果出现“应用程序未安装”的提示,可以尝试通过USB连接手机到电脑,并进入SD卡的`.android_secure`文件夹。在这个文件夹内,找到任何与正常应用命名格式不同的文件,如`smdl2tmp1.asec`,将其删除。删除后重新尝试...
1. **Android 文件管理系统**:Android 设备允许用户访问和管理设备上的所有文件,包括内部存储和外部 SD 卡。文件浏览器是实现这一功能的重要工具。 2. **文件管理器功能**:一款好的文件浏览器通常包括浏览目录、...
而对于APK文件,可能需要解析其AndroidManifest.xml来显示应用图标和名称。 小米文件管理器的界面设计也十分人性化,它可能采用了Material Design规范,提供了清晰的分类视图、网格视图和列表视图,用户可以根据...
5. **安装位置**:应用可以安装在内部存储或外部SD卡上。`PackageInfo`类的`installLocation`字段表示安装位置,值为`PackageManager.INSTALL_LOCATION_INTERNAL_ONLY`(内部存储)、`PackageManager.INSTALL_...
2. 移动应用到SD卡:如果设备支持,可以在设置中将部分应用移至外部存储卡,以节省手机内存。 七、安全注意事项 只从可信赖的源下载应用,避免安装包含恶意软件的APK文件。保持Google Play Protect或其他安全软件的...