`
hsx9566
  • 浏览: 175389 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

获取SD卡上 未安装 APK文件 的图标等

阅读更多
各版本通用

/**
	 * 获取未安装的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 文件图标查看器

    总的来说,APK文件图标查看器是一个实用的小工具,它为Android开发者和用户提供了便捷的方式来查看APK的图标,同时也能获取SD卡上的文件信息。结合Visual Studio 2008的强大开发能力,这款工具的使用体验得到了保障...

    获取安装的apk

    本主题将深入探讨如何获取已安装的APK信息,包括所有APK、第三方APK、系统APK以及安装在SD卡上的APK。 首先,让我们了解什么是“获取apk”。在Android开发中,获取apk通常指的是通过编程方式访问设备上已安装应用的...

    android安装系统目录下的APK包

    然而,对于非系统应用,用户下载或手动安装的APK可能保存在外部存储(如SD卡)的特定文件夹中。 安装APK的过程分为以下几个步骤: 1. **获取APK文件**:首先,你需要拥有APK文件,这可以通过从Google Play商店下载...

    安卓SD卡文件管理更新信息相关-获取手机应用信息.rar

    在安卓系统中,SD卡(Secure Digital Card)是设备存储扩展的一种方式,用户可以将照片、音乐、视频、应用程序等数据存储在SD卡上。针对"安卓SD卡文件管理更新信息"这一主题,我们将深入探讨如何获取和管理手机上的...

    Android获取SD卡信息的接口

    在Android系统中,获取SD卡(外部存储)信息是开发者常用的功能之一,这通常涉及到读取可用存储空间、总容量等信息。本DEMO提供了一种实现方式,确保了兼容性,可以在多种不同类型的手机上运行。下面我们将详细讨论...

    安卓系统“应用程序未安装”解决方法.pdf

    3. 使用具有Root权限的文件管理器,如RE文件管理器,将SD卡上的APK文件移动或复制到系统应用目录下,通常位于/data/app/或/system/app/。 4. 打开移动或复制的APK文件,赋予其适当的权限。在文件属性中,确保“读取...

    android手机系统图标替换教程借鉴.pdf

    首先,你需要获取手机中特定应用的APK文件。这些文件通常包括系统自带的应用,如浏览器(Browser.apk)、信息(Conversations.apk)、电话本(Phonebook.apk)、相机(SemcCamera3D.apk和SemcCameraUI.apk)、时钟...

    get app_Getapk_android_

    4. **Android权限管理**:为了获取和操作APK,应用可能需要请求`READ_EXTERNAL_STORAGE`和`INTERNET`等权限,前者用于读取存储卡上的APK,后者可能用于上传或下载APK。 5. **用户界面设计**:显示App信息通常会有一...

    安卓Android源码——GetSDTree(简单SD卡文件浏览器).7z

    【描述】这个7z压缩包包含了一个完整的Android项目源代码,通过分析和学习这个源码,开发者可以了解如何在Android平台上获取SD卡的文件系统树,并进行基本的文件操作。这个项目可能是由Java语言编写,遵循了Android...

    AudioTest.apk的源码

    - 在Android中,访问外部存储(SD卡)需要`READ_EXTERNAL_STORAGE`权限,需要在`AndroidManifest.xml`中声明。 - 使用`Environment.getExternalStorageDirectory()`获取外部存储的根目录。 - 文件操作应处理可能...

    SD Maid Pro 4.13.4.apk

    您的SD卡正在收集您无法识别的文件和目录。 让我们不要再去了...... 为什么不让一个女仆来清理它? SD Maid将帮助您保持设备整洁,干净整洁:-)! 试一试,你找不到更彻底的清洁工具! 选择一个选项卡,按开始,然后...

    解决安卓应用程序未安装的三种方法 (2).pdf

    如果在开启此功能后遇到"应用程序未安装"的错误,可能是因为SD卡上的临时文件出现问题。具体解决步骤如下: 1. 将手机通过储存模式连接到电脑。 2. 进入SD卡目录下的.android_secure文件夹。 3. 查找并删除名字为...

    获取手机本地的应用

    获取未安装的APK文件通常是指从外部源(如网络、存储卡或文件共享)获取应用程序的安装包。在Android中,你可以允许用户从文件浏览器选择APK文件,然后通过`Intent`进行安装: ```java File apkFile = new File("/...

    Android解决应用程序未安装的三种方法.pdf

    如果某些程序在SD卡上没有图标,这可能是因为之前未正确安装或卸载的应用留下的数据导致的问题。用户可以进入设置,通过管理应用程序功能,找到那些没有图标的程序并进行卸载,这样再次安装时就不会出错。 3. **...

    安卓文件下载上传解压相关-Android实现应用下载后自动安装源码.zip

    下载完成后,文件通常会被保存在Android设备的外部存储(SD卡)或内部存储中。Android提供Environment类来获取文件的存储路径,如Environment.DIRECTORY_DOWNLOADS。开发者需要确保拥有写入外部存储的权限(在...

    Android解决应用程序未安装的三种方法[参考].pdf

    如果出现“应用程序未安装”的提示,可以尝试通过USB连接手机到电脑,并进入SD卡的`.android_secure`文件夹。在这个文件夹内,找到任何与正常应用命名格式不同的文件,如`smdl2tmp1.asec`,将其删除。删除后重新尝试...

    适用于 Android 设备的简单而强大的文件浏览器.rar

    1. **Android 文件管理系统**:Android 设备允许用户访问和管理设备上的所有文件,包括内部存储和外部 SD 卡。文件浏览器是实现这一功能的重要工具。 2. **文件管理器功能**:一款好的文件浏览器通常包括浏览目录、...

    小米文件管理器

    而对于APK文件,可能需要解析其AndroidManifest.xml来显示应用图标和名称。 小米文件管理器的界面设计也十分人性化,它可能采用了Material Design规范,提供了清晰的分类视图、网格视图和列表视图,用户可以根据...

    安卓Android源码——获取手机应用信息.zip

    5. **安装位置**:应用可以安装在内部存储或外部SD卡上。`PackageInfo`类的`installLocation`字段表示安装位置,值为`PackageManager.INSTALL_LOCATION_INTERNAL_ONLY`(内部存储)、`PackageManager.INSTALL_...

    Android安装教程

    2. 移动应用到SD卡:如果设备支持,可以在设置中将部分应用移至外部存储卡,以节省手机内存。 七、安全注意事项 只从可信赖的源下载应用,避免安装包含恶意软件的APK文件。保持Google Play Protect或其他安全软件的...

Global site tag (gtag.js) - Google Analytics