android中截图工具screencap保存为字节数组并转化为bitmap
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。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);