Android:adb的screencap命令实现屏幕截图并保存

2015年07月27日 Android 暂无评论 阅读11916次

项目测试中有个需求是截取当前屏幕所显示的内容,并且截屏并保存到指定文件夹中。

主流方法之一是获取当前屏幕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命令截取当前屏幕并保存到指定文件的方法如下:

  1. 确保手机和PC建立adb连接
  2. adb shell
  3. su
  4. cd /storage/emulated/legacy/Download/(在手机上先临时指定一个存放截图文件的目录,以Download目录作为例子)
  5. screencap -p 1.jpg
  6. 在第4步中指定的目录下即可看到1.jpg的截图文件

这样通过几个命令即可完成对屏幕的截取并直接保存到文件中了。

另外,实际使用中可以考虑做成shell文件,直接一键执行处理等。

分享本文至:

WRITTEN BY

avatar
看了本文是不是觉得很赞,那就赶紧点击下面按钮分享给身边的朋友吧!

欢迎留言




用户登录

sitemap