提取apk文件 (二)
前期提要
上一篇,完成了基本读取apk列表的任务。
这一篇主要完成从手机内存中读取apk,保存到sdcard中。
详细步骤
一
创建列表的上下文菜单
public void onCreateContextMenu(ContextMenu menu, View paramView,
ContextMenu.ContextMenuInfo paramContextMenuInfo) {
super.onCreateContextMenu(menu, paramView, paramContextMenuInfo);
menu.add(0, SAVE, 0, "保存apk");
menu.add(0, SEND, 1, "发送apk");
}
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo menu = (AdapterView.AdapterContextMenuInfo) item
.getMenuInfo();
ResolveInfo apkInfo = (ResolveInfo) getListAdapter().getItem(
menu.position);
switch (item.getItemId()) {
case SAVE:
save(apkInfo);
break;
case SEND:
break;
case 102:
}
return super.onContextItemSelected(item);
}
这样长按列表项的时候就会弹出菜单了。
目前设计两个功能保存apk到sd卡,发送apk文件(尚未实现)
这里有个注意,需要注册这个菜单到listview
registerForContextMenu(getListView());
二
下面就是具体的apk保存了。
private File save(ResolveInfo apkInfo) {
String apkPath = apkInfo.activityInfo.applicationInfo.sourceDir;
Toast.makeText(this, apkPath, Toast.LENGTH_SHORT).show();
File infile = new File(apkPath);
File outfile = new File("/sdcard/apk/save/"+apkInfo.loadLabel(getPackageManager())+".apk");
//确认sd可写
if (Environment.MEDIA_MOUNTED.endsWith(Environment
.getExternalStorageState())) {
}
// TODO Auto-generated method stub
try {
InputStream in = new FileInputStream(infile);
OutputStream out = new FileOutputStream(outfile);
byte[] bytes=new byte[1000];
int r;
while ((r = in.read(bytes)) != -1) {
out.write(bytes);
}
in.close();
out.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return outfile;
}
主要还是对resolveinfo的运用吧。
String apkPath = apkInfo.activityInfo.applicationInfo.sourceDir
这一句获取了正确的apk路径。
然后就是基础的读写文件的功能实现了。需要在权限里增加写sd卡的权限。
截图显示了成功保存了文件。
总结:
获取apk的路径这一步其实是自己探索出来的。找了些资料都没有什么价值。
apk保存后,下一步如何传送到PC上,是个比较麻烦的问题。
因为PC上可能需要服务端的支持。如果通过邮件的话,估计延迟比较大。
目前的话可以考虑ftp上传吧。
然后就是反编译apk文件了。
这个待第三篇再分解。