1. 只截取自己应用内部界面

1.1 只截取自己应用内部界面

View dView = getWindow().getDecorView();

dView.setDrawingCacheEnabled(true);

dView.buildDrawingCache();

Bitmap bitmap = Bitmap.createBitmap(dView.getDrawingCache());

if (bitmap != null) {

try {

// 获取内置SD卡路径

String sdCardPath = Environment.getExternalStorageDirectory().getPath();

// 图片文件路径

String filePath = sdCardPath + File.separator + "screenshot.png";

File file = new File(filePath);

FileOutputStream os = new FileOutputStream(file);

bitmap.compress(Bitmap.CompressFormat.PNG, 100, os);

os.flush();

os.close();

DebugLog.d("a7888", "存储完成");

} catch (Exception e) {

}

}

1.2 截取某个控件或者区域

两种方案:

跟上面差不多,只不过view不适用根view,而是使用某个某个控件

View dView = title;

dView.setDrawingCacheEnabled(true);

dView.buildDrawingCache();

Bitmap bitmap = Bitmap.createBitmap(dView.getDrawingCache());

手动draw

View dView = titleTv;

Bitmap bitmap = Bitmap.createBitmap(dView.getWidth(), dView.getHeight(), Bitmap.Config.ARGB_8888);

//使用Canvas,调用自定义view控件的onDraw方法,绘制图片

Canvas canvas = new Canvas(bitmap);

dView.draw(canvas);

2. 截取非含当前应用的屏幕部分(最佳官方方案)

Android 在5.0 之后支持了实时录屏的功能。通过实时录屏我们可以拿到截屏的图像。同时可以通过在Service中处理实现后台的录屏。具体的类讲解大家自行网上查阅。

大体步骤:

1.初始化一个MediaProjectionManager

MediaProjectionManager mMediaProjectionManager = (MediaProjectionManager)getApplication().getSystemService(Context.MEDIA_PROJECTION_SERVICE);

2.创建intent,并启动Intent。注意这里是startActivityForResult

startActivityForResult(mMediaProjectionManager.createScreenCaptureIntent(), REQUEST_MEDIA_PROJECTION);

3.在onActivityResult中拿到Mediaprojection

mResultCode = resultCode;

mResultData = data;

mMediaProjection = mMediaProjectionManager.getMediaProjection(mResultCode, mResultData);

4.设置VirtualDisplay 将图像和展示的View关联起来。一般来说我们会将图像展示到SurfaceView,这里为了为了便于拿到截图,我们使用ImageReader,他内置有SurfaceView。

mImageReader = ImageReader.newInstance(windowWidth, windowHeight, 0x1, 2); //ImageFormat.RGB_565

mVirtualDisplay = mMediaProjection.createVirtualDisplay("screen-mirror",

windowWidth, windowHeight, mScreenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,

mImageReader.getSurface(), null, null);

5.通过ImageReader拿到截图

strDate = dateFormat.format(new java.util.Date());

nameImage = pathImage+strDate+".png";

Image image = mImageReader.acquireLatestImage();

int width = image.getWidth();

int height = image.getHeight();

final Image.Plane[] planes = image.getPlanes();

final ByteBuffer buffer = planes[0].getBuffer();

int pixelStride = planes[0].getPixelStride();

int rowStride = planes[0].getRowStride();

int rowPadding = rowStride - pixelStride * width;

Bitmap bitmap = Bitmap.createBitmap(width+rowPadding/pixelStride, height, Bitmap.Config.ARGB_8888);

bitmap.copyPixelsFromBuffer(buffer);

bitmap = Bitmap.createBitmap(bitmap, 0, 0,width, height);

image.close();

6.注意截屏之后要及时关闭VirtualDisplay ,因为VirtualDisplay 是十分消耗内存和电量的。

if (mVirtualDisplay == null) {

return;

}

mVirtualDisplay.release();

mVirtualDisplay = null;

3. 截取长屏

截取长屏其实原理就是截取整个ScrollView或者ListView的视图,因此实现原理跟上面中提到的截取某个控件的View基本一致。

ScrollView 实现截屏

/**

* 截取scrollview的屏幕

* **/

public static Bitmap getScrollViewBitmap(ScrollView scrollView) {

int h = 0;

Bitmap bitmap;

for (int i = 0; i < scrollView.getChildCount(); i++) {

h += scrollView.getChildAt(i).getHeight();

}

// 创建对应大小的bitmap

bitmap = Bitmap.createBitmap(scrollView.getWidth(), h,

Bitmap.Config.ARGB_8888);

final Canvas canvas = new Canvas(bitmap);

scrollView.draw(canvas);

return bitmap;

}

ListView实现截屏

/**

* 截图listview

* **/

public static Bitmap getListViewBitmap(ListView listView,String picpath) {

int h = 0;

Bitmap bitmap;

// 获取listView实际高度

for (int i = 0; i < listView.getChildCount(); i++) {

h += listView.getChildAt(i).getHeight();

}

Log.d(TAG, "实际高度:" + h);

Log.d(TAG, "list 高度:" + listView.getHeight());

// 创建对应大小的bitmap

bitmap = Bitmap.createBitmap(listView.getWidth(), h,

Bitmap.Config.ARGB_8888);

final Canvas canvas = new Canvas(bitmap);

listView.draw(canvas);

return bitmap;

}

WebView实现截屏

//这是webview的,利用了webview的api

private static Bitmap captureWebView(WebView webView) {

Picture snapShot = webView.capturePicture();

Bitmap bmp = Bitmap.createBitmap(snapShot.getWidth(),

snapShot.getHeight(), Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(bmp);

snapShot.draw(canvas);

return bmp;

}

4. 实时截屏

可参考2中Android 在5.0的做法,进行实时录制。

android 后台 截屏,Android 截屏方式相关推荐

  1. android 后台服务拍照,Android实现后台开启服务默默拍照功能

    本文实例为大家分享了Android后台开启服务默默拍照的具体代码,供大家参考,具体内容如下 最近项目原因,需要编写一后台运行的程序,在给定时间间隔下进行拍照,关键技术主要是:1.开启服务:2.在不不预 ...

  2. android 后台自动拍照,Android实现后台开启服务默默拍照功能

    本文实例为大家分享了Android后台开启服务默默拍照的具体代码,供大家参考,具体内容如下 最近项目原因,需要编写一后台运行的程序,在给定时间间隔下进行拍照,关键技术主要是:1.开启服务:2.在不不预 ...

  3. air android 后台运行,AIR Android:使用模拟器运行程序

    安装和运行程序 生成apk包后,对开发者来说还有一个重要的环节,那就是把程序放在设备上运行起来.这一节我们将分别在模拟器和真机上运行FlipIt游戏,看看效果如何. 使用模拟器运行程序(1) 使用An ...

  4. android后台文件下载库,android中如何下载文件并显示下载进度

    最近开发中遇到需要下载文件的问题,对于一般的下载来说不用考虑断点续传,不用考虑多个线程,比如下载一个apk之类的,这篇文章讨论的就是这种情形. 这里主要讨论三种方式:AsyncTask.Service ...

  5. android 后台执行js,android - 当应用程序在后台运行时,Android WebView消耗大量电能...

    我的Android应用程序中有一个WebView,并且此WebView运行的网站上带有相当多的Javascript.当我的应用程序在后台运行时,用户报告了高功耗,我希望这是由于此javascript. ...

  6. android 后台邮件发送,Android邮件发送

    Android端发送邮件,比较简单,可以用于APP注册时候发送验证码什么的,需要一个用于发送邮件的邮箱,并且要将邮箱的POP3/SMTP服务开启 package tools; import andro ...

  7. android 后台自动拍照,Android实现后台服务拍照功能

    一.背景介绍 最近在项目中遇到一个需求,实现一个后台拍照的功能.一开始在网上寻找解决方案,也尝试了很多种实现方式,都没有满意的方案.不过确定了难点:即拍照要先预览,然后再调用拍照方法.问题也随之而来, ...

  8. android+后台下载notification,Android实现Service下载文件,Notification显示下载进度的示例...

    先放个gif..最终效果如果: 主要演示了Android从服务器下载文件,调用Notification显示下载进度,并且在下载完毕以后点击通知会跳转到安装APK的界面,演示是在真实的网络环境中使用真实 ...

  9. android后台获取view,android – 如何获取当前显示在AdapterView中的项目?

    实现OnScrollListener 06000 并在listView中设置OnScrollListener listView.setOnScrollListener(NewsCategoryDC.t ...

  10. android后台截屏实现(2)--screencap源码修改

    首先找到screencap类在Android源码中的位置,/442/frameworks/base/cmds/screencap/screencap.cpp. 源码如下: [cpp] view pla ...

最新文章

  1. 一文详解科研中的Paper阅读方法!!!
  2. Github拉取远端的时候提示“ssh: connect to host github.com port 22: Connection timed out”错误...
  3. Scapy学习笔记一
  4. mysql自定义多选排序_前端框架(二)DIV多选复选框框的封装和MySql数据库存取...
  5. Spring 嵌套方法AOP不生效问题
  6. nagios 监控配置介绍(二)
  7. 摄像头图像分析目标物体大小位置_一文读懂图像定位及跟踪技术
  8. configure 查找依赖库_由浅入深:Python 中如何实现自动导入缺失的库?
  9. 20行 Python 代码爬取王者荣耀全英雄皮肤 | 原力计划
  10. 程序员:请不要对我的代码指手画脚!
  11. 做测试开发半年涨薪20W入职名企大厂,这位90后凭什么?
  12. bzoj 2916: [Poi1997]Monochromatic Triangles(推理)
  13. 终极算法:机器学习和人工智能如何重塑世界笔记
  14. android创建vcf格式,C#生成vcf 文件源代码 QuotedPrintable 解码支持中文支持Android-vcf文件怎么打开...
  15. SpringBoot+smm+Vue前后端分离项目用户模块基本功能设计
  16. win102004优化_如何对Win10 2004进行优化设置?Win10优化技巧
  17. 用C#编写HMI界面,用USB转485和PLC通讯,PLC用的是台达的DVP-12SE系列
  18. Hadoop之MRjob入门
  19. 创新趋势 | SaaS增长新趋势:产品驱动增长PLG(上)
  20. php微信摇一摇,怎样使用JS+H5实现微信摇一摇

热门文章

  1. matlab 平滑曲线连接_如何使用Affinity Designer for mac编辑矢量曲线和形状
  2. html如何用表格做二级菜单栏,Excel表格制作二级下拉菜单步骤
  3. 支持bt,种子,torrent的离线下载网页版工具!
  4. matlab三维绘图函数plot3【matlab图行绘制四】
  5. 高一信息技术认识计算机网络课件,中图版高中信息技术认识计算机网络课件.pptx...
  6. 基于open scene graph的虚拟校园系统的设计与实现
  7. 架构师害怕程序员知道的十项技能
  8. 【UML 建模】在线UML建模工具 ProcessOn 使用详解
  9. 服务器lsass系统错误,lsass.exe-系统错误,终结点格式无效 windows2003服务器出错
  10. 批量查询数据的sql语句