[Android]获取未安装的APK图标
16lz
2021-01-23
网上关于"获取未安装的APK图标"的文章满天飞,但都是转帖,运行后的效果却是获取到Android的默认小机器人图标.那个暴寒....
现提供解决方法如下,废话不说,上效果图,见代码:
本方法需要使用到Java反射的知识,具体请参考:
http://java.sun.com/developer/technicalArticles/ALT/Reflection/index.html
借鉴的Android源码出处:
XXoo这个链接好长ooXX
view plain- packagelab.sodino.fetchapkicon;
- importjava.io.File;
- importjava.lang.reflect.Constructor;
- importjava.lang.reflect.Field;
- importjava.lang.reflect.Method;
- importandroid.app.Activity;
- importandroid.content.Context;
- importandroid.content.pm.ApplicationInfo;
- importandroid.content.pm.PackageInfo;
- importandroid.content.pm.PackageManager;
- importandroid.content.res.Resources;
- importandroid.graphics.drawable.Drawable;
- importandroid.os.Bundle;
- importandroid.util.DisplayMetrics;
- importandroid.util.Log;
- importandroid.view.View;
- importandroid.widget.ImageView;
- /**
- *@authorSodinosodinoopen@hotmail.com
- *@since2011年3月1日13时00分41秒
- **/
- publicclassFetchAPKIconActextendsActivity{
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- showUninstallAPKIcon("/sdcard/APK/JarodYv.FishPool.apk");
- getUninatllApkInfo(this,"/sdcard/APK/JarodYv.FishPool.apk");
- }
- /**网传的方法,但获取不成功*/
- publicvoidgetUninatllApkInfo(Contextcontext,StringarchiveFilePath){
- PackageManagerpm=context.getPackageManager();
- PackageInfoinfo=pm.getPackageArchiveInfo(archiveFilePath,PackageManager.GET_ACTIVITIES);
- if(info!=null){
- ApplicationInfoappInfo=info.applicationInfo;
- Drawableicon=pm.getApplicationIcon(appInfo);
- ImageViewimage=(ImageView)findViewById(R.id.apkIconByTradition);
- image.setVisibility(View.VISIBLE);
- image.setImageDrawable(icon);
- }
- }
- //
- privatevoidshowUninstallAPKIcon(StringapkPath){
- StringPATH_PackageParser="android.content.pm.PackageParser";
- StringPATH_AssetManager="android.content.res.AssetManager";
- try{
- //apk包的文件路径
- //这是一个Package解释器,是隐藏的
- //构造函数的参数只有一个,apk文件的路径
- //PackageParserpackageParser=newPackageParser(apkPath);
- ClasspkgParserCls=Class.forName(PATH_PackageParser);
- Class[]typeArgs=newClass[1];
- typeArgs[0]=String.class;
- ConstructorpkgParserCt=pkgParserCls.getConstructor(typeArgs);
- Object[]valueArgs=newObject[1];
- valueArgs[0]=apkPath;
- ObjectpkgParser=pkgParserCt.newInstance(valueArgs);
- Log.d("ANDROID_LAB","pkgParser:"+pkgParser.toString());
- //这个是与显示有关的,里面涉及到一些像素显示等等,我们使用默认的情况
- DisplayMetricsmetrics=newDisplayMetrics();
- metrics.setToDefaults();
- //PackageParser.PackagemPkgInfo=packageParser.parsePackage(new
- //File(apkPath),apkPath,
- //metrics,0);
- typeArgs=newClass[4];
- typeArgs[0]=File.class;
- typeArgs[1]=String.class;
- typeArgs[2]=DisplayMetrics.class;
- typeArgs[3]=Integer.TYPE;
- MethodpkgParser_parsePackageMtd=pkgParserCls.getDeclaredMethod("parsePackage",
- typeArgs);
- valueArgs=newObject[4];
- valueArgs[0]=newFile(apkPath);
- valueArgs[1]=apkPath;
- valueArgs[2]=metrics;
- valueArgs[3]=0;
- ObjectpkgParserPkg=pkgParser_parsePackageMtd.invoke(pkgParser,valueArgs);
- //应用程序信息包,这个公开的,不过有些函数,变量没公开
- //ApplicationInfoinfo=mPkgInfo.applicationInfo;
- FieldappInfoFld=pkgParserPkg.getClass().getDeclaredField("applicationInfo");
- ApplicationInfoinfo=(ApplicationInfo)appInfoFld.get(pkgParserPkg);
- //uid输出为"-1",原因是未安装,系统未分配其Uid。
- Log.d("ANDROID_LAB","pkg:"+info.packageName+"uid="+info.uid);
- //ResourcespRes=getResources();
- //AssetManagerassmgr=newAssetManager();
- //assmgr.addAssetPath(apkPath);
- //Resourcesres=newResources(assmgr,pRes.getDisplayMetrics(),
- //pRes.getConfiguration());
- ClassassetMagCls=Class.forName(PATH_AssetManager);
- ConstructorassetMagCt=assetMagCls.getConstructor((Class[])null);
- ObjectassetMag=assetMagCt.newInstance((Object[])null);
- typeArgs=newClass[1];
- typeArgs[0]=String.class;
- MethodassetMag_addAssetPathMtd=assetMagCls.getDeclaredMethod("addAssetPath",
- typeArgs);
- valueArgs=newObject[1];
- valueArgs[0]=apkPath;
- assetMag_addAssetPathMtd.invoke(assetMag,valueArgs);
- Resourcesres=getResources();
- typeArgs=newClass[3];
- typeArgs[0]=assetMag.getClass();
- typeArgs[1]=res.getDisplayMetrics().getClass();
- typeArgs[2]=res.getConfiguration().getClass();
- ConstructorresCt=Resources.class.getConstructor(typeArgs);
- valueArgs=newObject[3];
- valueArgs[0]=assetMag;
- valueArgs[1]=res.getDisplayMetrics();
- valueArgs[2]=res.getConfiguration();
- res=(Resources)resCt.newInstance(valueArgs);
- CharSequencelabel=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){
- Drawableicon=res.getDrawable(info.icon);
- ImageViewimage=(ImageView)findViewById(R.id.apkIconBySodino);
- image.setVisibility(View.VISIBLE);
- image.setImageDrawable(icon);
- }
- }catch(Exceptione){
- e.printStackTrace();
- }
- }
- }
注明出处:http://blog.csdn.net/sodino/archive/2011/03/01/6215224.aspx
更多相关文章
- android JNI层线程回调Java函数
- 硬件访问服务4之Android硬件访问服务框架及系统函数全详细实现
- Android 应用没有桌面图标
- Android 桌面图标添加未读消息角标APP角标最佳实践
- Android 如何改变应用图标
- android 创建快捷方式图标到桌面
- 重载android返回键响应函数
- Android获取高清app图标代码分享
- Android EditText中添加图标的简单方法