如何安装应用程序包名称?

时间:2013-06-16 13:22:47

标签: android

我在SDcard中有一个apk文件列表。它显示了它的名字和图标;一切正常。

此应用程序显示了Sdcrd中的卸载apk文件列表,当用户从此列表中安装任何Apk时,其'包名称将保存在数据库上,因此当用户转到另一个屏幕时,该屏幕将仅显示该应用程序从哪个区域安装SD卡。

如何从列表中获取用户单击安装的apk文件的名称?

这是我的代码:

    public class SdcardAPkMgr extends ListActivity {

private List<FileInformation> files_list;
private ProgressDialog mLoadDialog;
private Handler handler;
private static final int SCAN_APK_START = 101;
private static final int SCAN_APK_COMLETED = 102;
private boolean mJustCreate = true;

/** Called when the activity is first created. */
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.apk_list);
    files_list = new ArrayList<FileInformation>();
}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    setupBatchHandler();
    if (mJustCreate) {
        thread.start();
    }
    mJustCreate = false;
}

private void setupBatchHandler() {
    // TODO Auto-generated method stub
    handler = new Handler() {
        // @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case SCAN_APK_START: {
                mLoadDialog = 
 ProgressDialog.show(SdcardAPkMgr.this, "",
                        getString(R.string.scan_apk_info));
                mLoadDialog.setCancelable(false);
                break;
            }
            case SCAN_APK_COMLETED: {
                ApkListAdapter adapter = new ApkListAdapter(
                        SdcardAPkMgr.this, files_list);
                SdcardAPkMgr.this.setListAdapter(adapter);
                mLoadDialog.dismiss();
                break;
            }
            default:
                break;
            }
            super.handleMessage(msg);
        }
    };
}

Thread thread = new Thread(new Runnable() {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        handler.sendEmptyMessage(SCAN_APK_START);
        getAllApkFiles(new File("/sdcard"));
        handler.sendEmptyMessage(SCAN_APK_COMLETED);
    }
});

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    FileInformation information = files_list.get(position);
     Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(Uri.fromFile(new File(information.getPath())), 
   "application/" +
                        "vnd.android.package-archive");
        this.startActivity(intent);
}

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();
            // 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(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);
            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 (info.icon != 0) {
                dr = res.getDrawable(info.icon);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    if (dr == null) {
        dr = getResources().getDrawable(R.drawable.default_apk_icon);
    }
    return dr;
}

private void getAllApkFiles(File root) {

    File files[] = root.listFiles();

    if (files != null)
        for (File f : files) {
            if (f.isDirectory()) {
                getAllApkFiles(f);
            } else {
                if (f.getName().indexOf(".apk") > 0) {
                    // this.list.add(f);
                    String path = f.toString();
                    String name = 
  path.substring(path.lastIndexOf("/") + 1,
                            path.length());
                    this.files_list.add(new 
   FileInformation(name, path,
                            getAPKDrawable(path)));
                }
            }
        }

}

  }

1 个答案:

答案 0 :(得分:0)

APK实际上是一个zip文件,因此您只需打开它并从AndroidManifest.xml

中读取包名称

请注意文件不清晰并以某种方式解码,但它就在那里