Android:adb的screencap命令实现屏幕截图并保存
项目测试中有个需求是截取当前屏幕所显示的内容,并且截屏并保存到指定文件夹中。
主流方法之一是获取当前屏幕View并保存为bitmap对象,之后bitmap保存到指定文件夹即可。
下面是从网络上整理得到的代码:
public static Bitmap takeScreenShot(Activity activity) { // 准备截图要保存的View View view = activity.getWindow().getDecorView(); view.setDrawingCacheEnabled(true); view.buildDrawingCache(); Bitmap b1 = view.getDrawingCache(); // 获取状态栏高度 Rect frame = new Rect(); activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame); int statusBarHeight = frame.top; // 获取屏幕长和高 int width = activity.getWindowManager().getDefaultDisplay().getWidth(); int height = activity.getWindowManager().getDefaultDisplay().getHeight(); // 去掉标题栏 Bitmap b = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height - statusBarHeight); view.destroyDrawingCache(); return b; }
保存bitmap到指定路径文件的方法如下:
/** * 保存Bitmap到文件 * * @param context * @param bmp * @param folderPath * @return */ public static boolean storeImage(Context context, Bitmap bmp, String folderPath) { // 拍照按下时更新本次操作的年月日时分秒 String date = new SimpleDateFormat(DATA_FORMAT) .format(new Date()); // 图片文件保存的全路径 String path = folderPath + File.separator + date + ".jpg"; File f = new File(path); if (f != null && !f.getParentFile().exists()) { f.getParentFile().mkdirs(); } try { FileOutputStream out = new FileOutputStream(f); bmp.compress(Bitmap.CompressFormat.JPEG, 100, out); out.flush(); out.close(); } catch (FileNotFoundException e) { e.printStackTrace(); return false; } catch (IOException e) { e.printStackTrace(); return false; } // Insert into MediaStore. ContentValues values = new ContentValues(); values.put(ImageColumns.TITLE, date); values.put(ImageColumns.DISPLAY_NAME, date + ".jpg"); values.put(ImageColumns.DATE_TAKEN, System.currentTimeMillis()); values.put(ImageColumns.MIME_TYPE, "image/jpeg"); values.put(ImageColumns.ORIENTATION, 0); values.put(ImageColumns.DATA, path); values.put(ImageColumns.WIDTH, bmp.getWidth()); values.put(ImageColumns.HEIGHT, bmp.getHeight()); try { Uri uri = context.getContentResolver().insert( Images.Media.EXTERNAL_CONTENT_URI, values); if (uri == null) { Log.e("jileniao.net", "Failed to insert MediaStor", e); return false; } else { context.sendBroadcast(new Intent( "com.android.camera.NEW_PICTURE", uri)); } } catch (Exception e) { Log.e("jileniao.net", "Failed to write MediaStore", e); return false; } return true; }
这样固然是可以的,但必须要改动源代码了,因为开头说到这是在测试阶段临时要使用的一个功能,所以即使对工程源码改动很小,但还是尽量能不动源码就不动了吧。
其实adb命令中,已经有给我们提供的截图命令,我们只要在adb shell下直接使用即可。
具体使用adb的screencap命令截取当前屏幕并保存到指定文件的方法如下:
- 确保手机和PC建立adb连接
- adb shell
- su
- cd /storage/emulated/legacy/Download/(在手机上先临时指定一个存放截图文件的目录,以Download目录作为例子)
- screencap -p 1.jpg
- 在第4步中指定的目录下即可看到1.jpg的截图文件
这样通过几个命令即可完成对屏幕的截取并直接保存到文件中了。
另外,实际使用中可以考虑做成shell文件,直接一键执行处理等。