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)));
}
}
}
}
}