`
zhujianjia
  • 浏览: 484058 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

转: [Android]获取未安装的APK信息

 
阅读更多

网上关于"获取未安装的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获取未安装APK文件的图标 android开发技巧整理

    android加载未安装apk资源

    在Android开发中,有时我们需要在运行时加载未安装的APK资源,这通常是出于扩展性或模块化的考虑。本文将详细讲解如何实现这一功能,主要涉及Android加载未安装apk资源的相关知识点。 首先,加载未安装的APK资源...

    Android获取已安装的apk信息

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

    Android 获取手机所有apk包名

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

    Android 7.0下载安装APK

    本文将详细讲解如何在Android 7.0设备上下载并安装APK应用,以及在这个版本中与APK安装相关的知识点。 1. **APK 文件**:APK 是 Android 应用程序的安装包,类似于 Windows 上的 .exe 文件。它包含了应用的代码、...

    Android动态加载未安装apk

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

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

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

    android 实现用代码安装apk

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

    Android App调用没有安装的apk

    然而,有一种特殊的技术使得Android App能够调用并使用未安装的APK文件,这种技术被称为“插件化开发”。本项目名为"ApkDemo",它是一个Android Studio工程,包含两个模块:一个是主应用程序(主apk工程),另一个是...

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

    在Android开发中,有时我们需要获取手机上已安装的APK应用信息,这可能涉及到应用的元数据、权限、版本信息等。本示例将详细解释如何实现这一功能,并通过异步加载来避免阻塞主线程,提升用户体验。下面我们将深入...

    Android10静默安装APK

    在Android系统中,静默安装APK(Silent Install)是指在用户无感知的情况下自动安装应用程序。这通常需要系统的特殊权限,因为出于安全考虑,Android系统默认不允许非系统应用进行后台安装。在Android 10中,由于...

    android应用下载安装apk升级版本实现demo适配Android10

    本示例“android应用下载安装apk升级版本实现demo适配Android10”聚焦于如何在Android 10(API级别29)及更高版本中实现这一过程。以下是关于这一主题的详细知识: 1. **安全下载APK**:在Android 10中,为了保障...

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

    Android 获取未安装的APK图标、版本号、包名等信息方法 Android 获取未安装的APK图标、版本号、包名等信息方法是 Android 应用程序开发中的一种常见需求。通过本文,我们将学习如何获取未安装的APK图标、版本号、包...

    获取本机已安装的apk信息

    在Android系统中,获取本机已安装的APK(应用程序)信息是一项常见的需求,这有助于开发者分析设备上的应用状态,或者实现类似应用管理的功能。本文将深入探讨如何通过编程方式获取这些信息,主要关注Java和Kotlin两...

    Android 更新下载apk 安装apk 打开apk

    1. **网络请求**:Android设备通过HTTP或HTTPS协议向服务器发送请求,获取APK文件。可以使用Android的`HttpURLConnection`或者第三方库如OkHttp来实现。 2. **保存APK**:下载的APK文件通常被保存到设备的下载目录,...

    Android 下载APK 安装APK 打开APK

    1. 网络请求:首先,需要通过HTTP或HTTPS协议从服务器获取APK文件。可以使用Android的HttpURLConnection类,或者第三方库如Volley、OkHttp等进行网络请求。 2. 文件保存:下载的APK数据会被保存到设备的特定目录,...

    Android 之 在模拟器上安装APK

    在Android开发过程中,为了测试和调试应用程序,我们通常需要在设备或模拟器上安装APK文件。本篇文章将深入探讨如何在Android模拟器上安装APK,这对于开发者来说是一项基本技能,尤其当实体设备不在手边时。我们将...

    apk安装器android

    这款APK安装器允许用户从第三方来源安装APK,扩展了Android设备的应用获取途径。 首先,我们来了解一下APK文件。APK是Android应用程序的编译结果,包含了应用的所有代码、资源、库和配置文件。当开发者完成一个...

    Android 获取apk声明的权限列表

    获取APK权限列表的方法主要有以下几种: 1. **使用Android SDK工具**: - `aapt`(Android Asset Packaging Tool)是Android SDK的一部分,可以用来解析APK文件。通过运行命令`aapt dump permissions &lt;apk_path&gt;`...

    android客户端请求,服务端监听apk安装完成,通知客户端

    在Android开发中,有时我们需要实现一个特定的需求:客户端在安装APK后,通过网络通知服务端这个过程已经完成。这通常涉及到Android系统的广播接收器(BroadcastReceiver)和Socket通信技术。接下来,我们将深入探讨...

Global site tag (gtag.js) - Google Analytics