打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
[Android]获取未安装的APK图标(原创非转帖)

[Android]获取未安装的APK图标(原创非转帖)

1634人阅读 评论(0) 收藏 举报

网上关于"获取未安装的APK图标"的文章满天飞,但都是转帖,运行后的效果却是获取到Android的默认小机器人图标.那个暴寒....

 

现提供解决方法如下,废话不说,上效果图,见代码:

 

本方法需要使用到Java反射的知识,具体请参考:

http://java.sun.com/developer/technicalArticles/ALT/Reflection/index.html

借鉴的Android源码出处:

XXoo这个链接好长ooXX

 

  1. package lab.sodino.fetchapkicon;  
  2. import java.io.File;  
  3. import java.lang.reflect.Constructor;  
  4. import java.lang.reflect.Field;  
  5. import java.lang.reflect.Method;  
  6. import android.app.Activity;  
  7. import android.content.Context;  
  8. import android.content.pm.ApplicationInfo;  
  9. import android.content.pm.PackageInfo;  
  10. import android.content.pm.PackageManager;  
  11. import android.content.res.Resources;  
  12. import android.graphics.drawable.Drawable;  
  13. import android.os.Bundle;  
  14. import android.util.DisplayMetrics;  
  15. import android.util.Log;  
  16. import android.view.View;  
  17. import android.widget.ImageView;  
  18. /** 
  19.  * @author Sodino sodinoopen@hotmail.com 
  20.  * @since 2011年3月1日13时00分41秒 
  21.  * */  
  22. public class FetchAPKIconAct extends Activity {  
  23.     public void onCreate(Bundle savedInstanceState) {  
  24.         super.onCreate(savedInstanceState);  
  25.         setContentView(R.layout.main);  
  26.         showUninstallAPKIcon("/sdcard/APK/JarodYv.FishPool.apk");  
  27.         getUninatllApkInfo(this"/sdcard/APK/JarodYv.FishPool.apk");  
  28.     }  
  29.     /** 网传的方法,但获取不成功 */  
  30.     public void getUninatllApkInfo(Context context, String archiveFilePath) {  
  31.         PackageManager pm = context.getPackageManager();  
  32.         PackageInfo info = pm.getPackageArchiveInfo(archiveFilePath, PackageManager.GET_ACTIVITIES);  
  33.         if (info != null) {  
  34.             ApplicationInfo appInfo = info.applicationInfo;  
  35.             Drawable icon = pm.getApplicationIcon(appInfo);  
  36.             ImageView image = (ImageView) findViewById(R.id.apkIconByTradition);  
  37.             image.setVisibility(View.VISIBLE);  
  38.             image.setImageDrawable(icon);  
  39.         }  
  40.     }  
  41.     //   
  42.     private void showUninstallAPKIcon(String apkPath) {  
  43.         String PATH_PackageParser = "android.content.pm.PackageParser";  
  44.         String PATH_AssetManager = "android.content.res.AssetManager";  
  45.         try {  
  46.             // apk包的文件路径   
  47.             // 这是一个Package 解释器, 是隐藏的   
  48.             // 构造函数的参数只有一个, apk文件的路径   
  49.             // PackageParser packageParser = new PackageParser(apkPath);   
  50.             Class pkgParserCls = Class.forName(PATH_PackageParser);  
  51.             Class[] typeArgs = new Class[1];  
  52.             typeArgs[0] = String.class;  
  53.             Constructor pkgParserCt = pkgParserCls.getConstructor(typeArgs);  
  54.             Object[] valueArgs = new Object[1];  
  55.             valueArgs[0] = apkPath;  
  56.             Object pkgParser = pkgParserCt.newInstance(valueArgs);  
  57.             Log.d("ANDROID_LAB""pkgParser:" + pkgParser.toString());  
  58.             // 这个是与显示有关的, 里面涉及到一些像素显示等等, 我们使用默认的情况   
  59.             DisplayMetrics metrics = new DisplayMetrics();  
  60.             metrics.setToDefaults();  
  61.             // PackageParser.Package mPkgInfo = packageParser.parsePackage(new   
  62.             // File(apkPath), apkPath,   
  63.             // metrics, 0);   
  64.             typeArgs = new Class[4];  
  65.             typeArgs[0] = File.class;  
  66.             typeArgs[1] = String.class;  
  67.             typeArgs[2] = DisplayMetrics.class;  
  68.             typeArgs[3] = Integer.TYPE;  
  69.             Method pkgParser_parsePackageMtd = pkgParserCls.getDeclaredMethod("parsePackage",  
  70.                     typeArgs);  
  71.             valueArgs = new Object[4];  
  72.             valueArgs[0] = new File(apkPath);  
  73.             valueArgs[1] = apkPath;  
  74.             valueArgs[2] = metrics;  
  75.             valueArgs[3] = 0;  
  76.             Object pkgParserPkg = pkgParser_parsePackageMtd.invoke(pkgParser, valueArgs);  
  77.             // 应用程序信息包, 这个公开的, 不过有些函数, 变量没公开   
  78.             // ApplicationInfo info = mPkgInfo.applicationInfo;   
  79.             Field appInfoFld = pkgParserPkg.getClass().getDeclaredField("applicationInfo");  
  80.             ApplicationInfo info = (ApplicationInfo) appInfoFld.get(pkgParserPkg);  
  81.             // uid 输出为"-1",原因是未安装,系统未分配其Uid。   
  82.             Log.d("ANDROID_LAB""pkg:" + info.packageName + " uid=" + info.uid);  
  83.             // Resources pRes = getResources();   
  84.             // AssetManager assmgr = new AssetManager();   
  85.             // assmgr.addAssetPath(apkPath);   
  86.             // Resources res = new Resources(assmgr, pRes.getDisplayMetrics(),   
  87.             // pRes.getConfiguration());   
  88.             Class assetMagCls = Class.forName(PATH_AssetManager);  
  89.             Constructor assetMagCt = assetMagCls.getConstructor((Class[]) null);  
  90.             Object assetMag = assetMagCt.newInstance((Object[]) null);  
  91.             typeArgs = new Class[1];  
  92.             typeArgs[0] = String.class;  
  93.             Method assetMag_addAssetPathMtd = assetMagCls.getDeclaredMethod("addAssetPath",  
  94.                     typeArgs);  
  95.             valueArgs = new Object[1];  
  96.             valueArgs[0] = apkPath;  
  97.             assetMag_addAssetPathMtd.invoke(assetMag, valueArgs);  
  98.             Resources res = getResources();  
  99.             typeArgs = new Class[3];  
  100.             typeArgs[0] = assetMag.getClass();  
  101.             typeArgs[1] = res.getDisplayMetrics().getClass();  
  102.             typeArgs[2] = res.getConfiguration().getClass();  
  103.             Constructor resCt = Resources.class.getConstructor(typeArgs);  
  104.             valueArgs = new Object[3];  
  105.             valueArgs[0] = assetMag;  
  106.             valueArgs[1] = res.getDisplayMetrics();  
  107.             valueArgs[2] = res.getConfiguration();  
  108.             res = (Resources) resCt.newInstance(valueArgs);  
  109.             CharSequence label = null;  
  110.             if (info.labelRes != 0) {  
  111.                 label = res.getText(info.labelRes);  
  112.             }  
  113.             // if (label == null) {   
  114.             // label = (info.nonLocalizedLabel != null) ? info.nonLocalizedLabel   
  115.             // : info.packageName;   
  116.             // }   
  117.             Log.d("ANDROID_LAB""label=" + label);  
  118.             // 这里就是读取一个apk程序的图标   
  119.             if (info.icon != 0) {  
  120.                 Drawable icon = res.getDrawable(info.icon);  
  121.                 ImageView image = (ImageView) findViewById(R.id.apkIconBySodino);  
  122.                 image.setVisibility(View.VISIBLE);  
  123.                 image.setImageDrawable(icon);  
  124.             }  
  125.         } catch (Exception e) {  
  126.             e.printStackTrace();  
  127.         }  
  128.     }  
  129. }  

 

本文内容归CSDN博客博主Sodino 所有

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Android包管理机制(五)APK是如何被解析的
Android APK安装过程及原理详解
Android 命令:实现启动一个apk
Android 热更新——非侵入AOP框架
android apk 防止反编译技术第五篇
APK安装过程及原理详解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服