`

获取SD卡中的apk信息

 
阅读更多

转自:

http://hi.baidu.com/jeremy16601/blog/item/2b338ee6b2973ac6f2d385d0.html

 

/**
  * 获取未安装的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;

 }

 

分享到:
评论

相关推荐

    安卓SD卡文件管理更新信息相关-版本升级涉及到提示用户升级下载apk安装apk三部分.rar

    在安卓系统中,SD卡文件管理是用户与设备交互的重要环节,它允许用户存储、访问和管理各种数据,包括应用程序、图片、视频等。当应用需要进行版本升级时,通常会涉及三个关键步骤:提示用户升级、下载APK安装包以及...

    获取安装的apk

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

    Unity应用获取外置SD卡路径方法

    在Android 6.0(API级别23)及更高版本中,系统对存储访问进行了权限管理,因此获取外置SD卡路径前,需要确保在`AndroidManifest.xml`中添加了相应的权限: ```xml ``` 在Unity中,我们可以使用C#脚本来获取外置...

    Android获取SD卡信息的接口

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

    从内存卡中选择 apk 动态加载apk

    1. **获取外部存储权限**:由于我们需要从外部存储(如内存卡)读取APK文件,所以在AndroidManifest.xml中需要声明`READ_EXTERNAL_STORAGE`权限。 2. **查找并解析APK文件**:使用File对象定位到内存卡上的APK文件...

    android通过反射获取内置存储、SD、OTG盘的路径,适合三方apk存储查看与文件管理

    总之,通过反射机制,开发者可以在不依赖特定厂商实现的情况下,获取并管理Android设备上的各种存储路径,包括内置存储、SD卡和OTG设备,同时获取到它们的空间信息,以适应不同的设备环境。在`MountRootManagerRf....

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

    至于"获取手机应用信息"这个子文件,可能是包含具体实现的Java代码,通过分析这个代码,我们可以更详细地了解如何在Android中获取和管理SD卡上的应用信息。 总之,理解和掌握这些知识点对于任何希望在Android平台上...

    android加载sd卡上没安装的apk的类

    1. **获取SD卡上的APK文件**:Android提供`Environment.getExternalStorageDirectory()`方法来获取SD卡的根目录。接着,可以使用`File`类的构造函数来创建指向APK文件的`File`对象,例如`new File(Environment....

    安卓SD卡文件管理更新信息相关-判断双SD卡CheckDoubleSDCard.rar

    1. **获取存储路径**:使用`Context.getExternalFilesDirs()`方法可以获取到设备的所有外部存储路径,包括内部SD卡和所有外部SD卡。 2. **计数检查**:如果返回的存储路径数组长度大于1,那么表示设备至少有一个...

    SD卡任意文件扫描显示

    1. **外部存储访问**:在Android系统中,应用程序通常需要特定权限来访问SD卡,因为这是用户存储个人数据的地方。了解如何获取和使用这些权限是开发此类工具的关键。 2. **文件扫描算法**:实现文件扫描功能需要...

    读取外置apk图片.zip

    1. **获取外置apk路径**:你需要知道外置apk文件在设备存储中的具体位置,通常在SD卡或者其他可移动存储中。 2. **创建DexClassLoader实例**:使用以下代码创建类加载器实例: ```java File apkFile = new File...

    SuperSU-v2.82 卡刷包和apk

    卡刷是一种将第三方固件或者修改过的系统组件直接写入设备内部存储的方式,通常需要设备已经解锁Bootloader。卡刷SuperSU可以将root权限集成到系统中,使得系统启动时即可获得root权限,无需每次手动开启应用。 ...

    APK 文件图标查看器

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

    手机apk拷贝到sdcard

    标题“手机apk拷贝到sdcard”涉及到的是Android操作系统中移动应用程序(APK)的存储管理,特别是如何将APK文件从设备的内部存储移动到外部可移除的SD卡上。这一操作对于用户来说,可能是因为他们希望节省手机内部...

    安卓SD卡文件管理更新信息相关-android使用DownloadManager自动更新安装apk.rar

    关于SD卡文件管理,Android提供了`Environment.getExternalStorageDirectory()`来获取SD卡的根目录,可以结合`Context`的`getExternalFilesDir()`或`getExternalCacheDir()`方法获取特定应用的文件夹。例如,如果你...

    从网络上下载安智apk到sd卡

    在Android中,我们可以将文件保存到外部存储(如SD卡),但需要确保用户已经赋予了写入外部存储的权限。例如,上面的`saveToFile`方法可以这样实现: ```java private void saveToFile(byte[] bytes) { File ...

    Android安装软件到SD卡中

    在Android操作系统中,将应用程序安装到SD卡上是一种节省手机内置存储空间的有效方法。这个过程涉及到Android系统的存储管理机制,以及一些系统级别的设置。本文将详细介绍如何在Android设备上实现软件向SD卡的安装...

    apk安装器android

    3. **安装过程**:APK安装器通常提供简单的操作界面,用户只需找到存储在设备或SD卡上的APK文件,点击安装即可。APK安装器.exe可能是Windows版的工具,用于在PC上管理Android设备的APK安装。 4. **更新与卸载**:...

    Android 备份(提取)apk

    有很多第三方应用如"APK Extractor",可以直接在手机上操作,方便地备份已安装的应用到存储卡或者通过邮件发送。 3. 通过设置开启备份功能: 在Android系统中,部分版本提供了应用数据备份的功能,可以在设置中...

Global site tag (gtag.js) - Google Analytics