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

来源:赵克立 分类: Android 标签:Android发布时间:2018-09-11 11:46:20浏览:304
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。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 紧急求助须知
留下一点心意, :)
点击更换验证码
留言