今天做Android项目的时候用到了屏幕快照这个东西,就是如何将屏幕截屏下来并进行保存。虽然不难,但是记录下来,以备不时。代码直接拷贝进项目中即可使用。
屏幕快照ScreenShot类:
package com.cloudclassroom.student.common;import java.io.FileOutputStream;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.Rect;import android.util.Log;import android.view.View;import android.widget.Toast;/** * @author Rickey ** 2015年8月16日下午5:40:47 * * @TODO 屏幕快照 公共类 */public class ScreenShot { /** * 获取指定Activity的截屏,保存到png文件 * @param activity * @return */ private static Bitmap takeScreenShot(Activity activity) { // View是需要截图的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; Log.i("TAG", "" + statusBarHeight); // 获取屏幕长和高 int width = activity.getWindowManager().getDefaultDisplay().getWidth(); int height = activity.getWindowManager().getDefaultDisplay().getHeight(); // 去掉标题栏 // Bitmap b = Bitmap.createBitmap(b1, 0, 25, 320, 455); Bitmap b = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height - statusBarHeight); view.destroyDrawingCache(); return b; } /** * 保存到sdcard * @param b 位图 * @param strFileName 保存路径 */ private static void savePic(Bitmap b, String strFileName) { FileOutputStream fos = null; try { fos = new FileOutputStream(strFileName); if (null != fos) { b.compress(Bitmap.CompressFormat.PNG, 90, fos); fos.flush(); fos.close(); } } catch (Exception e) { Toast.makeText(CommonVariable.Context, "快照失败", Toast.LENGTH_SHORT).show(); } } /** * 屏幕快照程序入口 * @param activity 需要获得快照的activity实例 */ public static void shoot(Activity activity) { //此处的第二个参数改为自己的保存路径+文件名即可 ScreenShot.savePic(ScreenShot.takeScreenShot(activity), FileHelper.imgPath + FileHelper.getPNGPictureFileName()); }}
上面的代码中,我使用了同一文件管理类FileHelper类,此类就是负责管理所以文件的存储路径以及创建文件夹,如果是直接将文件保存在SD卡根目录中, 可以不用创建文件夹(即下面都是白说,可以不用理会。),直接将路径写入即可。
同一文件管理类FileHelper类:
package com.cloudclassroom.student.common;import java.io.File;import android.os.Environment;/** * @author Rickey ** 2015-07-28 2:37:33 PM * * @TODO 文件操作类 */public class FileHelper { /** * sd卡目录 */ public static final String sdkPath = Environment.getExternalStorageDirectory().getPath() + "/CloudClassroom_Student/"; /** * 图片路径 */ public static final String imgPath = sdkPath + "img/"; /** * 使用时间作为图片文件名,如“120726113136817.png” * * @param R_SRART_TIME * @return 文件全名 */ public static String getPNGPictureFileName() { return System.currentTimeMillis() + ".png"; } /** * sd卡是否可用 * * @return */ public static boolean isSDKEnable() { return Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED); } /** * create:zyf *
* create date:2015-7-28 下午4:28:03 *
* 类名:FileHelper.java *
* 方法描述:文件是否存在,主要是创建父文件夹 * * @param fileName */ public static void isFileDirEx(String fileName) { isFileDirEx(new File(fileName)); } public static void isFileDirEx(File file) { File parent = file.getParentFile(); if (!parent.exists()) { parent.mkdirs(); } }}
在使用FileHelper类之前,必须要先对文件路径进行创建,即必须要先执行isFileDirEx()方法对文件路径中出现的文件夹进行创建,然后才能进行文件的写入等操作。在我的项目中,由于我所有的activity都是继承我自定义的基类MainAPP类,所以我在MainAPP类中的onCreate()方法中添加下面一句就一劳永逸了~~如下:
FileHelper.isFileDirEx(FileHelper.imgPath + FileHelper.getPNGPictureFileName());//初始化创建图片保存路径父文件夹
到此,一切工作都已经准备完毕,现在可以调用,试试效果如何~~
我在我的界面中,定义一个按钮进行触发,在按钮的单击监听事件里执行下面代码:
@Override public void onClick(View v) { // TODO 自动生成的方法存根 if (v == Button_Snapshot) {//快照 ScreenShot.shoot(this); } }
哈哈,完美成功了~~~
至此,结束。第一篇稍微正规的博文。各路大神多多指教~~