android定时截取屏幕内容,Android 截取手机屏幕两种实现方案解析
近期在开发的过程中,遇到了一个须要截取屏幕保存为图片的需求,详细为截取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 截取手机屏幕两种实现方案解析相关推荐
- android屏幕坏了,手机屏幕坏了怎么办 手机屏幕坏了怎么换
手机屏幕坏了怎么办 手机屏幕坏了怎么换 来源:www.18183.com作者:皮卡时间:2015-10-22 手机摔坏了,或者触摸部分不正常,比如手机后台关闭不了,红色部分按不了,拨号也不正常. 手机 ...
- WPS表格Excel:截取中间内容、截取两符号之间内容
WPS表格Excel:截取中间内容.截取两符号之间内容 原始数据和目标 观察得知:我们需要截取冒号和右中括号之间的内容 方法一:WPS智能填充(一次性方式) 先给wps举个例子 选中需要填充的区域Ct ...
- Android Studio无线Wifi调试手机的两种方案
Android Studio无线Wifi调试手机的两种方案 第一种方式 使用adbWireless连接 第二种方式 使用插件Android Wifi ADB连接 总结 第一种方式 使用adbWirel ...
- 阿里软件测试二面:adb 连接 Android 手机的两种方式,看完你就懂了
前言 随着现在移动端技术的突飞猛进,导致现在市场上,APP 应用数不胜数,那对于测试工程师而言,对于 APP 的测试,那基本就是一个必修课了. 今天,我就来给大家介绍一下,adb 连接 Android ...
- android 热更新 方案,热更新-热更新app开发的两种系统方案!
针对app开发工作人员来讲,除开要会编码,热更新也是一定要学好和把握的方法,从技术性视角而言,热更新对Android和iOS各自有不一样的系统软件方案,为了更好地让大伙儿掌握这二种系统方案的差别,今日 ...
- C++ 区分中文,非中文,截取含有中文的string字符串的两种方法
C++ 区分中文,非中文,截取含有中文的string字符串的两种方法 方法一 根据中文在ASCII中的范围判断 方法二 把string转成wstring 转自: http://blog.51cto.c ...
- 苹果手机投影_投影仪连手机的两种方式介绍
投影仪连手机的两种方式介绍 投影仪连手机跟电脑连接投影仪一样,有线和无线连接两种方式. 投影仪连手机有线连接: 如果智能手机如果支持MHL连接,那直接购买一条MHL线,一头接在手机上,另一头接在投影仪 ...
- android广播内容显示在屏幕上,如何将手机屏幕投影到计算机显示器上?
该屏幕广播应用程序摆脱了电缆的束缚,可以将手机的内容投影到电视中的空白空间,以便您可以在电视侧更好地欣赏自己喜欢的视频和图片. 一方面,它用于工作,另一方面,用于家庭生活和娱乐. 实际上,有时无法很好 ...
- android 常用机型尺寸_Android中获取手机屏幕大小的方法
本文为大家解析Android中如何获取手机屏幕大小,提供一个解决方法,分享给大家供大家参考,具体内容如下 运行效果图: 运行程序后,当我们点击Button按钮时,可以看到下面的效果图: 具体代码: 我 ...
- android webview加载html图片自适应手机屏幕大小点击查看大图
我们在开发中,显示信息详情时,一般后台会给出html文本,在android端一般采用webview控件来展示,但是后台给出的html文本一般是给电脑端用的,没有自适配手机,导致手机端图片显示过大,需要 ...
最新文章
- 论文中键入行内公式导致行间距变大的解决方案
- [转]中国CIO的空前机会和空前责任
- linux扩充消息队列,Linux关于消息队列的使用分享
- java 贝塞尔_java贝塞尔曲线翻页效果
- 在Spring Boot使用H2内存数据库
- 使用brew,cask和jenv在MacOSX上设置多个Java JRE / JDK
- Network Request Failed
- VMware Player 12.5.0 中文免费版
- From the data point of view
- centos 访问网页重启php_php项目上线基于docker运行php+源码编译实现Nginx+阿里云RDS连接实现...
- pthread_cond_timedwait方法Linux时间编程
- ApplicationContext.xml配置文件
- oracle数据库connectionstring,oracle数据库 connectionstring
- Unity 基础 之 Camera摄像机属性介绍
- CAT1 4G+以太网开发板腾讯云手机微信小程序显示温度和下发控制
- 分享到QQ空间——网站嵌入分享代码
- 第四章—密钥管理与分配
- WannaCrypt(永恒之蓝) down.bddp.net
- 观音灵签 第六十四签下签卯宫 古人马前覆水
- 交通安全精华主题汇总(至2023年01月29日)