注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

风之云的足迹

点击这里添加博客描述

 
 
 

日志

 
 

Windows下NativeDriver截屏功能  

2011-09-29 15:47:19|  分类: Android |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
NativeDriver中有提供截屏的API,但是在Windows下发现截屏功能是报异常的
com.google.android.testing.nativedriver.client.AdbException: IOException when reading screenshot data over adb.
System info: os.name: 'Windows XP', os.arch: 'x86', os.version: '5.1', java.version: '1.6.0-rc'

通过调试源代码发现修改几处源代码既可实现截屏功能。

1、修改AdbConnection.java文件
  这里使用了adb pull命令,文件导出来后存放在C盘下吧
  public Process pullFile(String filename) {
      //return runAdb("pull", filename, "/dev/stdout");
      //windows下截屏临时文件存放在c盘下
      return runAdb("pull", filename, “C:/fb0”);
  }

2、修改AndroidNativeDriver.java文件的getScreenshotAs方法

InputStream frameBufferStream = pullFrameBuffer.getInputStream();
上面方法获取到的输入流是空的,为什么会空的还没找到原因。导致出现了调用方法时出现的那个异常,既然我们已经把数据都保存在文件中了,那就直接从文件中来获取输入流好了
  AdbConnection adb = validateAdbConnection();
    FrameBufferFormat format = FrameBufferFormat.ofDevice(adb);

    BufferedImage screenImage = new BufferedImage(
        format.getXResolution(), format.getYResolution(),
        BufferedImage.TYPE_INT_ARGB);

    Process pullFrameBuffer = adb.pullFile(FrameBufferFormat.FB_DEVICEFILE);
    InputStream frameBufferStream;
    try {
       //前面调用adb.pullFile时会把图像数据存入到C盘,需要一些时间,这个等待几秒数据存完,不等待的话会出现IO异常
        Thread.sleep(10000);
        //pullFrameBuffer.getInputStream()获取不到数据库,则直接使用C盘下面的临时文件来获取文件流
       //这个改成通过文件的输入流获取数据
        frameBufferStream = (InputStream)new FileInputStream(AdbConnection.FB0_WINDOWS);
        format.copyFrameBufferToImage(frameBufferStream, screenImage);
      //这句话暂时注释掉,没注释截图会出现重复的4份,原因未知,但是注释掉就没问题了
//        AdbConnection.exhaustProcessOutput(frameBufferStream);
        Closeables.closeQuietly(frameBufferStream);
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        System.out.println("C:/fb0文件没有找到,该文件会自动生成用于存放截屏数据" + e);
    }
    catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    AdbConnection.confirmExitValueIs(0, pullFrameBuffer);

    String base64Png = imageToBase64Png(screenImage);

    return target.convertFromBase64Png(base64Png);
  评论这张
 
阅读(1271)| 评论(2)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018