读取apk程序包的内容

一、对于已安装应用,只需要getPackageManager().getInstalledPacked(int flags)即可得到PackageInfo.

packageInfo.applicationInto中可以得到所有信息。
注:区别系统应用和用户应用:applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM
二、对于未安装应用(apk文件)
使用packageManager.getPackageArchiveInfo(String filePath,int flags),只能得到部分信息。
所有int形式的资源(label,icon等)都是无法得到的,需要使用反射机制用到隐藏接口
方法如下:
```Resources res=getResources(); AssetManager asm=new AssetManager();//隐藏api asm.addAssetPath(String apkfilePath);//隐藏api res=new Resources(asm,res.getDisplayMetrics(),res.getConfiguration());//隐藏api```
然后使用res.getString(int resId)   res.getDrawable(int resId)即可得到apk文件内部的资源。(此处资源id可通过上面的公开方法得到)
关键点就在于assetManager.addAssetPath(String apkfilePath)此方法。
现在要做的就是使用反射机制实现上面的隐藏api。
具体反射实现代码如下:
```Class asm_cls = Class.forName("android.content.res.AssetManager"); Object asm_obj = asm_cls.getDeclaredConstructor((Class[]) null).newInstance((Class[]) null); asm_obj.getClass() .getDeclaredMethod("addAssetPath", new Class[] { String.class }) .invoke(asm_obj, new Object[] { filePath }); Resources res=getResources(); res = Resources.class.getDeclaredConstructor( new Class[] { asm_obj.getClass(), res.getDisplayMetrics().getClass(), res.getConfiguration().getClass() }) .newInstance(new Object[] { asm_obj, res.getDisplayMetrics(), res.getConfiguration() }); return res;```
res.getString(applicaiontInfo.labelRes);
res.getDrawable(applicationInfo.icon);

ANDROID应用内截图的代码实现

方法一:

View view= getWindow().getDecorView();

Bitmap bmp = Bitmap.createBitmap(480, 800, Bitmap.Config.ARGB_8888);

view.draw(new Canvas(b));

bmp就是截取的图片了,可通过bmp.compress(CompressFormat.PNG, 100, new FileOutputStream(file));把图片保存为文件。

 

方法二:

getWindow().getDecorView().setDrawingCacheEnabled(true);

bmp=getWindow().getDecorView().getDrawingCache();

 

但这样得到的图片是包含状态栏和标题栏的,如果想把状态栏和标题栏去掉,可把得到的图片顶部一部分剪裁掉。

1、得到状态栏高度

Rect rect = new Rect();

view.getWindowVisibleDisplayFrame(rect);

int statusBarHeight = rect.top;

System.out.println("状态栏高度:" + statusBarHeight);

 

2、得到标题栏高度

int wintop = getWindow().findViewById(android.R.id.content).getTop();

int titleBarHeight = wintop - statusBarHeight;

System.out.println("标题栏高度:" + titleBarHeight);

 

 

注:这样得到的截图是不会包含dialog和popupwindow的,你必须单独得到popupwindow的截图,然后再和背景截图合到一起。

另外,截图的相关代码是不能放到oncreate中的,因为这时候getDectorView()得到的是null

 

 

把两个bitmap合到一起的方法很简单。

Bitmap bmpall=Biatmap.createBitmap(width,height,Config.ARGB_8888);

Canvas canvas=new Canvas(bmpall);

canvas.drawBitmap(bmp1,x,y,paint);

canvas.drawBitmap(bmp2,x,y,paint);

得到的bmpall就是合在一起的图片了。

 

ps:按理说也getWindow.findViewById(android.R.id.content)得到的view就是不包含状态栏和标题栏的view,但这个我还没有试过。

wordpress发邮件出现Could not connect to SMTP host的解决办法(转载)

很多php主机都禁用了mail()函数,所以一般找一个smtp的插件来完成发送邮件的工作。

wp-mail-smtp这个插件不错,但可能很多人都遇到过 could not connect to SMTP host的错误。

这个问题纠结很久,网上到处找,遇到这个问题的人也很多,后来终于找到了一篇文章介绍的解决办法。

Prev 2 / 13 Next