Created
July 15, 2013 06:04
-
-
Save samma835/5997793 to your computer and use it in GitHub Desktop.
get the apk icon.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public Drawable getAPKDrawable(String filePath) { | |
Drawable dr = null; | |
if (filePath != null) { | |
String PATH_PackageParser = "android.content.pm.PackageParser"; | |
String PATH_AssetManager = "android.content.res.AssetManager"; | |
try { | |
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] = filePath; | |
Object pkgParser = pkgParserCt.newInstance(valueArgs); | |
DisplayMetrics metrics = new DisplayMetrics(); | |
metrics.setToDefaults(); | |
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(filePath); | |
valueArgs[1] = filePath; | |
valueArgs[2] = metrics; | |
valueArgs[3] = 0; | |
Object pkgParserPkg = pkgParser_parsePackageMtd.invoke(pkgParser, valueArgs); | |
Field appInfoFld = pkgParserPkg.getClass().getDeclaredField("applicationInfo"); | |
ApplicationInfo info = (ApplicationInfo) appInfoFld.get(pkgParserPkg); | |
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] = filePath; | |
assetMag_addAssetPathMtd.invoke(assetMag, valueArgs); | |
// 具体的activityy实例 | |
Resources res = ManagerActivity.this.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 (info.icon != 0) { | |
dr = res.getDrawable(info.icon); | |
} | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
} | |
return dr; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment