Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 初級開發 >> 獲取未安裝的APK圖標

獲取未安裝的APK圖標

編輯:初級開發

screen.JPG

網上關於"獲取未安裝的APK圖標"的文章滿天飛,但都是轉帖,運行後的效果卻是獲取到android的默認小機器人圖標.那個暴寒....

現提供解決方法如下,廢話不說,上效果圖,見代碼:
 



本方法需要使用到Java反射的知識,具體請參考:
http://Java.sun.com/developer/te ... flection/index.Html
借鑒的android源碼出處:
XXoo這個鏈接好長ooXX

  1. package lab.sodino.fetchapkicon;
     

  2.  
  3. import Java.io.File;
     
  4. import Java.lang.reflect.Constructor;
     
  5. import Java.lang.reflect.FIEld;
     
  6. import Java.lang.reflect.Method;
     

  7.  
  8. import android.app.Activity;
     
  9. import android.content.Context;
     
  10. import android.content.pm.ApplicationInfo;
     
  11. import android.content.pm.PackageInfo;
     
  12. import android.content.pm.PackageManager;
     
  13. import android.content.res.Resources;
     
  14. import android.graphics.drawable.Drawable;
     
  15. import android.os.Bundle;
     
  16. import android.util.DisplayMetrics;
     
  17. import android.util.Log;
     
  18. import android.view.VIEw;
     
  19. import android.widget.ImageVIEw;
     

  20.  
  21. /**
     
  22. * @author Sodino [email protected]
     
  23. * @since 2011年3月1日13時00分41秒
     
  24. * */
     
  25. public class FetchAPKIconAct extends Activity {
     
  26.         public void onCreate(Bundle savedInstanceState) {
     
  27.                 super.onCreate(savedInstanceState);
     
  28.                 setContentVIEw(R.layout.main);
     
  29.                 showUninstallAPKIcon("/sdcard/APK/JarodYv.FishPool.apk");
     
  30.                 getUninatllApkInfo(this, "/sdcard/APK/JarodYv.FishPool.apk");
     
  31.         }
     

  32.  
  33.         /** 網傳的方法,但獲取不成功 */
     
  34.         public void getUninatllApkInfo(Context context, String archiveFilePath) {
     
  35.                 PackageManager pm = context.getPackageManager();
     
  36.                 PackageInfo info = pm.getPackageArchiveInfo(archiveFilePath, PackageManager.GET_ACTIVITIES);
     
  37.                 if (info != null) {
     
  38.                         ApplicationInfo appInfo = info.applicationInfo;
     
  39.                         Drawable icon = pm.getApplicationIcon(appInfo);
     
  40.                         ImageView image = (ImageView) findVIEwById(R.id.apkIconByTradition);
     
  41.                         image.setVisibility(VIEw.VISIBLE);
     
  42.                         image.setImageDrawable(icon);
     
  43.                 }
     
  44.         }
     

  45.  
  46.         //
     
  47.         private void showUninstallAPKIcon(String apkPath) {
     
  48.                 String PATH_PackageParser = "android.content.pm.PackageParser";
     
  49.                 String PATH_AssetManager = "android.content.res.AssetManager";
     
  50.                 try {
     
  51.                         // apk包的文件路徑
     
  52.                         // 這是一個Package 解釋器, 是隱藏的
     
  53.                         // 構造函數的參數只有一個, apk文件的路徑
     
  54.                         // PackageParser packageParser = new PackageParser(apkPath);
     
  55.                         Class pkgParserCls = Class.forName(PATH_PackageParser);
     
  56.                         Class[] typeArgs = new Class[1];
     
  57.                         typeArgs[0] = String.class;
     
  58.                         Constructor pkgParserCt = pkgParserCls.getConstructor(typeArgs);
     
  59.                         Object[] valueArgs = new Object[1];
     
  60.                         valueArgs[0] = apkPath;
     
  61.                         Object pkgParser = pkgParserCt.newInstance(valueArgs);
     
  62.                         Log.d("android_LAB", "pkgParser:" + pkgParser.toString());
     
  63.                         // 這個是與顯示有關的, 裡面涉及到一些像素顯示等等, 我們使用默認的情況
     
  64.                         DisplayMetrics metrics = new DisplayMetrics();
     
  65.                         metrics.setToDefaults();
     
  66.                         // PackageParser.Package mPkgInfo = packageParser.parsePackage(new
     
  67.                         // File(apkPath), apkPath,
     
  68.                         // metrics, 0);
     
  69.                         typeArgs = new Class[4];
     
  70.                         typeArgs[0] = File.class;
     
  71.                         typeArgs[1] = String.class;
     
  72.                         typeArgs[2] = DisplayMetrics.class;
     
  73.                         typeArgs[3] = Integer.TYPE;
     
  74.                         Method pkgParser_parsePackageMtd = pkgParserCls.getDeclaredMethod("parsePackage",
     
  75.                                         typeArgs);
     
  76.                         valueArgs = new Object[4];
     
  77.                         valueArgs[0] = new File(apkPath);
     
  78.                         valueArgs[1] = apkPath;
     
  79.                         valueArgs[2] = metrics;
     
  80.                         valueArgs[3] = 0;
     
  81.                         Object pkgParserPkg = pkgParser_parsePackageMtd.invoke(pkgParser, valueArgs);
     
  82.                         // 應用程序信息包, 這個公開的, 不過有些函數, 變量沒公開
     
  83.                         // ApplicationInfo info = mPkgInfo.applicationInfo;
     
  84.                         Field appInfoFld = pkgParserPkg.getClass().getDeclaredFIEld("applicationInfo");
     
  85.                         ApplicationInfo info = (ApplicationInfo) appInfoFld.get(pkgParserPkg);
     
  86.                         // uid 輸出為"-1",原因是未安裝,系統未分配其Uid。
     
  87.                         Log.d("android_LAB", "pkg:" + info.packageName + " uid=" + info.uid);
     
  88.                         // Resources pRes = getResources();
     
  89.                         // AssetManager assmgr = new AssetManager();
     
  90.                         // assmgr.addAssetPath(apkPath);
     
  91.                         // Resources res = new Resources(assmgr, pRes.getDisplayMetrics(),
     
  92.                         // pRes.getConfiguration());
     
  93.                         Class assetMagCls = Class.forName(PATH_AssetManager);
     
  94.                         Constructor assetMagCt = assetMagCls.getConstructor((Class[]) null);
     
  95.                         Object assetMag = assetMagCt.newInstance((Object[]) null);
     
  96.                         typeArgs = new Class[1];
     
  97.                         typeArgs[0] = String.class;
     
  98.                         Method assetMag_addAssetPathMtd = assetMagCls.getDeclaredMethod("addAssetPath",
     
  99.                                         typeArgs);
     
  100.                         valueArgs = new Object[1];
     
  101.                         valueArgs[0] = apkPath;
     
  102.                         assetMag_addAssetPathMtd.invoke(assetMag, valueArgs);
     
  103.                         Resources res = getResources();
     
  104.                         typeArgs = new Class[3];
     
  105.                         typeArgs[0] = assetMag.getClass();
     
  106.                         typeArgs[1] = res.getDisplayMetrics().getClass();
     
  107.                         typeArgs[2] = res.getConfiguration().getClass();
     
  108.                         Constructor resCt = Resources.class.getConstructor(typeArgs);
     
  109.                         valueArgs = new Object[3];
     
  110.                         valueArgs[0] = assetMag;
     
  111.                         valueArgs[1] = res.getDisplayMetrics();
     
  112.                         valueArgs[2] = res.getConfiguration();
     
  113.                         res = (Resources) resCt.newInstance(valueArgs);
     
  114.                         CharSequence label = null;
     
  115.                         if (info.labelRes != 0) {
     
  116.                                 label = res.getText(info.labelRes);
     
  117.                         }
     
  118.                         // if (label == null) {
     
  119.                         // label = (info.nonLocalizedLabel != null) ? info.nonLocalizedLabel
     
  120.                         // : info.packageName;
     
  121.                         // }
     
  122.                         Log.d("android_LAB", "label=" + label);
     
  123.                         // 這裡就是讀取一個apk程序的圖標
     
  124.                         if (info.icon != 0) {
     
  125.                                 Drawable icon = res.getDrawable(info.icon);
     
  126.                                 ImageView image = (ImageView) findVIEwById(R.id.apkIconBySodino);
     
  127.                                 image.setVisibility(VIEw.VISIBLE);
     
  128.                                 image.setImageDrawable(icon);
     
  129.                         }
     
  130.                 } catch (Exception e) {
     
  131.                         e.printStackTrace();
     
  132.                 }
     
  133.         }
     
  134. }
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved