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

清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
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(); 
        
    
}