安卓开发定时截屏

此处有两种方式:(都是定时截屏,不需要定时功能可以剔除service)

   1.app内截屏  https://download.csdn.net/download/hdhhd/89517797   

    2.截取当前任意手机显示屏幕   https://download.csdn.net/download/hdhhd/89517800

第一种方式:

            通过view.getDrawingCache()获取当前界面截屏并转成Bitmap,直接看代码:

   实现片段:     

public class Screenshot_View {

    /**
     * v.getDrawingCache()根据传入的View截取整个页面
     *
     * @param v
     * @return
     */
    public static Bitmap takeScreenShotOfView(View v) {
        v.setDrawingCacheEnabled(true);  //启用缓存
        v.buildDrawingCache(true);
        Bitmap bitmap = Bitmap.createBitmap(v.getDrawingCache());
        v.destroyDrawingCache();         // 销毁缓存
        v.setDrawingCacheEnabled(false); // 清除绘图缓存
        return bitmap;
    }
}

弊端:只能在APP内截取。

第二种方式:

        使用MediaProjectionManager抓取屏幕(截图):

实例化MediaProjectionManager,然后拿mediaProjectionManager.createScreenCaptureIntent()    创建屏幕捕获意图

    private void getMediaProjectionManager() {
        if (mediaProjectionManager == null) {
            mediaProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
            Intent intent = new Intent(mediaProjectionManager.createScreenCaptureIntent());// 创建屏幕捕获意图
            startActivityForResult(intent, REQUEST_CODE);
        }
    }

执行回调:


    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {   
        super.onActivityResult(requestCode, resultCode, data);
        if (REQUEST_CODE == requestCode && resultCode == RESULT_OK) {

            if (service == null) {
                service = new MyService();
                Intent intent = new Intent(this, service.getClass());
                intent.putExtra("windowManager_whd", windowManager_whd);
                intent.putExtra("resultCode", resultCode);
                intent.putExtra("data", data);
                startService(intent);
                mediaProjectionManager = null;
            }
        } else {
            showToastWarning("获取屏幕截图失败");
        }
    }
将回调中的状态 resultCode,data以及屏幕宽、高、密度传递给service进行持久化定时截取

需要注意的是Intent intent = new Intent(mediaProjectionManager.createScreenCaptureIntent());只需要执行一次拿到状态即可,否则每次执行都会让APP后台变前台(自动打开影藏在后台的APP)


    /**
     * 执行抓屏、并保存本地
     */
    @SuppressLint("WrongConstant")
    private synchronized void captureScreen() {
        try {
            if (resultCode == 0 || data == null || windowManager_whd == null) {
                Log.e(TAG, "缺少屏幕捕获所需的参数.");
                return;
            }

            if (mediaProjectionManager == null || mImageReader == null) {
                Log.e(TAG, "1233123123123.");
                mediaProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
                projection = mediaProjectionManager.getMediaProjection(resultCode, data);
                //创建用于接收投影的容器
                mImageReader = ImageReader.newInstance(mWidth, mHeight, PixelFormat.RGBA_8888, 2);
                //通过MediaProjection创建创建虚拟显示器对象,创建后物理屏幕画面会不断地投影到虚拟显示器VirtualDisplay上,输出到虚拟现实器创建时设定的输出Surface上。
                VirtualDisplay virtualDisplay = projection.createVirtualDisplay("projection", mWidth, mHeight, mDpi, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mImageReader.getSurface(), null, null);
            }

            Image image = null;
            while (image == null) {
                image = mImageReader.acquireLatestImage();
            }

            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;
                Bitmap bitmap = Bitmap.createBitmap(mWidth + rowPadding / pixelStride, mHeight, Bitmap.Config.ARGB_8888);
                bitmap.copyPixelsFromBuffer(buffer);
                image_Base64(bitmap);
                saveBitmapToFile(bitmap);
                image.close();
            } else {
                projection = null;
            }

        } catch (Exception e) {
            Log.i(TAG, e.getMessage());
        } finally {
//            mImageReader.close();
        }
    }

优点:可以截取当前打开的任意屏幕

效果图:


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/775741.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

hitcontraining_uaf

BUUCTF[PWN][堆] 题目:BUUCTF在线评测 (buuoj.cn) 程序del是没有将申请的指针清零,导致可以再次调用输出print。 查看add_note函数:根据当前 notelist 是否为空,来申请了一个8字节的空间将地址(指针)放在notelist[i]中&#xff…

海尔智家:科技优秀是一种习惯

海尔智家:科技优秀是一种习惯 2024-06-28 15:19代锡海 6月24日,2023年度国家科学技术奖正式揭晓。海尔智家“温湿氧磁多维精准控制家用保鲜电器技术创新与产业化”项目荣获国家科学技术进步奖,成为家电行业唯一牵头获奖企业。 很多人说&…

RK3568平台(USB篇)TYPE-C接口与PD协议

一.TYPE-C接口简介 type-c 插座: type-c 插头: type-c 线缆: type-c 接口定义之插座: type-c 硬件原理图: VBUS:供电引脚,用于传输电源电压,一般为5V或12V。 GND:地引…

使用ChatGPT写论文,只需四步突破论文写作瓶颈!

欢迎关注,为大家带来最酷最有效的智能AI学术科研写作攻略。关于使用ChatGPT等AI学术科研的相关问题可以和作者七哥(yida985)交流 地表最强大的高级学术AI专业版已经开放,拥有全球领先的GPT学术科研应用,有兴趣的朋友可…

一键式创建GTest测试平台

适用于C GTest测试平台搭建。直接上python脚本。 #!/usr/bin/env python3 # -*- coding: utf-8 -*-import argparse import os import platform import subprocess from xml.etree import ElementTree as ETdefault_root_path "d:\\test\\UTtest"class DeveloperTe…

文件扫描pdf怎么弄?5个简易高效的文件扫描方法

在繁忙的工作中,我们常常需要将纸质文件快速转换为电子文档,以便于编辑、存储或分享。 无论是合同、报告还是笔记,将这些纸质文件转换为Word格式,不仅能提高工作效率,还能确保信息的安全备份。然而,面对市…

Web3 ETF的主要功能

Web3 ETF的主要功能可以概括为以下几点,Web3 ETF仍是一项新兴投资产品,其长期表现仍存在不确定性。投资者在投资Web3 ETF之前应仔细研究相关风险,并做好充分的风险评估。北京木奇移动技术有限公司,专业的软件外包开发公司&#xf…

如何爱上阅读及阅读的意义有哪些?

第一个是“情绪决定”,比如看到人家健身,摄影,画画时,自己的肾上腺素开始飙升,马上表示自己也想做; 第二个是“理智决定”,理智决定同样表示想要一样东西,但表示人必定已经想好了为…

[pwn]静态编译

静态编译 1. 栈足够大的情况下 程序在ida打开后,左侧的函数栏目没有红色(系统调用的函数),而只有一些静态函数,通常这类文件的大小会必普通的pwn题程序要大得多。 这种静态编译的题没有调用库函数,也就没…

Prometheus + Grafana 监控系统-PrometheusAlert安装与配置指南

背景 Grafana 目前对国内主流的消息通知渠道兼容性一般,因此可以考虑结合使用国产的 PrometheusAlert PrometheusAlert是开源的运维告警中心消息转发系统,支持主流的监控系统Prometheus、Zabbix,日志系统Graylog2,Graylog3、数据…

华为云生态和快速入门

华为云生态 新技术催生新物种,新物种推动新生态 数字技术催生各类运营商去重塑并颠覆各行业的商业模式 从业务层面看,企业始终如一的目标是业务增长和持续盈利,围绕这些目标衍生出提质、增效、降本、安全、创新和合规的业务诉求&#xff0c…

树形结构C语言的实现

一.什么是树: 树形结构是一层次的嵌套结构。一个树形结构的外层和内层有相似的结构,所以这种结构多可以递归的表示。经典数据结构中的各种树状图是一种典型的树形结构:一棵树可以简单的表示为根,左子树,右子树。左子树…

Android HWASAN使用与实现原理

一、背景 为了提前检测出Android User Sapce的app或native进程的内存错误问题,帮助研发定位与分析这些问题,基于Android 14版本上对HWASAN做了调研分析。 二、ASAN介绍 HWASAN是在ASAN的基础上做了拓展,因此在介绍HWASAN之前先了解下ASAN.…

电源设计改进稳定度和误差放大器的解决方案

电池,变压器,电源和转换器会不断受到能量损失的影响。结果,负载上的输出电压会降低。温度是性能的另一个关键特征。通过创建误差放大系统,可以在任何类型的负载下稳定输出电压。 稳压二极管稳定器 使用功率晶体管以及电流放大器…

自己动手实现语音识别

声音的本质是震动,震动的本质是位移关于时间的函数,波形文件(.wav)中记录了不同采样时刻的位移。 通过傅里叶变换,可以将时间域的声音函数分解为一系列不同频率的正弦函数的叠加,通过频率谱线的特殊分布,建立音频内容和文本的对应关系,以此作为模型训练的基础。 语音mfc…

比赛获奖的武林秘籍:02 国奖秘籍-大学生电子计算机类竞赛快速上手的流程,小白必看

比赛获奖的武林秘籍:02 国奖秘籍-大学生电子计算机类竞赛快速上手的流程,小白必看 摘要 本文主要介绍了大学生参加电子计算机类比赛(电赛、光电设计大赛、计算机设计大赛、嵌入式芯片与系统设计大赛等比赛)的流程和涉及到的知识…

【Portswigger 学院】文件上传

教程和靶场来源于 Burpsuite 的官网 Portswigger:File upload vulnerabilities - PortSwigger 原理与危害 很多网站都有文件上传的功能,比如在个人信息页面允许用户上传图片作为头像。如果网站应用程序对用户上传的文件没有针对文件名、文件类型、文件内…

解决中型组织三个人力资源基础问题的方法

中型企业 (通常在700 - 5000名员工之间)是从中小企业发展起来的,但不称为大型企业。虽然个别市场取得了成功,但到2023年,中端市场经历了一个艰难的结局,受到了更广泛的经济挑战的影响。然而,它仍然具有灵活性和乐观性&…

24_嵌入式系统输入输出设备

目录 GPIO原理与结构 A/D接口基本原理 A/D接口原理 A/D转换的重要指标 D/A接口基本原理 D/A接口原理 DAC的分类 D/A转换器的主要指标 键盘接口基本原理 键盘接口原理 用I/O口实现键盘接口 显示接口基本原理 基本结构和特点 基本原理 LCD种类 市面上出售的LCD的类…

dtpay聚合支付系统在跨境支付场景中技术及业务方案

1 什么是跨境支付 我们从两个维度来分析什么是跨境支付,第一个维度我们从资金流向分析,国内的消费者在境外进行消费对于国内资金流来说这属于资金流出,这是跨境支付的第一种应用场景。第二个场景国外游客在国内进行消费,这属于资…