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

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

[Android]获取未安装的APK图标_第1张图片

本方法需要使用到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. }


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

更多相关文章

  1. android JNI层线程回调Java函数
  2. 硬件访问服务4之Android硬件访问服务框架及系统函数全详细实现
  3. Android 应用没有桌面图标
  4. Android 桌面图标添加未读消息角标APP角标最佳实践
  5. Android 如何改变应用图标
  6. android 创建快捷方式图标到桌面
  7. 重载android返回键响应函数
  8. Android获取高清app图标代码分享
  9. Android EditText中添加图标的简单方法

随机推荐

  1. Android中的GalleryView实例演示-周末福
  2. android listview局部刷新和模拟应用下载
  3. Android天气预报详解
  4. android Ant混淆打包遇到的几个问题 SDK
  5. android实现系统的返回键和home键
  6. Android Studio下Java Jni技术
  7. android设备你所应该知道的Android设计
  8. Android菜鸟的成长笔记(3)——给QQ登录界面
  9. android中的UI单线程模型
  10. Android:你要的WebView与 JS 交互方式 都