2013-06-16 2 views
0

SD 카드에 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))); 
       } 
      } 
     } 

} 

    } 

답변

0

당신은 단지 그것을 열고

파일 일반하지 않고 어떻게 든 디코딩주의 AndroidManifest.xml에서 패키지 이름을 읽을 수 있도록 APK 실제로 zip 파일이며, 하지만 거기에있어

+0

설치하는 응용 프로그램없이 패키지 이름을 어떻게 알 수 있습니까? – user2425717

+0

당신은 apk 파일을 설치하지 않고 단지 압축을 풀 필요가 없습니다. – shem

+0

아니요. 제가 만든 APk 파일을 sdcard에서로드하고 설치하고 ss 카드에서로드하는 모든 애플리케이션이 아닌 inlistview 만 보여줄 수 있습니다. – user2425717

관련 문제