在几个月前有接到项目老大这样一个需求:实时获取用户当前app的操作界面 ~
因为近俩年主要做的是售货机业务,所以长连接使用的是mqtt,这里主要讲接收到消息后,我们去获取操作界面时的操作,即实时截屏+本地保存 ~
在早期的时候有记录过一篇关于截图的Blog,有需求也可以去扩展
根据以下操作后,亲测已实现需求功能,但是因售货机版本大多在5.0之前,所以在手机开发时要记得适配 6.0动态权限,7.0文件临时授权
在长连接中收到消息后,我采用eventbus传递消息,进行app当前界面截屏+图片保存
here:当执行完以选操作时,我们可以去查看本地是否已经保存好我们需要的用户操作界面图 ~
case Constant.EventBus.SCREEN_SHOT:
//截图,mScreenParent为所截图区域的最外层布局控件
Bitmap bitmap = BitmapTool.convertCanvasViewToBitmap(mScreenParent);
//图片保存
if (bitmap != null) {
//Constant.LocalPath.BASIC_PATH:Environment.getExternalStorageDirectory().getPath();
BitmapTool.saveImage(bitmap, Constant.LocalPath.BASIC_PATH);
}
break;
mScreenParent控件id,处于layout的最外层
截图 - convertCanvasViewToBitmap
/**
* 创建一个bitmap放于画布之上进行绘制 (简直如有神助)
*/
public static Bitmap convertCanvasViewToBitmap(View tempView) {
Bitmap bitmap = Bitmap.createBitmap(tempView.getWidth(),
tempView.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
tempView.draw(canvas);
return bitmap;
}
保存图片 - saveImage
/**
* 保存图片
*/
public static void saveImage(Bitmap bitmap, String path) {
File file = new File(path);
if (!file.exists()) {
file.mkdir();
}
try {
String tmpImgPath = path + "/" + "screenShot" + System.currentTimeMillis() + ".png";
FileOutputStream fileOutputStream = new FileOutputStream(tmpImgPath);
int bmSize = bitmap.getByteCount();
int kb = bmSize / 1024;
int mb = kb / 1024;
kb = kb % 1024;
Log.d("Bitmap", "bitmap size = " + mb + "MB " + kb + "KB");
//图片压缩
Bitmap bitmap1 = compressImage(bitmap);
bitmap1.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
// bitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
bmSize = bitmap1.getByteCount();
kb = bmSize / 1024;
mb = kb / 1024;
kb = kb % 1024;
Log.d("Bitmap", "bitmap size = " + mb + "MB " + kb + "KB");
// bitmap.recycle();
fileOutputStream.close();
} catch (Exception e) {
LogTool.e(e.getMessage());
}
}
图片压缩 - compressImage
/**
* 质量压缩方法
*
* @param image
* @return
*/
public static Bitmap compressImage(Bitmap image) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
int options = 90;
// 循环判断如果压缩后图片是否大于100kb,大于继续压缩
while (baos.toByteArray().length / 1024 > 100) {
// 重置baos即清空baos
baos.reset();
// 这里压缩options%,把压缩后的数据存放到baos中
image.compress(Bitmap.CompressFormat.JPEG, options, baos);
// 每次都减少10
options -= 10;
if (options < 0) {
break;
}
}
// 把压缩后的数据baos存放到ByteArrayInputStream中
ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
// 把ByteArrayInputStream数据生成图片
Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);
return bitmap;
}