博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android屏幕快照(or Android截屏)
阅读量:7225 次
发布时间:2019-06-29

本文共 4222 字,大约阅读时间需要 14 分钟。

hot3.png

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

哈哈,完美成功了~~~

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

转载于:https://my.oschina.net/Rickeyzhu/blog/493196

你可能感兴趣的文章
JVM,DVM,ART
查看>>
webgl滤镜--会呼吸的痛
查看>>
用Go语言实现微信支付SDK
查看>>
oauth2在php实践
查看>>
LeetCode.914 卡牌分组
查看>>
填坑app:compileDebugJavaWithJavac
查看>>
Android 100+行实现本地跳一跳辅助(不需要连接电脑)
查看>>
位状态的使用
查看>>
面试技术题笔记
查看>>
Myth源码解析系列之一-项目简介
查看>>
JS易混淆的方法整理
查看>>
iOS下JS与OC互相调用(八)--Cordova详解+实战
查看>>
七牛实时音视频云视频连线demo(web部分)
查看>>
Netty源码分析(六):SelectedSelectionKeySetSelector
查看>>
forEach,for...of,map与asycn/await
查看>>
springboot 2 Hikari 多数据源配置问题(dataSourceClassName or jdbcUrl is required)
查看>>
Golang数据库编程之GORM模型定义与数据库迁移
查看>>
Oracle redo解析之-4、rowid的计算
查看>>
Easy Scheduler 1.0.3 发布,分布式工作流任务调度系统
查看>>
java 颠倒整数
查看>>