android 获取未安装apk的icon、name等信息

public List<AppInfo> getApkFileInfo(Context ctx,List<String> list) {
		 
        String PATH_PackageParser = "android.content.pm.PackageParser";
        List<AppInfo> appInfoList = new ArrayList<AppInfo>();
        String PATH_AssetManager = "android.content.res.AssetManager";
        for(int i=0;i<list.size();i++){
        try {
        	AppInfo appInfoData = null;
        	String apkPath=list.get(i);
                // apk包的文件路径

                // 这是一个Package 解释器, 是隐藏的

                // 构造函数的参数只有一个, apk文件的路径

                // PackageParser packageParser = new PackageParser(apkPath);

                Class pkgParserCls = Class.forName(PATH_PackageParser);
                Class[] typeArgs = new Class[1];
                typeArgs[0] = String.class;
                Constructor pkgParserCt = pkgParserCls.getConstructor(typeArgs);

                Object[] valueArgs = new Object[1];
                valueArgs[0] = apkPath;
                Object pkgParser = pkgParserCt.newInstance(valueArgs);

                Log.d(TAG, "pkgParser:" + pkgParser.toString());

                // 这个是与显示有关的, 里面涉及到一些像素显示等等, 我们使用默认的情况

                DisplayMetrics metrics = new DisplayMetrics();

                metrics.setToDefaults();

                // PackageParser.Package mPkgInfo = packageParser.parsePackage(new

                // File(apkPath), apkPath,

                // metrics, 0);

                typeArgs = new Class[4];
                typeArgs[0] = File.class;
                typeArgs[1] = String.class;
                typeArgs[2] = DisplayMetrics.class;
                typeArgs[3] = Integer.TYPE;

                Method pkgParser_parsePackageMtd = pkgParserCls.getDeclaredMethod("parsePackage",
                                typeArgs);
                valueArgs = new Object[4];
                valueArgs[0] = new File(apkPath);
                valueArgs[1] = apkPath;
                valueArgs[2] = metrics;
                valueArgs[3] = 0;

                Object pkgParserPkg = pkgParser_parsePackageMtd.invoke(pkgParser, valueArgs);

                // 应用程序信息包, 这个公开的, 不过有些函数, 变量没公开

                // ApplicationInfo info = mPkgInfo.applicationInfo;

                Field appInfoFld = pkgParserPkg.getClass().getDeclaredField("applicationInfo");

                ApplicationInfo info = (ApplicationInfo) appInfoFld.get(pkgParserPkg);

                // uid 输出为"-1",原因是未安装,系统未分配其Uid。

                Log.d(TAG, "pkg:" + info.packageName + " uid=" + info.uid);

                Class assetMagCls = Class.forName(PATH_AssetManager);

                Constructor assetMagCt = assetMagCls.getConstructor((Class[]) null);

                Object assetMag = assetMagCt.newInstance((Object[]) null);
                typeArgs = new Class[1];
                typeArgs[0] = String.class;
                Method assetMag_addAssetPathMtd = assetMagCls.getDeclaredMethod("addAssetPath",
                                typeArgs);
                valueArgs = new Object[1];
                valueArgs[0] = apkPath;
                assetMag_addAssetPathMtd.invoke(assetMag, valueArgs);
                Resources res = ctx.getResources();
                
                typeArgs = new Class[3];
                typeArgs[0] = assetMag.getClass();
                typeArgs[1] = res.getDisplayMetrics().getClass();
                typeArgs[2] = res.getConfiguration().getClass();

                Constructor resCt = Resources.class.getConstructor(typeArgs);

                valueArgs = new Object[3];
                valueArgs[0] = assetMag;
                valueArgs[1] = res.getDisplayMetrics();
                valueArgs[2] = res.getConfiguration();

                res = (Resources) resCt.newInstance(valueArgs);

                CharSequence label = null;
                if (info.labelRes != 0) {
                        label = res.getText(info.labelRes);
                }
                Log.d(TAG, "label=" + label);

                // 这里就是读取一个apk程序的图标
                appInfoData =new AppInfo();
                if (info.icon != 0) {
                        Drawable icon = res.getDrawable(info.icon);
                        appInfoData.setAppIcon(icon);
                }
                appInfoData.setAppName(label.toString());
                appInfoList.add(appInfoData);
        } catch (Exception e) {
                e.printStackTrace();
        }
        }
        return appInfoList;
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值