android中截图工具screencap保存为字节数组并转化为bitmap

来源:赵克立博客 分类: Android 标签:Android发布时间:2018-09-11 11:46:20最后更新:2018-09-11 11:46:20浏览:3738
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。o_0。
更新时间:
2018-09-11 11:46:20
温馨提示:
学无止境,技术类文章有它的时效性,请留意文章更新时间,如发现内容有误请留言指出,防止别人"踩坑",我会及时更新文章

android我们用快捷键保存截图的时候是调用的系统中的screencap实现的。并且使用adb shell命令可以调用这个工具生成一张图保存到sd卡,如下

/system/bin/screencap -p /sdcard/img.png

但开发中我们可能要先保存成bitmap的格式使用,有个方法如下代码(网上找的经测试可用)

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;

import android.util.Log;

public class ScreenCaptureUtil {
    private static ScreenCaptureUtil instance;
    private byte[] tempBuffer;
    private StringBuilder buffer;

    private ScreenCaptureUtil() {
    }

    public static ScreenCaptureUtil getInstance() {
        if (instance == null) {
            instance = new ScreenCaptureUtil();
            instance.tempBuffer = new byte[100 * 1024];
            instance.buffer = new StringBuilder(100 * 1024);
        }
        return instance;
    }

    /**
     * 调用系统截图工具获取屏幕截图字节数组,格式为png,注意这是一个耗时操作,约为1-5秒。
     * 如果屏幕分辨率过高,防止内存溢出,可以考虑直接保存到文件的命令u -c /system/bin/screencap -p /sdcard/screenshot.png
     *
     * @return png格式图片的字节数组
     */
    public byte[] getScreenCapBytes() {
        //LogUtils.i("获取屏幕图片bytes");

        try {
            Process exec = Runtime.getRuntime().exec("su -c /system/bin/screencap -p");
            try {
                final InputStream inputStream = exec.getInputStream();
                BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
                //清空缓存内容
                buffer.setLength(0);
                int count;
                long start = System.currentTimeMillis();
                while ((count = bufferedInputStream.read(tempBuffer)) > 0) {
                    //Log.e("test", "count = " + count);
                    buffer.append(new String(tempBuffer, 0, count, "ISO-8859-1"));
                }
                Log.v("test", "获取截屏耗时:" + (System.currentTimeMillis() - start) + "ms png图片大小: " + buffer.length());
                bufferedInputStream.close();
                //Log.e("test", "result: " + buffer.toString());
                //exec.getOutputStream().close();
                final int retCode = exec.waitFor();
                exec.destroy();
                //Log.e("test", "retCode: " + retCode);
            } catch (final IOException | InterruptedException e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            tempBuffer = buffer.toString().getBytes("ISO-8859-1");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return tempBuffer;
    }
}

这个类是把截图输出成字节数组,下面使用时再把字节数组转成bitmap格式就可以啦

byte[] bytedata=ScreenCaptureUtil.getInstance().getScreenCapBytes();
Bitmap screenCap= BitmapFactory.decodeByteArray(bytedata, 0, bytedata.length);



微信号:kelicom QQ群:215861553 紧急求助须知
Win32/PHP/JS/Android/Python