欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Android获取未安装的APK图标的代码,android获取apk图标, import java

来源: javaer 分享于  点击 26895 次 点评:35

Android获取未安装的APK图标的代码,android获取apk图标, import java


 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();          }      }  }  
相关栏目:

用户点评