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);