Android截屏的几种实现

微信公众号:CodingAndroid
CSDN:http://blog.csdn.net/xinpengfei521

最近我们的APP要求需要截屏功能,网上看了看大致有一下几种实现的方式,由于我们的机器是特定的设备,(类似于广告机,已经ROOT),所以就采用最简单的方式,只需在代码中执行shell命令即可实现,下面就给大家介绍一下各种截屏的方式。

方式一

    public static Bitmap capture(Activity activity) {
activity.getWindow().getDecorView().setDrawingCacheEnabled(true);
Bitmap bmp = activity.getWindow().getDecorView().getDrawingCache();
return bmp;
}
  • 优点:此种方式比较简单只需传入当前要截取屏幕的Activity对象即可,不需要添加任何权限,后续可将截图的bitmap保存到本地即可;

  • 缺点:无法截取WebView页面,截屏后是白屏!

方式二

使用adb Shell命令截屏

例如:

adb shell screencap -p /sdcard/sreenshot1.png

命令格式:adb shell screencap -p + 文件路径 + 文件名;

  • 优点:只需在代码中执行截屏的命令即可,可根据需求封装一个方法,传入保存的路径和文件名即可;
  • 缺点:手机需要获取ROOT权限,调用命令之前需要先请求su获取ROOT权限;

方式三

从Android 5.0开始 Google开放了截屏的api

截取方式如下:

1.在Activity中开启截屏服务

    if (Build.VERSION.SDK_INT >= 21) {
startActivityForResult(
((MediaProjectionManager) getSystemService("media_projection")).createScreenCaptureIntent(),1);
} else {
Log.e("TAG", "版本过低,无法截屏");
}

2.重写onActivityResult方法

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1 && data != null) {
parseData(data);
}
}
private void parseData(Intent data){
MediaProjection mMediaProjection = (MediaProjectionManager).getSystemService(
Context.MEDIA_PROJECTION_SERVICE).getMediaProjection(Activity.RESULT_OK,data);
ImageReader mImageReader = ImageReader.newInstance(
getScreenWidth(),
getScreenHeight(),
PixelFormat.RGBA_8888,1);
VirtualDisplay mVirtualDisplay = mMediaProjection.createVirtualDisplay("screen-mirror",
getScreenWidth(),
getScreenHeight(),
Resources.getSystem().getDisplayMetrics().densityDpi,
DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
mImageReader.getSurface(), null, null);
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
Image image = mImageReader.acquireLatestImage();
// TODO 将image保存到本地即可
}
}, 300);
mVirtualDisplay.release();
mVirtualDisplay = null;
}

更多参考文章:

http://www.jb51.net/article/119881.htm

https://www.2cto.com/kf/201602/488933.html

http://blog.csdn.net/buptgshengod/article/details/39155979

下面这个库封装了cmd截屏和5.0以上的截屏:

https://github.com/Android-ScreenShot/AndroidScreenShotService

若在使用过程中遇到什么问题,或有好提议,欢迎在公众号“CodingAndroid”中提出

Android截屏的几种实现的更多相关文章

  1. 【转】Android截屏

     http://blog.csdn.net/xww810319/article/details/17607749 Android截屏浅析 链接:http://blog.sina.com.cn/s/bl ...

  2. Android 截屏与 WebView 长图分享经验总结

    最近在做新业务需求的同时,我们在 Android 上遇到了一些之前没有碰到过的问题,截屏分享. WebView 生成长图以及长图在各个分享渠道分享时图片模糊甚至分享失败等问题,在这过程中踩了很多坑,到 ...

  3. Android 截屏的各种骚操作

    本文公众号「AndroidTraveler」首发. 背景 在实际的应用场景中,Android 手机的截屏其实是很普遍的. 比如说 PPT 演示,比如说技术博客图文并茂讲解. 因此懂得 Android ...

  4. android截屏

    截屏是一个常用的操作,经常会有这种需求. 截屏的工具类 package com.fxb.screenshot; import android.app.Activity; import android. ...

  5. Android 截屏检测

    最近项目中新接到一个需求,对手机截屏进行检测并进行后续操作,类似于Snapchat,iOS具有先天优势,因iOS系统提供了相关API!Google无果之后原作者决定再次造轮子,为了持续表达对Rx的敬意 ...

  6. android截屏:保存一个view的内容为图片并存放到SD卡

    项目中偶尔会用到截屏分享,于是就有了下面这个截屏的方法~ 下面得saveImage()方法就是保存当前Activity对应的屏幕所有内容的截屏保存. private void saveImage() ...

  7. Android全屏的两种方法

    在开发中我们经常需要把我们的应用设置为全屏,这里我所知道的有俩中方法,一中是在代码中设置,另一种方法是在配置文件里改! 一.在代码中设置: [java] view plain copy package ...

  8. 快速简化Android截屏工作

    1.安装Notepad++v6.9 2.插件管理器里Plugin Manager安装AndroidLogger 3.AndroidLogger里的capture功能抓取Android的当前屏幕截图到w ...

  9. 在mac上截屏的几种方式

    方法 1: 对屏幕的一部分进行截图 按下Command+Shift+4   方法 2: 对整个屏幕进行截图 按下Command+Shift+3   方法 3: 把截图保存到粘贴板 按下Command+ ...

随机推荐

  1. 模块:time,random,os,sys

    时间模块 import time # print(time.time()) #时间戳 # print(time.strftime('%Y-%m-%d %X')) #格式化字符 # print(time ...

  2. 理解JDK1.5的自动装箱拆箱

    JDK1.5的升级引入了装箱和拆箱概念,简单说就是为了简化书写. JDK1.5之前,创建Integer对象是需要这么写的  Integer i = new Integer("3") ...

  3. js中的undefined 和null

    undefined是基本数据类型 表示未定义 缺少的意思 null是引用数据类型  是对象 表示空对象 undefined是从null派生出来的  所以undefined==null  true Ja ...

  4. 树莓派.安装Samba环境

    适用于树莓派3 树莓派装好系统后, 为了方便传文件到树莓派, 建议使用Samba这类文件夹级别的应用, 比ftp方便多了 如果你想把树莓派变成Nas, Samba也是不可或缺的应用 通过samba服务 ...

  5. LeetCode 35. Search Insert Position (搜索嵌入的位置)

    Given a sorted array and a target value, return the index if the target is found. If not, return the ...

  6. python中openpyxl的用法【安装,以及一些基本的操作】

    概述 Openpyxl是python中简单易用的操作excel电子表格的一个模块.接下来呢,跟博主一起学习一下吧  ----_<_>_---- 首先先清楚一些excel的基本概念: 在op ...

  7. .9-Vue源码之AST(5)

    上节跑完了超长的parse函数: // Line-9261 function baseCompile(template, options) { // Done! var ast = parse(tem ...

  8. Oracle结合Mybatis实现取表中前10条数据

    之前一直使用mysql和informix数据库,查表中前10条数据十分简单: 最原始版本: select top * from student 当然,我们还可以写的复杂一点,比如外加一些查询条件? 比 ...

  9. Python CRM项目二

    一.准备工作 如果没有配置基本的项目,请参考 http://www.cnblogs.com/luhuajun/p/7771196.html 当我们配置完成后首先准备我们的app 创建2个app分别对应 ...

  10. 如何阻止sql注入(pdo篇)

    Use prepared statements and parameterized queries. These are SQL statements that are sent to and par ...