返回顶部

收藏

Android获取未安装的APK图标的代码

更多
 import java.io.File;  
import java.lang.reflect.Constructor;  
import java.lang.reflect.Field;  
import java.lang.reflect.Method;  
import android.app.Activity;  
import android.content.Context;  
import android.content.pm.ApplicationInfo;  
import android.content.pm.PackageInfo;  
import android.content.pm.PackageManager;  
import android.content.res.Resources;  
import android.graphics.drawable.Drawable;  
import android.os.Bundle;  
import android.util.DisplayMetrics;  
import android.util.Log;  
import android.view.View;  
import android.widget.ImageView;  

public class FetchAPKIconAct extends Activity {  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        showUninstallAPKIcon("/sdcard/APK/JarodYv.FishPool.apk");  
        getUninatllApkInfo(this, "/sdcard/APK/JarodYv.FishPool.apk");  
    }  
    /** 网传的方法,但获取不成功 */  
    public void getUninatllApkInfo(Context context, String archiveFilePath) {  
        PackageManager pm = context.getPackageManager();  
        PackageInfo info = pm.getPackageArchiveInfo(archiveFilePath, PackageManager.GET_ACTIVITIES);  
        if (info != null) {  
            ApplicationInfo appInfo = info.applicationInfo;  
            Drawable icon = pm.getApplicationIcon(appInfo);  
            ImageView image = (ImageView) findViewById(R.id.apkIconByTradition);  
            image.setVisibility(View.VISIBLE);  
            image.setImageDrawable(icon);  
        }  
    }  
    //  
    private void showUninstallAPKIcon(String apkPath) {  
        String PATH_PackageParser = "android.content.pm.PackageParser";  
        String PATH_AssetManager = "android.content.res.AssetManager";  
        try {  
            // 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("ANDROID_LAB", "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("ANDROID_LAB", "pkg:" + info.packageName + " uid=" + info.uid);  
            // Resources pRes = getResources();  
            // AssetManager assmgr = new AssetManager();  
            // assmgr.addAssetPath(apkPath);  
            // Resources res = new Resources(assmgr, pRes.getDisplayMetrics(),  
            // pRes.getConfiguration());  
            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 = 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);  
            }  
            // if (label == null) {  
            // label = (info.nonLocalizedLabel != null) ? info.nonLocalizedLabel  
            // : info.packageName;  
            // }  
            Log.d("ANDROID_LAB", "label=" + label);  
            // 这里就是读取一个apk程序的图标  
            if (info.icon != 0) {  
                Drawable icon = res.getDrawable(info.icon);  
                ImageView image = (ImageView) findViewById(R.id.apkIconBySodino);  
                image.setVisibility(View.VISIBLE);  
                image.setImageDrawable(icon);  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
}  

标签:java

收藏

0人收藏

支持

0

反对

0

发表评论