android 界面截图(目前速度最快)

 

android 界面截屏不算新鲜事,以前本人也写过一篇关于屏幕截图的博客,当时的需求是整体截屏,然后对特有的区域进行二次截屏,功能算是实现了,体验不是很好 ,周期太长。虽然用户感受不到,但是作为一个强迫症的程序员。会花时间追求更快的体验。

以前的截图是采用anroid Api来调用截频,这次使用adb的方式来截频,在响应速度上有明显的提升,大家可以下载试试

先写一个接口,用来回调截频的数据

如果第一个参数是true,第二个参数就是图片的路径

如果第一个参数是false,第二个参数就是错误信息

public interface CaptureImageListener {

    void getCaptureImagePath(boolean isSuucess, String imagePath);
}
  public CaptureUtil(Context context) {
        this.context = context;
    }

    public void captureScreen(CaptureImageListener listener) {
        MyLog.update("===================开始截图==" + System.currentTimeMillis());
        FileUtil.creatPathNotExcit();
        String picPath = AppInfo.BASE_IMAGE + "/capture.png";
        File dirFile = new File(picPath);
        if (!dirFile.exists()) {
            try {
                dirFile.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        try {
            //请求root权限
            Process su = Runtime.getRuntime().exec("su");
            //以下两句代表重启设备
            String strcmd = "/system/bin/screencap -p " + picPath;
            strcmd = strcmd + "\n exit\n";
            OutputStream os = su.getOutputStream();
            os.write(strcmd.getBytes());
            os.flush();
            os.close();
            if ((su.waitFor() != 0)) {
                throw new SecurityException();
            }
            zipImagePath(picPath, listener);
        } catch (Exception e) {
            MyLog.update("===截图失败==" + e.getMessage());
            TcpService.getInstance().isUpdateMirrorImage = false;
            listener.getCaptureImagePath(false, "");
        }
        MyLog.update("===================截图结束==" + System.currentTimeMillis());
    }

请求root权限,然后调用截图,保存,之后进行图片压缩,压缩我使用的是鲁班压缩,需要了解的可以去这里看看

鲁班压缩跳转 https://blog.csdn.net/fkgjdkblxckvbxbgb/article/details/79862343

下面是压缩方法

 private void zipImagePath(String savePath, final CaptureImageListener listner) {
        MyLog.update("===================开始压缩==" + System.currentTimeMillis());
        File file = new File(savePath);
        MyLog.update("====压缩钱文件的大小==" + file.length());
        if (file.length() < (1024 * 100)) {  //如果图片<400KB,不用压缩,直接返回
            MyLog.update("===================不用压缩==" + System.currentTimeMillis());
            listner.getCaptureImagePath(true, savePath);
            return;
        }
        Luban.with(context)
                .load(savePath)                                   // 传人要压缩的图片列表
                .ignoreBy(100)                                  // 忽略不压缩图片的大小
                .setTargetDir(AppInfo.BASE_CACHE)  // 设置压缩后文件存储位置,文件夹路径
                .setCompressListener(new OnCompressListener() { //设置回调
                    @Override
                    public void onStart() {
                        MyLog.update("========图片开始压缩=====");
                    }

                    @Override
                    public void onSuccess(String savePath) {
                        listner.getCaptureImagePath(true, savePath);
                        MyLog.update("===================压缩success==" + System.currentTimeMillis());
                    }

                    @Override
                    public void onError(Throwable e) {
                        TcpService.getInstance().isUpdateMirrorImage = false;
                        listner.getCaptureImagePath(false, e.toString());
                        MyLog.update("===================图片压缩failed==" + System.currentTimeMillis());
                    }
                }).launch();    //启动压缩
    }

  目前使用的状态来看,这个还比较快,基本几毫秒,就可完成截频压缩所有的工作,cpu性能差一点的,也就几十毫秒的差别。

 

 

 

 

你可能感兴趣的:(安卓前端,android)