Android屏幕快照

今天做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);
        }
         
    }


哈哈,完美成功了~~~


至此,结束。第一篇稍微正规的博文。各路大神多多指教~~


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值