清华大佬耗费三个月吐血整理的几百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(); } } } |