产品今天提了个需求,让把每次交易成功后的界面都自动截屏保存到手机中;
查找了下资料,可以有两种思路,
第一:截取指定控件的界面,实现需要根据控件的id来截取;
第二:截取整个屏幕,实现需要获取整个窗口来截取;
先看下实现效果:
布局文件效果图:
交易成功截取中间签购单的效果图:
交易成功截取整个屏幕效果图:
实现方法如下:
当截取控件是View传入的是控件的id;
当截取整个屏幕时View传入的是getWindow().getDecorView();
private void saveTransImage(View v) {
try {
Bitmap bitmap = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas();
canvas.setBitmap(bitmap);
v.draw(canvas);
// 首先保存图片路径
File appDir = new File(Environment.getExternalStorageDirectory(), "xxxx");//xxxx为手机本地生成的文件夹名//称,自定义
if (!appDir.exists()) {
appDir.mkdir();
}
//当前时间来命名图片,这样就不会覆盖之前的图片,如果此值固定就只有一张图片,以前的会被替换;
String fileName = Device.getDateTime() + ".jpg";
File file = new File(appDir, fileName);
try {
FileOutputStream fos = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
} catch (FileNotFoundException e) {
throw new InvalidParameterException();
}
bitmap.recycle();
} catch (Exception e) {
e.printStackTrace();
}
}
布局文件(截取的签购单就是根据标出的id来截取的):
注意:
Android 6.0+系统需要在onCreate()增加读取SDcard的权限;
/**
* 检查相册权限
*/
public void checkPermission() {
if (Build.VERSION.SDK_INT >= 23) {
List<String> permissionStrs = new ArrayList<>();
//sd卡写入权限
int hasWriteSdcardPermission = ContextCompat.checkSelfPermission(SaleSlipActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (hasWriteSdcardPermission != PackageManager.PERMISSION_GRANTED) {
permissionStrs.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
//相机权限
// int hasCameraPermission = ContextCompat.checkSelfPermission(
// SaleSlipActivity.this,
// Manifest.permission.CAMERA);
// if(hasCameraPermission != PackageManager.PERMISSION_GRANTED) {
// permissionStrs.add(Manifest.permission.CAMERA);
// }
String[] stringArray = permissionStrs.toArray(new String[0]);
if (permissionStrs.size() > 0) {
ActivityCompat.requestPermissions(this, stringArray, REQUEST_CODE_ASK_PERMISSIONS);
return;
}
}
}
//权限设置后的回调函数,根据不同权限进行相应设置,
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
//requestPermissions传入的参数为几个权限,则permissions和grantResults为对应权限和设置结果
case REQUEST_CODE_ASK_PERMISSIONS:
//遍历每个权限设置情况
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//需要相关权限的操作
} else {
Toast.makeText(SaleSlipActivity.this, "权限未开启", Toast.LENGTH_SHORT).show();
}
}
super.onRequestPermissionsResult(requestCode, permissions,
grantResults);
}
注:如有问题可以回复,看到第一时间分析解决,码农不易,感觉对您有用,帮助到您,可否打赏一杯可乐,在此谢过诸位,愿诸君终成大神,前程似锦~~~