只是一个项目需求,希望获取手机的屏幕截图。本来以为实现会是比较简单的事情,了解了下发现并非如此。
最开始用的是getDrawingCache()
方法,只能获取到当前Activity里的界面内容,无论把activity进行缩小或者透明化都是layout布局里的样子。显然不能达到我们希望的功能需求。第一次是在onCreat() 里写了shot() 入口。发现getDrawingCache总是返回null,经查询得知是页面未加载完全,感觉就是view没有完全生成。把shot写入button事件里即可获取截图。进而发现该方法只能获取当前页面的截图,即当前activity的样子。即便把activity写成透明状态也不会抓取桌面内容,只是获取一个黑色背景的activity界面。感觉是图层不在一起,所以不能截取桌面内容?
只好采用另一种方法,读取framebuffer。简单说可能要完整的使用该方法需要进入native层进行c编写。但是,我寻求了一种偷懒的方法,还是在Activity里使用。只是在onCreate()里对程序进行了root授权。(读取Framebuffer,必须要root手机的,这也是市面上为什么一般截屏软件都需要root手机的原因。)之后调用了screenShot()方法,如下:
public void screenShot(String path){
Process process = null;
try{
process = Runtime.getRuntime().exec("su");
PrintStream outputStream = null;
try {
outputStream = new PrintStream(new BufferedOutputStream(process.getOutputStream(), 8192));
outputStream.println("screencap -p " + path);
outputStream.flush();
}catch(Exception e){
e.printStackTrace();
} finally {
if (outputStream != null) {
outputStream.close();
}
}
process.waitFor();
}catch(Exception e){
e.printStackTrace();
}finally {
if(process != null){
process.destroy();
}
}
}
还有其他的一些方法,但是好像效果都不如这个。也是在网上搜来直接用了,感谢前人大大。其他方法回头贴到Gist里,再补充链接好了。最近重装了电脑,没有Shadowsocks,翻不了墙,百度云存的自由门也给我审查了,神烦,还我Dropbox!
嗯对,今天愚人节。Happy the fucking Fool’s Day!
哦,对了,HH:mm:ss是24小时制,hh:mm:ss是12小时制。yyyy-MM-dd,大M是与表示分钟的小m区分的。:-D