[Android]获取未安装的APK图标

来源:互联网 发布:windows系统加固 编辑:程序博客网 时间:2024/05/11 12:31

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

 

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

uninstall apk icon

 

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

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

借鉴的Android源码出处:

XXoo这个链接好长ooXX

 

[java] view plaincopy
  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 所有

转载请注明出处: http://blog.csdn.net/sodino/archive/2011/03/01/6215224.aspx

原创粉丝点击