android截屏功能实现

这篇文章实现了截取当前Activity页面,并把截屏图片储存在SD卡指定路径下功能(亲测可用)。


首先要确保manifest有操作SD卡权限

<!-- 允许应用内置sd卡 -->

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

下面方法是根据当前的activity截屏,生成bitmap对象

 /**
     * 获取指定Activity的截屏,保存到png文件
     *
     * @author Johnson
     * **/
    private static Bitmap takeScreenShot(Activity activity) {
        // View是你需要截图的View
        View view = activity.getWindow().getDecorView();
        // 设置是否可以进行绘图缓存
        view.setDrawingCacheEnabled(true);
        // 如果绘图缓存无法,强制构建绘图缓存
        view.buildDrawingCache();
        // 返回这个缓存视图
        Bitmap bitmap = view.getDrawingCache();
        // 获取状态栏高度
        Rect frame = new Rect();
        // 测量屏幕宽和高
        view.getWindowVisibleDisplayFrame(frame);
        int statusBarHeight = frame.top;
        Log.d("ViewDescActivity","状态栏的高度为: "+statusBarHeight);
        // 获取屏幕长和高
        int width = activity.getWindowManager().getDefaultDisplay().getWidth();
        int height = activity.getWindowManager().getDefaultDisplay().getHeight();
        // 去掉标题栏
        // Bitmap b = Bitmap.createBitmap(b1, 0, 25, 320, 455);
        bitmap = Bitmap.createBitmap(bitmap, 0, statusBarHeight, width, height-statusBarHeight);
        //view.destroyDrawingCache();
        return bitmap;
    }

然后我们应该查看SD卡是不是够用

 /***
     * Sd判断SD卡是否可用
     *
     * @author Johnson minSizeSDcard>50kb
     * */
    public static boolean getAvailableSDcard(Context context) {
        long minSizeSDcard = 50;
        boolean sdCardExist = Environment.getExternalStorageState().equals(
                android.os.Environment.MEDIA_MOUNTED); // 判断sd卡是否存在
        System.out.println("+++" + sdCardExist);
        if (sdCardExist) {
            File path = Environment.getExternalStorageDirectory();
            StatFs stat = new StatFs(path.getPath());
            long blockSize = stat.getBlockSize();
            long availableBlocks = stat.getAvailableBlocks();
            long sdCardSize = (availableBlocks * blockSize) / 1024;// KB值
            if (sdCardSize > minSizeSDcard) {
                return true;
            } else {
                Toast.makeText(context, "SD卡空间不足", Toast.LENGTH_SHORT).show();
            }
        } else {
            Toast.makeText(context, "请插入SD卡", Toast.LENGTH_SHORT)
                    .show();
        }
        return false;
    }

最后生成png图片保存到指定路径

/**
     * 截图保存
     *
     * @author Johnson
     * **/
    private static void savePic(Bitmap b, String filePath, String fileName) {
        File f = new File(filePath);
        if (!f.exists()) {
            f.mkdir();
        }
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(filePath + File.separator + fileName);
            if (null != fos) {
                b.compress(Bitmap.CompressFormat.PNG, 90, fos);
                fos.flush();
                fos.close();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

可以这样调用

  Bitmap bitmap = takeScreenShot(ViewDescActivity.this);
        String fileName = String.valueOf(System.currentTimeMillis());
        if(getAvailableSDcard(ViewDescActivity.this)){
            savePic(bitmap,Constant.SD_DIR_SCREEN_SHOT,fileName+".png");
            localUrl =  Constant.SD_DIR_SCREEN_SHOT+ fileName+".PNG";
        }

开始忘记加允许应用内置sd卡权限,系统报错:

01-06 23:32:40.203: ERROR/ActivityThread(1954): Failed to find provider info for com.qihoo360.daemon
01-06 23:32:43.148: ERROR/AudioTrack(1632): Audio track delete
01-06 23:32:43.148: ERROR/AudioTrack(1632): stop 0x528b88
01-06 23:32:43.148: ERROR/AudioTrack(1632): Stop complete
01-06 23:32:43.148: ERROR/AudioTrack(1632): Audio track exit start
01-06 23:32:43.148: ERROR/AudioTrack(1632): Audio track exit done
01-06 23:32:43.335: ERROR/AudioTrack(1632): stop 0x545d70
01-06 23:32:43.335: ERROR/AudioTrack(1632): Stop complete

然后忘记在fileName后面加“.png” 后果就是生成非图片文件。

提醒自己以后不要这么粗心了。



参考博客:http://blog.csdn.net/developer_jiangqq/article/details/12164239




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值