Android全屏截图的方法,返回Bitmap并且保存在SD卡上


今天做分享,需求是截图分享,做了也是一个运动类的产品,那好,我们就直接开始做,考虑了一下,因为是全屏的分享,所有很自然而然的想到了View的getDrawingCache()方法来获取Bitmap,看到网上有人说截取不了WebView上的图片,倒是没有去尝试,因为我们的应用不需要,不过有时间还是要去试试,占占坑,这篇博客只是记录一下知识点,没什么技术含量

我们写个小Sample就好了

activity_main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:gravity="center"
  7. android:orientation="vertical"
  8. android:padding="15dp">
  9. <ImageView
  10. android:id="@+id/ivPlay"
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"/>
  13. <Button
  14. android:id="@+id/btnAllWindow"
  15. android:layout_width="match_parent"
  16. android:layout_height="wrap_content"
  17. android:text="截取全屏"/>
  18. </LinearLayout>

点击俺就截图,然后返回一个Bitmap,设置在这个imageview的控件上,拿我们写一个截图的方法

  1. /**
  2. * 截取全屏
  3. *
  4. * @return
  5. */
  6. public Bitmap captureScreenWindow() {
  7. getWindow().getDecorView().setDrawingCacheEnabled(true);
  8. Bitmap bmp = getWindow().getDecorView().getDrawingCache();
  9. return bmp;
  10. }

OK,那我们的点击事件

  1. /**
  2. * 点击事件
  3. *
  4. * @param v
  5. */
  6. @Override
  7. public void onClick(View v) {
  8. switch (v.getId()) {
  9. case R.id.btnAllWindow:
  10. Bitmap bitmap = captureScreenWindow();
  11. ivPlay.setImageBitmap(bitmap);
  12. break;
  13. }
  14. }

我们实际来看下效果

Ok,但是这样并没有保存在内存卡上,我们需要保存一下,做图片上传的功能对吧,所有,我们再来写一个保存图片的方法

  1. /**
  2. * 保存到内存卡
  3. *
  4. * @param bitName
  5. * @param mBitmap
  6. */
  7. public void saveBitmapForSdCard(String bitName, Bitmap mBitmap) {
  8. //创建file对象
  9. File f = new File("/sdcard/" + bitName + ".png");
  10. try {
  11. //创建
  12. f.createNewFile();
  13. } catch (IOException e) {
  14. }
  15. FileOutputStream fOut = null;
  16. try {
  17. fOut = new FileOutputStream(f);
  18. } catch (FileNotFoundException e) {
  19. e.printStackTrace();
  20. }
  21. //原封不动的保存在内存卡上
  22. mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
  23. try {
  24. fOut.flush();
  25. } catch (IOException e) {
  26. e.printStackTrace();
  27. }
  28. try {
  29. fOut.close();
  30. } catch (IOException e) {
  31. e.printStackTrace();
  32. }
  33. }

把我们的bitmap通过流保存,同时获取本地的时间命名,我们的点击事件就是这样:

  1. /**
  2. * 点击事件
  3. *
  4. * @param v
  5. */
  6. @Override
  7. public void onClick(View v) {
  8. switch (v.getId()) {
  9. case R.id.btnAllWindow:
  10. Bitmap bitmap = captureScreenWindow();
  11. ivPlay.setImageBitmap(bitmap);
  12. long time = System.currentTimeMillis();
  13. saveBitmapForSdCard("img" + time, bitmap);
  14. break;
  15. }
  16. }

最后的结果

OK,这只是一个很简单的截图功能,当然,还有很多其他的方法,大家自己可以去研究一下,全部代码

MainActivity

  1. package com.liuguilin.screenshotssample;
  2. import android.graphics.Bitmap;
  3. import android.os.Bundle;
  4. import android.support.v7.app.AppCompatActivity;
  5. import android.view.View;
  6. import android.widget.Button;
  7. import android.widget.ImageView;
  8. import java.io.File;
  9. import java.io.FileNotFoundException;
  10. import java.io.FileOutputStream;
  11. import java.io.IOException;
  12. public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  13. //截取全屏
  14. private Button btnAllWindow;
  15. private ImageView ivPlay;
  16. @Override
  17. protected void onCreate(Bundle savedInstanceState) {
  18. super.onCreate(savedInstanceState);
  19. setContentView(R.layout.activity_main);
  20. initView();
  21. }
  22. /**
  23. * 初始化
  24. */
  25. private void initView() {
  26. btnAllWindow = (Button) findViewById(R.id.btnAllWindow);
  27. btnAllWindow.setOnClickListener(this);
  28. ivPlay = (ImageView) findViewById(R.id.ivPlay);
  29. }
  30. /**
  31. * 点击事件
  32. *
  33. * @param v
  34. */
  35. @Override
  36. public void onClick(View v) {
  37. switch (v.getId()) {
  38. case R.id.btnAllWindow:
  39. Bitmap bitmap = captureScreenWindow();
  40. ivPlay.setImageBitmap(bitmap);
  41. long time = System.currentTimeMillis();
  42. saveBitmapForSdCard("img" + time, bitmap);
  43. break;
  44. }
  45. }
  46. /**
  47. * 截取全屏
  48. *
  49. * @return
  50. */
  51. public Bitmap captureScreenWindow() {
  52. getWindow().getDecorView().setDrawingCacheEnabled(true);
  53. Bitmap bmp = getWindow().getDecorView().getDrawingCache();
  54. return bmp;
  55. }
  56. /**
  57. * 保存到内存卡
  58. *
  59. * @param bitName
  60. * @param mBitmap
  61. */
  62. public void saveBitmapForSdCard(String bitName, Bitmap mBitmap) {
  63. //创建file对象
  64. File f = new File("/sdcard/" + bitName + ".png");
  65. try {
  66. //创建
  67. f.createNewFile();
  68. } catch (IOException e) {
  69. }
  70. FileOutputStream fOut = null;
  71. try {
  72. fOut = new FileOutputStream(f);
  73. } catch (FileNotFoundException e) {
  74. e.printStackTrace();
  75. }
  76. //原封不动的保存在内存卡上
  77. mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
  78. try {
  79. fOut.flush();
  80. } catch (IOException e) {
  81. e.printStackTrace();
  82. }
  83. try {
  84. fOut.close();
  85. } catch (IOException e) {
  86. e.printStackTrace();
  87. }
  88. }
  89. }

要注意添加一下权限哦

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

貌似代码就这么点,Demo也可以不用上传了,想一起学习Android的可以加群:555974449

什么?小伙伴你需要?那我上传好了:http://download.csdn.net/detail/qq_26787115/9637229

Android全屏截图的方法,返回Bitmap并且保存在SD卡上的更多相关文章

  1. Android—将Bitmap图片保存到SD卡目录下或者指定目录

    直接上代码就不废话啦 一:保存到SD卡下 File file = new File(Environment.getExternalStorageDirectory(), System.currentT ...

  2. Android开发调试日志工具类[支持保存到SD卡]

    直接上代码: package com.example.callstatus; import java.io.File; import java.io.FileWriter; import java.i ...

  3. Android使用sqlliteOpenhelper更改数据库的存储路径放到SD卡上

    假设使用默认的系统管理,默认放在包以下.比較省心.并且在卸载app后不会造成数据残留.可是这样也有一个问题.比方我做一个背单词的软件,那么当用户卸载掉这个app时,他辛辛苦苦下载的单词库也没了... ...

  4. Android自定义照相机实现(拍照、保存到SD卡,利用Bundle在Acitivity交换数据)

    Android自定义照相机实现 近期小巫在学校有一个创新项目,也不是最近,是一个拖了很久的项目,之前一直没有去搞,最近因为要中期检查,搞得我跟小组成员一阵忙活,其实开发一款照相机软件并不太难,下面就是 ...

  5. android 使用相机拍照,并存储到手机sd卡上,并利用系统录像录像并播放

    //首先声明一个成员变量 String savePath,用来储存文件路径 /** * 保存照片路径 * @return 返回图片的一个文件 * @throws IOException 抛出一个异常 ...

  6. Android相机、相册获取图片显示并保存到SD卡

    Android相机.相册获取图片显示并保存到SD卡 [复制链接]   电梯直达 楼主    发表于 2013-3-13 19:51:43 | 只看该作者 |只看大图  本帖最后由 happy小妖同学 ...

  7. Android将应用调试log信息保存在SD卡

    转载:http://blog.csdn.net/way_ping_li/article/details/8487866 把自己应用的调试信息写入到SD卡中. package com.sdmc.hote ...

  8. Android 将文件保存到SD卡,从卡中取文件,及删除文件

    //保存到SD卡 private static String sdState = Environment.getExternalStorageState();     private static S ...

  9. [置顶] Android学习系列-把文件保存到SD卡上面(6)

    Android学习系列-把文件保存到SD卡上面(5) 一般多媒体文件,大文件需要保存到SD卡中.关键点如下: 1,SD卡保存目录:mnt/sdcard,一般采用Environment.getExter ...

随机推荐

  1. [HNOI2001]矩阵乘积

    题目描述 输入输出格式 输入格式: 第1行为:x y (第1行为两个正整数:x,y分别表示输出结果所在的行和列) 第2行为:m n o p(第2行给出的正整数表明A为m×n矩阵,B为n×o矩阵,C为o ...

  2. [AHOI2009]中国象棋

    题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是 ...

  3. [Tjoi2013]最长上升子序列

    Description 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字,我们都想知道此时最长上升子序列长度是多少? Input 第一行一 ...

  4. 51nod 1752 哈希统计

    Description Solution 考虑用倍增来处理答案: 设 \(f[i][j]\) 表示长度恰好为 \(2^{i}\) 的哈希值为 \(j\) 的字符串的种数 \(dp[i][j]\) 表示 ...

  5. bzoj 4919: [Lydsy六月月赛]大根堆

    Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切地说,你需要选择尽可能多的节点,满足大根堆的性质: ...

  6. 关于快速沃尔什变换(FWT)的一点学习和思考

    最近在学FWT,抽点时间出来把这个算法总结一下. 快速沃尔什变换(Fast Walsh-Hadamard Transform),简称FWT.是快速完成集合卷积运算的一种算法. 主要功能是求:,其中为集 ...

  7. BZOJ3052(树上带修莫队)

    树上莫队的基本思路是把树按dfs序分块,然后先按x所在块从小到大排序,再按y所在块从小到大排序,处理询问即可. 这道题带修改,再加一个时间维即可. 设块大小为T,那么时间复杂度为$O(nT+\frac ...

  8. NTT+多项式求逆+多项式开方(BZOJ3625)

    定义多项式$h(x)$的每一项系数$h_i$,为i在c[1]~c[n]中的出现次数. 定义多项式$f(x)$的每一项系数$f_i$,为权值为i的方案数. 通过简单的分析我们可以发现:$f(x)=\fr ...

  9. 关于InnoDB的读写锁类型以及加锁方式

    (本文为了方便,英文关键词都都采用小写方式,相关知识点会简单介绍,争取做到可以独立阅读) 文章开始我会先介绍本文需要的知识点如下: innodb的聚簇索引(聚集索引)和非聚簇索引(二级索引.非聚集索引 ...

  10. 360面试-C++后端(实习)

    在线远程视频面试 一面: 自我介绍. 知道哪几种排序算法,各算法的时间复杂度. 解决hash冲突的几种方式. 有哪些方法清除cache中旧的数据.不太清楚,我扯到了操作系统中缺页中断的页面置换原理上, ...