`
bkship
  • 浏览: 47857 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

获取未安装apk的信息

 
阅读更多
申明不是原创,忘记是在哪看的啦,网上转的那么多,也不知道谁是原创

只是亲测可用:利用的是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开发技巧整理

    获取本机已安装的apk信息

    总结,获取本机已安装的APK信息涉及到对Android系统的深入理解,特别是`PackageManager`类的使用。通过`getInstalledPackages()`方法,我们可以得到所有应用的信息,并从中提取出我们需要的数据,如应用名称、包名、...

    Android获取已安装的apk信息

    本文将详细讲解如何通过编程方式获取Android设备上已安装的apk信息,包括应用图标、应用名称、工程名(包名)以及安装路径。 首先,我们需要了解在Android SDK中提供了一个名为`PackageManager`的类,它是获取应用...

    Android动态加载未安装apk

    2. 获取APK的`PackageInfo`:使用`PackageManager`的`getPackageArchiveInfo()`方法解析APK,获取其包含的类信息、权限等。 3. 创建ClassLoader:通过`DexClassLoader`实例化一个类加载器,它能加载APK中的`.dex`...

    android加载未安装apk资源

    在未安装的APK中获取这些资源,需要使用`AssetManager`。首先,通过`Context`的`createPackageContext()`方法创建一个Context对象,然后使用这个Context的`getAssets()`方法获取`AssetManager`实例。接下来,调用`...

    C#获取安卓APK各类信息

    而当涉及到与Android平台的交互时,C#也能通过各种手段实现,例如使用Unity3D进行跨平台开发或利用特定的库来获取APK(Android应用程序包)的信息。本篇文章将深入探讨如何使用C#获取安卓APK的各类信息,如版本号、...

    android获取手机已安装apk的信息异步操作

    因此,获取APK信息的过程应当放在后台进行,常用的方式是使用AsyncTask或者Handler/Looper机制。AsyncTask是一种轻量级的异步任务框架,它提供了在后台线程执行任务并在UI线程更新结果的便利接口。 3. **使用...

    Android 获取未安装的APK图标、版本号、包名等信息方法

    PackageManager提供了一个getPackageArchiveInfo方法,用于获取APK文件的信息,而PackageInfo则提供了一个loadIcon方法,用于加载APK图标。下面是一个获取APK图标的示例代码: ```java public static Drawable ...

    获取安装的apk

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

    java获取apk的包名版本信息

    而`GetApkInfo.jar`可能是一个已经封装好的工具类库,专门用于获取APK信息。 获取APK信息的具体步骤如下: 1. 使用`File`类创建一个指向APK文件的实例。 2. 创建`ZipFile`对象,将APK文件作为参数传入,这将允许...

    利用BundleTool从aab包获取apk安装大小以及安装apk到手机

    本篇文章将详细介绍如何利用`BundleTool`从AAB包获取APK的安装大小,并实现在手机上的安装步骤。 首先,我们需要理解AAB(Android App Bundle)与传统的APK的区别。AAB是一种新的发布格式,它允许Google Play Store...

    Android 通过反射启动未安装的APK中的Activity

    1. **读取APK**:首先,我们需要获取到未安装APK的二进制数据。这可以通过FileInputStream或AssetManager完成,将APK文件视为一个普通的二进制文件。 2. **解析APK**:然后,使用ZipFile或JarFile类解析APK,提取...

    Java获取ipa、apk文件配置信息jar包

    在这个场景下,"Java获取ipa、apk文件配置信息jar包"提供了这样的功能,它是一个Java库,能够帮助开发者以编程方式解析ipa和apk文件,提取出关键的元数据。 首先,我们要理解如何在Java中处理ipa和apk文件。ipa文件...

    获取APK信息工具

    获取APK信息是一项重要的任务,对于开发者来说,这有助于理解应用的构成、版本控制以及安全分析。本工具名为"获取APK信息工具",旨在智能地提取APK文件的各种元数据,帮助用户快速了解APK的相关属性。 首先,我们要...

    php获取apk信息包名应用名版本

    在PHP环境中,我们可能需要获取APK文件的一些元数据信息,例如包名、应用名称、版本名称、支持的屏幕尺寸和语言等。这在自动化部署、应用分析或者构建与APK相关的服务时非常有用。以下是如何使用PHP来实现这些功能的...

    Android 获取手机所有apk包名

    在Android平台上,获取手机上所有APK包名的需求通常是用于分析设备上安装的应用程序信息,例如统计应用数量、分析特定应用是否存在或者进行批量操作。这个过程涉及到对Android系统的权限访问以及对文件系统的操作。...

    android 实现用代码安装apk

    首先,获取APK文件的路径,然后使用`Intent`和`PackageInstaller`来完成安装过程。以下是一个示例函数: ```java public void installApk(Context context, String apkFilePath) { if (Build.VERSION.SDK_INT &gt;=...

    获取本地已安装apk

    ### 获取本地已安装APK的知识点详解 #### 一、前言 在Android开发中,有时我们需要获取设备上已安装的应用列表,特别是那些非系统预装的应用程序(即用户自行安装的应用)。这样的需求常见于应用商店类应用或者...

    获取apk包名,版本号等信息的jar包

    2. **调用API**:使用提供的API,例如`ApkInfo`类,来获取APK信息。一般情况下,这些API会提供一个方法,接受APK文件的路径作为参数,然后返回一个包含包名、版本代码和版本名称的对象。 ```java ApkInfo apkInfo...

    Android App调用没有安装的apk

    1. **反射机制**:反射是Java的一个强大特性,允许程序在运行时获取和操作类、接口、字段和方法的信息。在插件化开发中,主应用通过反射调用插件APK中的类和方法,实现功能的调用。 2. **DexClassLoader**:Android...

Global site tag (gtag.js) - Google Analytics