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

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

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

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

借鉴的Android源码出处:

XXoo这个链接好长ooXX

view plain
  1. packagelab.sodino.fetchapkicon;
  2. importjava.io.File;
  3. importjava.lang.reflect.Constructor;
  4. importjava.lang.reflect.Field;
  5. importjava.lang.reflect.Method;
  6. importandroid.app.Activity;
  7. importandroid.content.Context;
  8. importandroid.content.pm.ApplicationInfo;
  9. importandroid.content.pm.PackageInfo;
  10. importandroid.content.pm.PackageManager;
  11. importandroid.content.res.Resources;
  12. importandroid.graphics.drawable.Drawable;
  13. importandroid.os.Bundle;
  14. importandroid.util.DisplayMetrics;
  15. importandroid.util.Log;
  16. importandroid.view.View;
  17. importandroid.widget.ImageView;
  18. /**
  19. *@authorSodinosodinoopen@hotmail.com
  20. *@since2011年3月1日13时00分41秒
  21. **/
  22. publicclassFetchAPKIconActextendsActivity{
  23. publicvoidonCreate(BundlesavedInstanceState){
  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. publicvoidgetUninatllApkInfo(Contextcontext,StringarchiveFilePath){
  31. PackageManagerpm=context.getPackageManager();
  32. PackageInfoinfo=pm.getPackageArchiveInfo(archiveFilePath,PackageManager.GET_ACTIVITIES);
  33. if(info!=null){
  34. ApplicationInfoappInfo=info.applicationInfo;
  35. Drawableicon=pm.getApplicationIcon(appInfo);
  36. ImageViewimage=(ImageView)findViewById(R.id.apkIconByTradition);
  37. image.setVisibility(View.VISIBLE);
  38. image.setImageDrawable(icon);
  39. }
  40. }
  41. //
  42. privatevoidshowUninstallAPKIcon(StringapkPath){
  43. StringPATH_PackageParser="android.content.pm.PackageParser";
  44. StringPATH_AssetManager="android.content.res.AssetManager";
  45. try{
  46. //apk包的文件路径
  47. //这是一个Package解释器,是隐藏的
  48. //构造函数的参数只有一个,apk文件的路径
  49. //PackageParserpackageParser=newPackageParser(apkPath);
  50. ClasspkgParserCls=Class.forName(PATH_PackageParser);
  51. Class[]typeArgs=newClass[1];
  52. typeArgs[0]=String.class;
  53. ConstructorpkgParserCt=pkgParserCls.getConstructor(typeArgs);
  54. Object[]valueArgs=newObject[1];
  55. valueArgs[0]=apkPath;
  56. ObjectpkgParser=pkgParserCt.newInstance(valueArgs);
  57. Log.d("ANDROID_LAB","pkgParser:"+pkgParser.toString());
  58. //这个是与显示有关的,里面涉及到一些像素显示等等,我们使用默认的情况
  59. DisplayMetricsmetrics=newDisplayMetrics();
  60. metrics.setToDefaults();
  61. //PackageParser.PackagemPkgInfo=packageParser.parsePackage(new
  62. //File(apkPath),apkPath,
  63. //metrics,0);
  64. typeArgs=newClass[4];
  65. typeArgs[0]=File.class;
  66. typeArgs[1]=String.class;
  67. typeArgs[2]=DisplayMetrics.class;
  68. typeArgs[3]=Integer.TYPE;
  69. MethodpkgParser_parsePackageMtd=pkgParserCls.getDeclaredMethod("parsePackage",
  70. typeArgs);
  71. valueArgs=newObject[4];
  72. valueArgs[0]=newFile(apkPath);
  73. valueArgs[1]=apkPath;
  74. valueArgs[2]=metrics;
  75. valueArgs[3]=0;
  76. ObjectpkgParserPkg=pkgParser_parsePackageMtd.invoke(pkgParser,valueArgs);
  77. //应用程序信息包,这个公开的,不过有些函数,变量没公开
  78. //ApplicationInfoinfo=mPkgInfo.applicationInfo;
  79. FieldappInfoFld=pkgParserPkg.getClass().getDeclaredField("applicationInfo");
  80. ApplicationInfoinfo=(ApplicationInfo)appInfoFld.get(pkgParserPkg);
  81. //uid输出为"-1",原因是未安装,系统未分配其Uid。
  82. Log.d("ANDROID_LAB","pkg:"+info.packageName+"uid="+info.uid);
  83. //ResourcespRes=getResources();
  84. //AssetManagerassmgr=newAssetManager();
  85. //assmgr.addAssetPath(apkPath);
  86. //Resourcesres=newResources(assmgr,pRes.getDisplayMetrics(),
  87. //pRes.getConfiguration());
  88. ClassassetMagCls=Class.forName(PATH_AssetManager);
  89. ConstructorassetMagCt=assetMagCls.getConstructor((Class[])null);
  90. ObjectassetMag=assetMagCt.newInstance((Object[])null);
  91. typeArgs=newClass[1];
  92. typeArgs[0]=String.class;
  93. MethodassetMag_addAssetPathMtd=assetMagCls.getDeclaredMethod("addAssetPath",
  94. typeArgs);
  95. valueArgs=newObject[1];
  96. valueArgs[0]=apkPath;
  97. assetMag_addAssetPathMtd.invoke(assetMag,valueArgs);
  98. Resourcesres=getResources();
  99. typeArgs=newClass[3];
  100. typeArgs[0]=assetMag.getClass();
  101. typeArgs[1]=res.getDisplayMetrics().getClass();
  102. typeArgs[2]=res.getConfiguration().getClass();
  103. ConstructorresCt=Resources.class.getConstructor(typeArgs);
  104. valueArgs=newObject[3];
  105. valueArgs[0]=assetMag;
  106. valueArgs[1]=res.getDisplayMetrics();
  107. valueArgs[2]=res.getConfiguration();
  108. res=(Resources)resCt.newInstance(valueArgs);
  109. CharSequencelabel=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. Drawableicon=res.getDrawable(info.icon);
  121. ImageViewimage=(ImageView)findViewById(R.id.apkIconBySodino);
  122. image.setVisibility(View.VISIBLE);
  123. image.setImageDrawable(icon);
  124. }
  125. }catch(Exceptione){
  126. e.printStackTrace();
  127. }
  128. }
  129. }

更多相关文章

  1. Android(安卓)Studio中获取sha1证书指纹数据的方法
  2. Android内置应用到系统的方法总结
  3. 【Android】Uri、UriMatcher、ContentUris详解
  4. Android中LocationManager的简单使用,获取当前位置
  5. win7下修改AVD默认路径
  6. Android微信登录(shareSDK)注意事项
  7. Android(安卓)Studio 配置模拟器AVD存放路径(默认在c盘,解决c盘空
  8. Android中LocationManager的简单使用,获取当前位置
  9. Pycharm安装PyQt5的详细教程

随机推荐

  1. Android(安卓)& Chrome
  2. Android(安卓)ANR问题分析
  3. Android七大布局
  4. listview使用小技巧
  5. ROS与Android的通信
  6. java/android 统计文件夹大小及删除文件
  7. Android 登录界面Demo源码
  8. android在代码中为new出的控件设置ID及se
  9. EditText android:windowSoftInputMode
  10. Android EditText 为空提示 密码隐藏