提取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文件了。

这个待第三篇再分解。




 

posted @ 2012-03-16 23:55  我是函数  阅读(2148)  评论(0编辑  收藏  举报