近来公司项目要求能够截取一下android的屏幕,先到网上搜索了一下,发现例子一大堆,但是能用却不是太多,然后发现android系统本身自带的有截图的命令


screencap 和screenshot


shell@android:/ $ screenshot -h

screenshot -h

unknown option -- husage: screenshot [-s soundfile] filename.png

-s: play a sound effect to signal success

-i: autoincrement to avoid overwriting filename.png

1|shell@android:/ $ screencap -h

screencap -h

usage: screencap [-hp] [FILENAME]

-h: this message

-p: save the file as a png.

If FILENAME ends with .png it will be saved as a png.

If FILENAME is not given, the results will be printed to stdout.


既然有这个命令,并且有android的源码,那就看看到底是怎么实现的吧


这里给大家强烈推荐一个查找代码的网站


http://code.metager.de/source/xref/android/


这个里面直接输入要搜索的文件名称,即可找到需要的文件,首先先搜索了一把


结果的网址在

http://code.metager.de/source/xref/android/4.0.3/frameworks-base/cmds/screencap/screencap.cpp


这个网址,发现使用c++编写的代码,还要依赖很多库文件,并且不是特别好看明白,所以就没有细看,然后又搜索了一下

http://code.metager.de/source/xref/android/4.0.3/frameworks-base/cmds/screenshot/screenshot.c


搜索到了这个文件,发现其就是一个简单的实现截屏的小工具,直接里面有main函数的,呵呵

那就把它拷贝下来进行移植吧,然后

移植的过程中,需要加入一个libpng的库文件,不过这个也不是难事,从android源代码里面找到libpng的库文件,然后配置一下makefile文件即可。


但是在移植和开发的过程中,一个难点是有些手机原始的fb0 出来的数据是 BGRA格式,需要转换为RGBA的格式,但是有些手机就直接是RGBA格式的就不用转换了,但是现在还没有找到区别的方法。不过相信也不会太难,留给做上层应用的同事来解决好了 呵呵


我自己写了一个demo例子,需要的朋友请到下面的链接下载即可。


http://down.51cto.com/data/951556


http://down.51cto.com/data/956437

用后面的那个地址,里面实现了jni和命令行两种调用方式