近期在开发的过程中,遇到了一个须要截取屏幕保存为图片的需求,详细为截取webview的视图保存图片。

方法1:首先想到的思路是利用SDK提供的View.getDrawingCache()方法:

public void printScreen(View view) {

String imgPath = "/sdcard/test.png";

view.setDrawingCacheEnabled(true);

view.buildDrawingCache();

Bitmap bitmap = view.getDrawingCache();

if (bitmap != null) {

try {

FileOutputStream out = new FileOutputStream(imgPath);

bitmap.compress(Bitmap.CompressFormat.PNG, 100,

out);

} catch (Exception e) {

e.printStackTrace();

}

}

}

这种方法在非常多情况下都是没有问题的。比方说截取imageview,TextView,甚至otherview.getRootView();都没问题。但在WebView上就会出现webview的部分截取完缺少页面里的一些内容的情况。比方说用webview打开这个(https://miqt.github.io/jellyfish/)界面。截取的图片就会有问题。详细表现为网页中游动的水母没有显示在截取的图片上。

方法2:使用Android系统提供的服务Context.MEDIA_PROJECTION_SERVICE。进行截图操作。

关键部分代码解析:↓

发送截图请求

final MediaProjectionManager projectionManager = (MediaProjectionManager)

getSystemService(Context.MEDIA_PROJECTION_SERVICE);

Intent intent = projectionManager.createScreenCaptureIntent();

startActivityForResult(intent, REQUEST_CODE);

接收返回的结果:

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

handleScreenShotIntent(resultCode, data);

}

private void handleScreenShotIntent(int resultCode, Intent data) {

onScreenshotTaskBegan();

final MediaProjectionManager projectionManager = (MediaProjectionManager)

getSystemService(Context.MEDIA_PROJECTION_SERVICE);

final MediaProjection mProjection = projectionManager.getMediaProjection(resultCode, data);

Point size = Utils.getScreenSize(this);

final int mWidth = size.x;

final int mHeight = size.y;

final ImageReader mImageReader = ImageReader.newInstance(mWidth, mHeight, PixelFormat

.RGBA_8888, 2);

final VirtualDisplay display = mProjection.createVirtualDisplay("screen-mirror", mWidth,

mHeight, DisplayMetrics.DENSITY_MEDIUM,

DisplayManager.VIRTUAL_DISPLAY_FLAG_PRESENTATION, mImageReader.getSurface(),

null, null);

mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {

@Override

public void onImageAvailable(ImageReader mImageReader) {

Image image = null;

try {

image = mImageReader.acquireLatestImage();

if (image != null) {

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

if (planes.length > 0) {

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

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

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

int rowPadding = rowStride - pixelStride * mWidth;

// create bitmap

Bitmap bmp = Bitmap.createBitmap(mWidth + rowPadding / pixelStride,

mHeight, Bitmap.Config.ARGB_8888);

bmp.copyPixelsFromBuffer(buffer);

Bitmap croppedBitmap = Bitmap.createBitmap(bmp, 0, 0, mWidth, mHeight);

saveBitmap(croppedBitmap);//保存图片

if (croppedBitmap != null) {

croppedBitmap.recycle();

}

if (bmp != null) {

bmp.recycle();

}

}

}

} catch (Exception e) {

e.printStackTrace();

} finally {

if (image != null) {

image.close();

}

if (mImageReader != null) {

mImageReader.close();

}

if (display != null) {

display.release();

}

mImageReader.setOnImageAvailableListener(null, null);

mProjection.stop();

onScreenshotTaskOver();

}

}

}, getBackgroundHandler());

}

这种方法相似使用手机的系统截屏(音量下键+电源键)。可以完美的吧当前原模原样的屏幕截取下来,而且改动保存方法的话甚至可以屏幕录像,但相比于第一种方法。它的缺点是全然和界面上的view没有关系,而且在调用这个服务的时候,会弹出一个权限确认的弹框。另外须要注意。这一方法仅仅能在Android 5.0的系统设备上适用。

总结:

总而言之。这两种方法各有利弊,使用的时候要依据自己的实际需求做出选择。

android定时截取屏幕内容,Android 截取手机屏幕两种实现方案解析相关推荐

  1. android屏幕坏了,手机屏幕坏了怎么办 手机屏幕坏了怎么换

    手机屏幕坏了怎么办 手机屏幕坏了怎么换 来源:www.18183.com作者:皮卡时间:2015-10-22 手机摔坏了,或者触摸部分不正常,比如手机后台关闭不了,红色部分按不了,拨号也不正常. 手机 ...

  2. WPS表格Excel:截取中间内容、截取两符号之间内容

    WPS表格Excel:截取中间内容.截取两符号之间内容 原始数据和目标 观察得知:我们需要截取冒号和右中括号之间的内容 方法一:WPS智能填充(一次性方式) 先给wps举个例子 选中需要填充的区域Ct ...

  3. Android Studio无线Wifi调试手机的两种方案

    Android Studio无线Wifi调试手机的两种方案 第一种方式 使用adbWireless连接 第二种方式 使用插件Android Wifi ADB连接 总结 第一种方式 使用adbWirel ...

  4. 阿里软件测试二面:adb 连接 Android 手机的两种方式,看完你就懂了

    前言 随着现在移动端技术的突飞猛进,导致现在市场上,APP 应用数不胜数,那对于测试工程师而言,对于 APP 的测试,那基本就是一个必修课了. 今天,我就来给大家介绍一下,adb 连接 Android ...

  5. android 热更新 方案,热更新-热更新app开发的两种系统方案!

    针对app开发工作人员来讲,除开要会编码,热更新也是一定要学好和把握的方法,从技术性视角而言,热更新对Android和iOS各自有不一样的系统软件方案,为了更好地让大伙儿掌握这二种系统方案的差别,今日 ...

  6. C++ 区分中文,非中文,截取含有中文的string字符串的两种方法

    C++ 区分中文,非中文,截取含有中文的string字符串的两种方法 方法一 根据中文在ASCII中的范围判断 方法二 把string转成wstring 转自: http://blog.51cto.c ...

  7. 苹果手机投影_投影仪连手机的两种方式介绍

    投影仪连手机的两种方式介绍 投影仪连手机跟电脑连接投影仪一样,有线和无线连接两种方式. 投影仪连手机有线连接: 如果智能手机如果支持MHL连接,那直接购买一条MHL线,一头接在手机上,另一头接在投影仪 ...

  8. android广播内容显示在屏幕上,如何将手机屏幕投影到计算机显示器上?

    该屏幕广播应用程序摆脱了电缆的束缚,可以将手机的内容投影到电视中的空白空间,以便您可以在电视侧更好地欣赏自己喜欢的视频和图片. 一方面,它用于工作,另一方面,用于家庭生活和娱乐. 实际上,有时无法很好 ...

  9. android 常用机型尺寸_Android中获取手机屏幕大小的方法

    本文为大家解析Android中如何获取手机屏幕大小,提供一个解决方法,分享给大家供大家参考,具体内容如下 运行效果图: 运行程序后,当我们点击Button按钮时,可以看到下面的效果图: 具体代码: 我 ...

  10. android webview加载html图片自适应手机屏幕大小点击查看大图

    我们在开发中,显示信息详情时,一般后台会给出html文本,在android端一般采用webview控件来展示,但是后台给出的html文本一般是给电脑端用的,没有自适配手机,导致手机端图片显示过大,需要 ...

最新文章

  1. 论文中键入行内公式导致行间距变大的解决方案
  2. [转]中国CIO的空前机会和空前责任
  3. linux扩充消息队列,Linux关于消息队列的使用分享
  4. java 贝塞尔_java贝塞尔曲线翻页效果
  5. 在Spring Boot使用H2内存数据库
  6. 使用brew,cask和jenv在MacOSX上设置多个Java JRE / JDK
  7. Network Request Failed
  8. VMware Player 12.5.0 中文免费版
  9. From the data point of view
  10. centos 访问网页重启php_php项目上线基于docker运行php+源码编译实现Nginx+阿里云RDS连接实现...
  11. pthread_cond_timedwait方法Linux时间编程
  12. ApplicationContext.xml配置文件
  13. oracle数据库connectionstring,oracle数据库 connectionstring
  14. Unity 基础 之 Camera摄像机属性介绍
  15. CAT1 4G+以太网开发板腾讯云手机微信小程序显示温度和下发控制
  16. 分享到QQ空间——网站嵌入分享代码
  17. 第四章—密钥管理与分配
  18. WannaCrypt(永恒之蓝) down.bddp.net
  19. 观音灵签 第六十四签下签卯宫 古人马前覆水
  20. 交通安全精华主题汇总(至2023年01月29日)

热门文章

  1. 数据库连接客户端 dbeaver 程序包以及使用说明
  2. spring-第八篇之容器中的bean的生命周期
  3. scrapy vs requests+beautifulsoup
  4. 非常吃惊,程序猿在工作中的幸福感居然是?????
  5. 2017年2月14日
  6. 2016年第3本:启示录----打造用户喜爱的产品
  7. VS2010中配置OpenGL的一些问题小结
  8. IE 6里面当高度(height)小于9px时,高度会仍然是9px[解决办法]
  9. Word新建自己的样式
  10. 七月算法机器学习4 凸优化初步