iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android 截屏实现的几种方式
  • 622
分享到

Android 截屏实现的几种方式

androidwebviewjava 2023-08-31 22:08:39 622人浏览 八月长安
摘要

Android 截屏分为四种:View 截屏、WEBView 截屏、系统截屏 和 adb 截屏 image.png image.png 1、View 截屏 View 截图是将当前 View 界面截取下来,而对于屏幕上其他信息比如:状态栏

Android 截屏分为四种:View 截屏、WEBView 截屏、系统截屏 和 adb 截屏

image.png

image.png

1、View 截屏

View 截图是将当前 View 界面截取下来,而对于屏幕上其他信息比如:状态栏或其他应用的界面将无法截取。

1.1 截取除了导航栏之外的屏幕

    // 开始截屏    private static byte[] screenshotView() {        // ⬇⬇⬇ 可直接放入点击事件中 ⬇⬇⬇        View view = getWindow().getDecorView(); // view可以替换成你需要截图的控件,如父控件 RelativeLayout,LinearLayout        // view.setDrawingCacheEnabled(true); // 设置缓存,可用于实时截图        Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);        Canvas canvas = new Canvas(bitmap);        view.draw(canvas);        // view.setDrawingCacheEnabled(false); // 清空缓存,可用于实时截图        String bitmapString = getBitmapString(bitmap); // 位图转 Base64 String        // byte[] drawByte = getBitmapByte(bitmap); // 位图转为 Byted        Log.d("111111 合并>>", "bitmapString ====:" + bitmapString);        matting_img02.setImageBitmap(bitmap); // ImageView控件直接图片展示截好的图片        // ⬆⬆⬆ 可直接放入点击事件中 ⬆⬆⬆        return drawByte;    }    // 位图转 Base64 String    private static String getBitmapString(Bitmap bitmap) {        String result = null;        ByteArrayOutputStream out = null;        try {            if (bitmap != null) {                out = new ByteArrayOutputStream();                bitmap.compress(Bitmap.CompressFORMat.PNG, 100, out);                out.flush();                out.close();                byte[] bitmapBytes = out.toByteArray();                result = Base64.encodeToString(bitmapBytes, Base64.DEFAULT); // Base64.DEFAULT会自动换行,传给前端会报错,所以要用Base64.NO_WRAP            }        } catch (ioException e) {            e.printStackTrace();        } finally {            try {                if (out != null) {                    out.flush();                    out.close();                }            } catch (IOException e) {                e.printStackTrace();            }        }        return result;    }    // 位图转 Byte    private static byte[] getBitmapByte(Bitmap bitmap) {        ByteArrayOutputStream out = new ByteArrayOutputStream();        // 参数1转换类型,参数2压缩质量,参数3字节流资源        bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);        try {            out.flush();            out.close();        } catch (IOException e) {            e.printStackTrace();        }        return out.toByteArray();    }


1.2 截取某个控件或者区域

// 方法1private static byte[] screenshotView1() {  View view = title;  view.setDrawinGCacheEnabled(true);  view.buildDrawingCache();  Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache());  byte[] drawByte = getBitmapByte(bitmap);  return drawByte;}// 方法2private static byte[] screenshotView2() {  View view = title;  Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);  // 使用 canvas,调用自定义 view 控件的 onDraw 方法,绘制图片  Canvas canvas = new Canvas(bitmap);  dView.draw(canvas);  byte[] drawByte = getBitmapByte(bitmap);  return drawByte;}

2、WebView 截屏

WebView 截屏有四种方式

1 使用 capturePicture() 方法(已废弃)
private static byte[] screenshotWebView() {
Picture picture = webview.capturePicture();
//创建位图
Bitmap bitmap = Bitmap.createBitmap(picture.getWidth(), picture.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
// 绘制(会调用 native 方法,完成图形绘制)
picture.draw(canvas);
byte[] drawByte = getBitmapByte(bitmap);
return drawByte;
}

2.2 使用 getScale() 方法(已废弃)

private static byte[] screenshotWebView() {
float scale = webView.getScale();
int webViewHeight = (int) (webView.getContentHeight()*scale+0.5);
Bitmap bitmap = Bitmap.createBitmap(webView.getWidth(),webViewHeight, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
webView.draw(canvas);
byte[] drawByte = getBitmapByte(bitmap);
return drawByte;
}

2.3 使用 getDrawingCache() 方法

private static byte[] screenshotWebView() {
Bitmap bitmap = webView.getDrawingCache();
byte[] drawByte = getBitmapByte(bmp);
return drawByte;
}

2.4 使用 draw() 方法

private static byte[] screenshotWebView() {
// webView.setDrawingCacheEnabled(true); // 设置缓存
Bitmap bitmap = Bitmap.createBitmap(webView.getWidth(), webView.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
webView.draw(canvas);
webView.destroyDrawingCache();
byte[] drawByte = getBitmapByte(bitmap);
// webView.setDrawingCacheEnabled(false); // 清空缓存
return drawByte;
}

2.5 截长图配置

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
WebView.enableSlowWholeDocumentDraw();
}
setContentView(R.layout.activity_webview);

WebView 截图可能截取不到 cavans 元素,原因是开启了硬件加速,可在 AndroidManifest.xml 中设置属性 android:hardwareAccelerated="false"

关闭硬件加速可能导致页面出现意外情况

3、系统截屏

3.1 MediaProjection

public static final int REQUEST_MEDIA_PROJECTION = 10001;
// 申请截屏权限
private void getScreenShotPower() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
MediaProjectionManager mProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
if (mProjectionManager != null) {
startActivityForResult(mProjectionManager.createScreenCaptureIntent(), REQUEST_MEDIA_PROJECTION);
}
}
}

private MediaProjection mMediaProjection;
// 回调
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_MEDIA_PROJECTION && data != null) {
if (resultCode == RESULT_OK) {
MediaProjection mediaProjection = mMediaProjectionManager.getMediaProjection(resultCode, data);
if (mediaProjection == null) {
Toast.makeText(this,"程序发生错误:MediaProjection@1",Toast.LENGTH_SHORT).show();
return;
}
// mediaProjection 就是当前屏幕流
} else if (resultCode == RESULT_CANCELED) {
Log.d(TAG, "用户取消");
}
}
}

3.2 Surface(需要 root 权限)

使用前需要:

在 AndroidMenifest.xml 中添加 android:sharedUserId="android.uid.system" 属性
需要给程序添加系统签名
或者 root 系统
使用 Java 反射机制,调用系统 api 截图:

private void screenshotSystem() {
Class surfaceClass;
Method method = null;
Bitmap bitmap = null;
try {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
surfaceClass = Class.forName("android.view.SurfaceControl");
} else {
surfaceClass = Class.forName("android.view.Surface");
}
method = surfaceClass.getDeclaredMethod("screenshot", Integer.TYPE, Integer.TYPE);
method.setAccessible(true);
bitmap = (Bitmap)method.invoke((Object)null, webview.getWidth(), webview.getHeight());
byte[] drawByte = getBitmapByte(bitmap);
} catch (ClassNotFoundException e){
e.printStackTrace();
} catch (NoSuchMethodException e){
e.printStackTrace();
} catch (IllegalAccessException e){
e.printStackTrace();
} catch (InvocationTargetException e){
e.printStackTrace();
}
}

3.3 PixelCopy

private void screenshotSystem() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
PixelCopy.request(getWindow(), bitmap, new PixelCopy.OnPixelCopyFinishedListener() {
@Override
public void onPixelCopyFinished(int copyResult){
if (PixelCopy.SUCCESS == copyResult) {
byte[] drawByte = getBitmapByte(bitmap);
} else {
// onErrorCallback()
}
}
}, new Handler());
}
}

3.4 framebuffer(需要 root 权限)

String DEVICE_NAME = "/dev/graphics/fb0";
File deviceFile = new File(DEVICE_NAME);
Process localProcess = Runtime.getRuntime().exec("supersu");
String str = "cat " + deviceFile.getAbsolutePath() + "\n";
localProcess.getOutputStream().write(str.getBytes());
return localProcess.getInputStream();

3.5 screencap 命令(需要 root 权限)

private static String getScreenshot(){
Process process = null;
String filePath = "mnt/sdcard/" + System.currentTimeMillis() + ".png";
try {
process = Runtime.getRuntime().exec("su");
PrintStream outputStream = null;
outputStream = new PrintStream(new BufferedOutputStream(process.getOutputStream(), 8192));
outputStream.println("screencap -p " + filePath);
outputStream.flush();
outputStream.close();
process.waitFor();
} catch (Exception e) {
e.printStackTrace();
} finally {
if(process != null){
process.destroy();
}
}
return filePath;
}

4、adb 截屏

$ adb shellshell@ $ screencap /sdcard/screen.pngshell@ $ exit$ adb pull /sdcard/screen.png

来源地址:https://blog.csdn.net/jun_tong/article/details/129811578

--结束END--

本文标题: Android 截屏实现的几种方式

本文链接: https://www.lsjlt.com/news/387174.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android 截屏实现的几种方式
    Android 截屏分为四种:View 截屏、WebView 截屏、系统截屏 和 adb 截屏 image.png image.png 1、View 截屏 View 截图是将当前 View 界面截取下来,而对于屏幕上其他信息比如:状态栏...
    99+
    2023-08-31
    android webview java
  • Android截屏截图的几种方法总结
     Android截屏  Android截屏的原理:获取具体需要截屏的区域的Bitmap,然后绘制在画布上,保存为图片后进行分享或者其它用途一、Activity截屏截Activity界面(包含空白的状态栏) public static B...
    99+
    2023-05-31
    android 截屏 截图
  • Android 截屏代码几种方法
    在Android中,可以使用以下几种方法来实现截屏: 使用MediaProjection API(需要API级别21及以上): private void takeScreenshot() { if (Build.VERSION.SDK...
    99+
    2023-10-26
    android
  • android中Webview实现截屏三种方式小结
    本人最近学习了android中Webview实现截屏三种方式,下面我来记录一下,有需要了解的朋友可参考。希望此文章对各位有所帮助。 第一种方式 通过调用webview.capt...
    99+
    2022-06-06
    小结 webview Android
  • Android实现截屏方式整理(总结)
    本文介绍了Android 实现截屏方式整理,分享给大家。希望对大家有帮助可能的需求: 截自己的屏 截所有的屏 带导航栏截屏 不带导航栏截屏 截屏并编辑选取一部分 自动截取某个空间或者布局 截取长图 在后台去截...
    99+
    2023-05-30
    android 截屏 roi
  • android截屏功能实现方式汇总【包括后台截屏】
    前言 对于android实现截屏功能,简单讲述一下可行的方法和之间的利弊 使用canvas View v = getWindow().getDecorView();Bitmap bitmap = Bitmap.createBitmap(...
    99+
    2023-08-16
    android android studio ide
  • Android实现View滑动的几种方式
    什么是View?实现View滑动的方式有哪些? 1. 关于View我们需要知道的 (1)什么是View?     Android中的View类是...
    99+
    2022-06-06
    view Android
  • Android 实现GIF播放的几种方式
    1. Glide播放 Glide是Android上比较常见的图片加载框架,其介绍可以看Android Glide简单使用。 布局文件,GIF文件可以在ImageView里面显示 调用load()方法,导入图片并用ImageView...
    99+
    2023-08-18
    android Gif
  • Android 实现全屏显示的几种方法整理
    Android 实现全屏显示的几种方法整理 A、设置主题实现全屏 直接在AndroidManifest.xml文件中设定Activity主题为全屏模式 android:the...
    99+
    2022-06-06
    方法 Android
  • 解析Android截取手机屏幕两种实现方案
    最近在开发的过程中,遇到了一个需要截取屏幕保存为图片的需求,具体为截取webview的视图保存图片。 方法1:首先想到的思路是利用SDK提供的View.getDrawingCa...
    99+
    2022-06-06
    手机屏幕 手机 Android
  • Android实现几种推送方式解决方案
    本文介绍在Android中实现推送方式的基础知识及相关解决方案。推送功能在手机开发中应用的场景是越来起来了,不说别的,就我们手机上的新闻客户端就时不j时的推送过来新的消息,很方...
    99+
    2022-06-06
    解决方案 Android
  • android几种不同对话框的实现方式
    app中肯定是少不了与用户交互的各种dialog,下面给大家介绍几种提示框的提示。 一般创建一个对话框需要经过以下几步:   1、创建AlertDialog.Builder对象...
    99+
    2022-06-06
    Android
  • Android富文本实现的几种方式汇总
    目录Android富文本的实现的几种方式一,Html的方式实现1.1 占位符的处理1.2 Html的占位符1.3 自定义Html标签二,Span的几种实现方式2.1 java - S...
    99+
    2022-11-13
  • android截屏的实现方法有哪些
    Android截屏的实现方法有以下几种:1. 使用系统提供的截屏快捷键:在大部分Android设备上,同时按下电源键和音量减小键可以...
    99+
    2023-08-24
    android
  • python 三种方式实现截屏(详解+完整代码)
    一、方法一 # PIL中的ImageGrab模块# 使用PIL中的ImageGrab模块简单,但是效率有点低# PIL是Python Imaging Library,它为python解释器提供图像编辑函数能力。 ImageGrab模块可用于...
    99+
    2023-09-08
    python
  • Android系统签名实现的方式有哪几种
    Android系统签名实现的方式有以下几种: 使用自签名证书:开发者可以使用自己生成的私钥和证书进行签名,这种方式比较简单,但可...
    99+
    2023-10-26
    Android
  • Android中实现多线程操作的几种方式
    目录前言 最基础的方式 继承Thread类并实现run()方法 匿名内部类实现Runnable接口callable+FutureTask 线程池 手动创建线程池 使用Executor...
    99+
    2022-11-12
  • Android实现消息总线的几种方式详解
    目录前言一、BroadcastReceiver 广播二、EventBus三、RxBus四、LiveDataBus五、FlowBus总结前言 消息总线又叫事件总线,为什么我们需要一个消...
    99+
    2022-11-13
  • Struts2实现Action的几种方式
    Struts2实现Action的几种方式有以下几种:1. 实现Action接口:创建一个类并实现com.opensymphony.x...
    99+
    2023-08-17
    Struts2
  • Struts2 实现Action的几种方式
    Struts2 实现 Action 的几种方式有以下几种:1. 实现 Action 接口:可以实现 Struts2 提供的 Action 接口,该接口定义了执行 Action 的方法 execute(),通过该方法可以处理请求并返回结果...
    99+
    2023-08-11
    Struts2
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作