Android 10.0 截屏流程

news/2024/11/29 6:53:30/

I. 简介

Android 10.0版本在截屏方面做了一些改进和优化,使得截屏更加方便和高效。在Android 10.0版本中,可以使用多种方式实现截屏,其中包括使用系统快捷键、使用手势操作、调用API等。

Android 10.0版本中,截屏的流程大致如下:

  1. 触发截屏操作:用户可以通过系统快捷键或手势操作来触发截屏操作。

  2. 截屏执行:截屏操作被系统捕获并执行。系统会调用媒体框架服务来截取屏幕内容并生成截屏图像。

  3. 通知用户截屏结果:系统会通过通知栏通知用户截屏已完成,并提供分享、编辑、保存等操作选项。

  4. 存储截屏图像:用户可以选择保存截屏图像到本地存储或云端存储。

为了支持更高质量的截屏操作,Android 10.0版本还对截屏过程中的像素支持做出了改进,支持了更高质量的RGBA_8888像素格式。同时,Android 10.0版本还对现有的截屏API做了优化,通过MediaProjection API和ImageReader类等提供了更灵活、更高效的截屏解决方案。

II. Android 10.0 版本截屏流程详解

截屏触发方式及流程

Android 10.0版本中,截屏的触发方式包括:

  1. 使用系统的截屏快捷键:用户可以通过同时按下“电源键”和“音量下键”来实现截屏操作。

  2. 使用手势操作:用户可以通过在屏幕上进行特定的手势操作来触发截屏操作。

截屏流程大致如下:

  1. 用户发起截屏操作,系统捕获截屏触发事件并进入截屏模式。

  2. 系统从屏幕缓冲区中读取图像数据并转换成Bitmap对象。

  3. 系统将Bitmap对象进行压缩和存储,最终生成截屏图片并保存在指定目录中。

  4. 系统通过通知栏提示用户截屏已完成,提供编辑、分享、保存等操作选项。

像素支持情况

Android 10.0版本新增了RGBA_8888像素格式,支持更高质量的截屏操作。此外,仍然支持RGBA_4444和RGB_565两种像素格式。

其中,RGBA_8888像素格式的优势在于可以支持4字节的透明度信息,可以更好地表达不同颜色及透明度混合的效果,同时对于图像处理和编辑等高精度应用也更为适合。

支持的文件格式及存储方式

Android 10.0版本中,支持以下文件格式及存储方式:

  1. PNG格式:PNG格式的截屏图片具有高质量和无损压缩等特点,适合用于保存对图像质量有严格要求的场景。

  2. JPEG格式:JPEG格式的截屏图片具有良好的压缩性能,适合用于保存对文件大小有要求的场景。

  3. HEIF格式:HEIF格式是Android 10.0新增支持的一种高效的图像格式,能够在减小文件大小的同时保持高质量。

此外,Android 10.0版本的截屏支持将截屏文件保存在本地存储或云端存储中。

其他注意事项

在Android 10.0版本中,对于屏幕旋转时的截屏需要进行特殊处理,避免旋转过程中出现不同步现象。同时,对于悬浮球等特殊场景的截屏,也需要进行特殊处理,确保截屏数据的完整和准确。此外,由于不同厂商的系统可能会存在差异,需要对不同厂商的系统做出相应的适配处理。

III. 如何在应用中调用 Android 10.0 版本截屏功能

使用 MediaProjection API 实现截屏

在Android 10.0版本中,可以通过MediaProjection API来实现在应用中调用Android 10.0截屏功能,具体实现步骤如下:

  1. 首先,需要创建一个MediaProjectionManager实例:
MediaProjectionManager mMediaProjectionManager =(MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
  1. 然后需要请求获取截屏权限,由于获取权限的过程是异步的,需要在onActivityResult()方法中进行处理:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {if (requestCode == REQUEST_CODE) {if (resultCode == RESULT_OK) {mMediaProjection = mMediaProjectionManager.getMediaProjection(resultCode, data);startCapture();}}
}
  1. 在获取了MediaProjection实例后,就可以通过创建VirtualDisplay和ImageReader来实现截屏操作:
private void startCapture() {DisplayMetrics metrics = getResources().getDisplayMetrics();int density = metrics.densityDpi;int width = metrics.widthPixels;int height = metrics.heightPixels;mImageReader = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 1);mVirtualDisplay = mMediaProjection.createVirtualDisplay("ScreenCapture", width, height, density,DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,mImageReader.getSurface(), null, null);
}
  1. 在创建了VirtualDisplay和ImageReader后,就可以开始获取截屏信息并进行处理:
Image image = mImageReader.acquireLatestImage();
if (image != null) {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();//TODO 对截屏图像进行处理
}

使用 ImageReader 类实现截屏

除了使用MediaProjection API外,在Android 10.0版本中还可以使用ImageReader类来实现截屏功能。具体实现步骤如下:

  1. 创建ImageReader实例:
ImageReader mImageReader = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 1);
  1. 获取ImageReader的Surface实例:
Surface mSurface = mImageReader.getSurface();
  1. 通过创建VirtualDisplay将屏幕内容渲染到ImageReader的Surface上:
VirtualDisplay mVirtualDisplay = mMediaProjection.createVirtualDisplay("ScreenCapture", width, height, density,DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,mSurface, null, null);
  1. 在获取了ImageReader实例后,就可以通过获取最新的图像信息来实现截屏操作:
Image image = mImageReader.acquireLatestImage();
if (image != null) {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();//TODO 对截屏图像进行处理
}

http://www.ppmy.cn/news/380576.html

相关文章

【RV1126】按键中断--使用输入子系统事件方式

文章目录 选择GPIO修改设备树修改驱动源码probe:增加外部中断以及定时器服务函数。命令行测试中断确定按键的输入子系统的event使用hexdump命令测试按键实际效果 测试应用程序完整的驱动代码 我使用的是荣品的pro-rv1126。 选择GPIO 结合原理图 决定使用UART1接口 …

算法leetcode|57. 插入区间(rust重拳出击)

文章目录 57. 插入区间:样例 1:样例 2:样例 3:样例 4:样例 5:提示: 分析:题解:rust:go:c:python:java: 57. 插…

Armbian 系统 23.05 发布

导读Armbian 社区今天发布了用于 ARM 和 RISC-V 单板计算机以及其他平台的 Armbian 23.05(代号 Suni)操作系统。 在 Armbian 23.02 发布三个月后,Armbian 23.05 版本首次在完全重构的构建框架上创建,并基于即将发布的 Debian 12“…

etcd基本使用

目录 CRUD1、基本的put/get/del2、获取当前所有的key3、获取/删除带有前缀的键 lease使用1、创建lease,续租lease,撤销lease2、将lease attach到key上 watch使用watch、watch_oncereplacedeletewatch_prefix、watch_prefix_oncecancel_watchadd_watch_ca…

【每日一题Day237】LC1375二进制字符串前缀一致的次数 | 技巧题

二进制字符串前缀一致的次数【LC1375】 给你一个长度为 n 、下标从 1 开始的二进制字符串,所有位最开始都是 0 。我们会按步翻转该二进制字符串的所有位(即,将 0 变为 1)。 给你一个下标从 1 开始的整数数组 flips ,其…

Java的垃圾回收机制详解

目录 1、C语言与Java语言垃圾回收区别 2、System.gc() 3、面试题引入Java垃圾回收 3.1 jvm怎么确定哪些对象应该进行回收 3.1.1 引用计数法 3.1.2 可达性分析算法 3.2 jvm会在什么时候进行垃圾回收的动作 3.2 jvm到底是怎么回收垃圾对象的 4、来回收算法 4.1 标记-清…

Qt6之样式表2

一、样式选择器类型 一般情况下组件最终都会产生父子、子孙等关系,此时样式选择器类型非常重要,它决定着你的类型是否互相直接独立、互相影响和便捷高效的快速设置样式。 1、如下图常见的一个工具栏,切换时鼠标划过是灰色,选中后是…

电动汽车车载充电机 (OBC) 与车载 DC/DC 转换器技术

电动汽车车载充电机 (OBC) 与车载 DC/DC 转换器技术一、高性能电动汽车车载充电机(OBC) 电路二、双向充电机(Bi-OBC )技术方案三、车载DC/DC 转换器电路拓扑比较四、充电桩电力电子变换器 电动汽车车载充电机 (OBC) 与车载 DC/DC 转换器技术:https://pan…