近来公司项目要求能够截取一下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和命令行两种调用方式