今天做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
* <p>
* 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
* <p>
* 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
* <p>
* create date:2015-7-28 下午4:28:03
* <p>
* 类名:FileHelper.java
* <p>
* 方法描述:文件是否存在,主要是创建父文件夹
*
* @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);
}
}
哈哈,完美成功了~~~
至此,结束。第一篇稍微正规的博文。各路大神多多指教~~