Android屏幕截屏

#tech #java #android

只是一个项目需求,希望获取手机的屏幕截图。本来以为实现会是比较简单的事情,了解了下发现并非如此。

最开始用的是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