zoukankan      html  css  js  c++  java
  • [Android]获取未安装的APK图标

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

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

    uninstall apk icon

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


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

  • 相关阅读:
    VS2015中SharedProject与可移植类库(PCL)项目
    Windows.Web.Http.HttpClient.GetStringAsync 总是返回相同的结果
    博客园新闻WP8.1客户端
    Webpack 2 视频教程 001
    快速零配置迁移 API 适配 iOS 对 IPv6 以及 HTTPS 的要求
    免费的 Vue.js 入门与进阶视频教程
    Webpack 3 中的新特性
    使用可视化图表对 Webpack 2 的编译与打包进行统计分析
    React.js 开发参见问题 Q&A
    官方 React 快速上手脚手架 create-react-app
  • 原文地址:https://www.cnblogs.com/java20130722/p/3207341.html
Copyright © 2011-2022 走看看