Android 10.0 截屏流程

这篇具有很好参考价值的文章主要介绍了Android 10.0 截屏流程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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类来实现截屏功能。具体实现步骤如下:文章来源地址https://www.toymoban.com/news/detail-484928.html

  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 对截屏图像进行处理
}

到了这里,关于Android 10.0 截屏流程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Android10.0 人脸解锁流程分析

    Android10.0 人脸解锁流程分析

    人脸解锁概述 人脸解锁即用户通过注视设备的正面方便地解锁手机或平板。Android 10 为支持人脸解锁的设备在人脸认证期间添加了一个新的可以安全处理相机帧、保持隐私与安全的人脸认证栈的支持,也为安全合规地启用集成交易的应用(网上银行或其他服务)提供了一种容

    2024年02月03日
    浏览(10)
  • android10.0(Q) MTK 6765 user版本打开root权限

    android10.0(Q) MTK 6765 user版本打开root权限

    前言 相比较 Android8.1、9.0 而言,Android10.0 版本 的 root变得相当麻烦,10.0 中引入了动态分区机制,同样的要想完全 adb root,需要 fastboot 解锁,然后关闭 verity 才能 adb remount 成功。我尝试和之前一样修改 fstab.in.mt6765 中的 ro 和 rw 初始值,容易导致无法正常开机,在这耗费了很

    2024年01月25日
    浏览(10)
  • Android 10.0 系统systemui状态栏下拉左滑显示通知栏右滑显示控制中心模块的流程分析

    Android 10.0 系统systemui状态栏下拉左滑显示通知栏右滑显示控制中心模块的流程分析

      在android10.0的系统rom定制化开发中,在系统原生systemui进行自定义下拉状态栏布局的定制的时候,需要在systemui下拉状态栏下滑的时候,根据下滑坐标来 判断当前是滑出通知栏还是滑出控制中心模块,所以就需要根据屏幕宽度,来区分x坐标值为多少是左滑出通知栏或者右滑

    2023年04月09日
    浏览(20)
  • android10.0(Q)编译安卓内核(pixel 2)

    android10.0(Q)编译安卓内核(pixel 2)

    下载内核源码 1.查看内核版本 首先需要看一下内核的版本,可以在手机中看到内核版本 2.下载该内核版本对应的源码 执行结果如下: 这里的分支\\\"4fecde07e68d\\\"就是上面的手机截图中内核版本里g后面的数字 编译 3.安装libssl(不装编译的时候会报错) 执行结果如下: 4.去掉内核

    2024年02月08日
    浏览(13)
  • Android 10.0 app授予通知权限 默认开启通知

    在app开发中 会需要发送通知,但在8.0以后增加了通知权限,必须先开启通知权限才能发送通知 像这样申请开启通知权限 打开通知开关 app中开启通知权限如下 1.判断是否有通知权限

    2023年04月08日
    浏览(19)
  • Android 10.0 禁用adb shell input输入功能

    Android 10.0 禁用adb shell input输入功能

    在10.0的产品开发中,在进行一些定制开发中,对于一些adb shell功能需要通过属性来控制禁止使用input 等输入功能,比如adb shell input keyevent 响应输入事件等,所以就需要 熟悉adb shell input的输入事件流程,然后来禁用adb shell input的输入事件功能,接下来分析下adb shell input的输入

    2024年02月10日
    浏览(13)
  • Android 10.0 系统开机自启动第三方app

    在10.0的开发中,由于有些第三方app,需要在接收到开机广播后,启动app,但是在10.0以后第三方app就接收不到开机广播了 只有系统app才可以接收到开机广播了,所以在app内通过接收开机广播自启动就没法实现了 这就需要 在系统中接收到开机广播后启动第三方app就可以了 在大部

    2023年04月27日
    浏览(44)
  • Android 10.0 recovery页面旋转180度问题的解决方案

    在10.0的系统rom定制化开发工作中,在系统中recovery的页面也是相关重要的一部分,在系统recovery ota升级等功能,都是需要recovery功能的,在某些产品定制化中 在recovery的时候,发现居然旋转了180度,接下来分析下recovery关于屏幕显示方向的相关源码,来修改这个功能 recovery页面

    2024年02月09日
    浏览(30)
  • Android10.0 app调用hal层接口功能实现系列一

     在10.0的系统rom定制化开发中,对于一些需要在app中调用hal层的一些接口来实现某些功能而言,就需要 打通app到hal的接口,实现功能需求,这一节首先讲在hal层中提供接口然后通过jni来调用 HAL是硬件抽象层,它向下屏蔽了硬件的实现细节,向上提供了抽象接口, HAL是底层硬

    2024年02月16日
    浏览(12)
  • Android10.0 hal层添加自定义hal模块功能实现

    在10.0的系统rom定制化开发中,在 对hal模块进行开发时,需要通过添加自定义的hal模块来实现某些 功能时,就需要添加hal模块的相关功能,接下来就来实现一个案例来供参考 HAL是硬件抽象层,它向下屏蔽了硬件的实现细节,向上提供了抽象接口, HAL是底层硬件和上层框架直

    2024年02月15日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包