Android高通 12/13 录屏流程代码位置

news2024/12/27 3:33:36

 需求如下图 实现系统录屏功能 

frameworks/base/packages/SystemUI/src/com/android/systemui/screenrecord

涉及代码

ScreenRecordDialog # startBtn

RecordingService # startRecording# stopRecording

ScreenMediaRecorder # start # end  #save

1、点击开始录屏frameworks/base/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java

 startBtn.setOnClickListener(v -> {
            if (mOnStartRecordingClicked != null) {
                // Note that it is important to run this callback before dismissing, so that the
                // callback can disable the dialog exit animation if it wants to.
                mOnStartRecordingClicked.run();
            }

            requestScreenCapture();
            dismiss();
        });

2、ScreenRecordDialog #requestScreenCapture核心代码实现功能 

private void requestScreenCapture() {
        Context userContext = mUserContextProvider.getUserContext();
        ScreenRecordingAudioSource audioMode = mAudioSwitch.isChecked()
                ? (ScreenRecordingAudioSource) mOptions.getSelectedItem()
                : NONE;
        PendingIntent startIntent = PendingIntent.getForegroundService(userContext,
                RecordingService.REQUEST_CODE,
                RecordingService.getStartIntent(
                        userContext, Activity.RESULT_OK,
                        audioMode.ordinal()),
                PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
        PendingIntent stopIntent = PendingIntent.getService(userContext,
                RecordingService.REQUEST_CODE,
                RecordingService.getStopIntent(userContext),
                PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
        mController.startCountdown(DELAY_MS, INTERVAL_MS, startIntent, stopIntent);
    }
}

3、RecordingService 中实现开始录屏功能 代码如下图所示

 case ACTION_START:
                mAudioSource = ScreenRecordingAudioSource
                        .values()[intent.getIntExtra(EXTRA_AUDIO_SOURCE, 0)];
                Log.d(TAG, "recording with audio source" + mAudioSource);

                mRecorder = new ScreenMediaRecorder(
                        mUserContextTracker.getUserContext(),
                        currentUserId,
                        mAudioSource,
                        this
                );

                if (startRecording()) {
                    updateState(true);
                    createRecordingNotification();
                    mUiEventLogger.log(Events.ScreenRecordEvent.SCREEN_RECORD_START);
                } else {
                    updateState(false);
                    createErrorNotification();
                    stopForeground(true);
                    stopSelf();
                    return Service.START_NOT_STICKY;
                }
                break;

4、ScreenMediaRecorder 调用start方法开始录屏 

  * Start screen recording
    */
    void start() throws IOException, RemoteException, RuntimeException {
        Log.d(TAG, "start recording");
        prepare();
        mMediaRecorder.start();
        recordInternalAudio();
    }

5、ScreenMediaRecorder停止录屏 调用代码路径 

/**
     * End screen recording
     */
    void end() {
        mMediaRecorder.stop();
        mMediaRecorder.release();
        mInputSurface.release();
        mVirtualDisplay.release();
        mMediaProjection.stop();
        mMediaRecorder = null;
        mMediaProjection = null;
        stopInternalAudioRecording();

        Log.d(TAG, "end recording");
    }

6、保存录屏视频代码 如下图所示

/**
     * Store recorded video
     */
    protected SavedRecording save() throws IOException {
        String fileName = new SimpleDateFormat("'screen-'yyyyMMdd-HHmmss'.mp4'")
                .format(new Date());

        ContentValues values = new ContentValues();
        values.put(MediaStore.Video.Media.DISPLAY_NAME, fileName);
        values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4");
        values.put(MediaStore.Video.Media.DATE_ADDED, System.currentTimeMillis());
        values.put(MediaStore.Video.Media.DATE_TAKEN, System.currentTimeMillis());

        ContentResolver resolver = mContext.getContentResolver();
        Uri collectionUri = MediaStore.Video.Media.getContentUri(
                MediaStore.VOLUME_EXTERNAL_PRIMARY);
        Uri itemUri = resolver.insert(collectionUri, values);

        Log.d(TAG, itemUri.toString());
        if (mAudioSource == MIC_AND_INTERNAL || mAudioSource == INTERNAL) {
            try {
                Log.d(TAG, "muxing recording");
                File file = File.createTempFile("temp", ".mp4",
                        mContext.getCacheDir());
                mMuxer = new ScreenRecordingMuxer(MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4,
                        file.getAbsolutePath(),
                        mTempVideoFile.getAbsolutePath(),
                        mTempAudioFile.getAbsolutePath());
                mMuxer.mux();
                mTempVideoFile.delete();
                mTempVideoFile = file;
            } catch (IOException e) {
                Log.e(TAG, "muxing recording " + e.getMessage());
                e.printStackTrace();
            }
        }

        // Add to the mediastore
        OutputStream os = resolver.openOutputStream(itemUri, "w");
        Files.copy(mTempVideoFile.toPath(), os);
        os.close();
        if (mTempAudioFile != null) mTempAudioFile.delete();
        DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();
        Size size = new Size(metrics.widthPixels, metrics.heightPixels);
        SavedRecording recording = new SavedRecording(itemUri, mTempVideoFile, size);
        mTempVideoFile.delete();
        return recording;
    }

到这里基本结束了,转载请注明出处Android高通 12/13 录屏流程代码位置-CSDN博客,谢谢!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

停车场车位引导系统方案升级实施步骤流程是什么,有什么注意事项

停车场车位引导系统是一种现代化的停车管理系统,它通过实时监测车位占用情况,并向驾驶员提供准确的空闲车位导航信息,从而提高停车场的使用效率和用户体验。随着城市交通的快速发展和车辆数量的不断增加,停车场车位引导系统已成为…

【数据分享】中国科技统计年鉴Excel版(1991-2023年)

大家好!今天我要向大家介绍一份重要的中国科技统计数据资源——《中国科技统计年鉴》。这份年鉴涵盖了从1991年到2023年中国科技统计全面数据,并提供限时免费下载。 数据介绍 在数字化时代的浪潮中,数据的重要性日益凸显。对于研究人员、政…

AutoSQT 2024汽车软件质量与测试峰会开启注册 | 智能汽车软件如何卷出差异化?

在汽车行业向智能化、网联化转型的大趋势下,软件在汽车系统中扮演着越来越核心的角色。基于“软件定义汽车”的行业共识,各主机厂正在不断押注软件开发,以实现品牌差异化竞争。 例如,大众集团正在开发下一代汽车操作系统和应用软…

Spring MVC 应⽤分层

什么是应用分层 引用分层是一种软件开发思想 将应用程序分为N个层次每个层次负责各个职责 其中MVC是常见的设计模式这就是应用分层的具体体现 目前主流的开发方式是前后段分离后端开发工程师不再需要关注前端的实现,对此就需要分为表现层,数据层,业务逻…

LM2733升压芯片

具有 40V 内部 FET 开关且采用 SOT-23 封装的 LM2733 0.6MHz 和 1.6MHz 升压转换器 外观 参考价格 1 特性 电路原理图 基于LM2733升压电路设计-CSDN博客https://blog.csdn.net/qq_31251431/article/details/107479885 特此记录 anlog 2024年5月31日 高压方案 此方案经过更多…

数据结构 | 二叉树(基本概念、性质、遍历、C代码实现)

1.树的基本概念 树是一种 非线性 的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。 把它叫做树是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 有一个特殊的结点,称为根…

ChatGPT的逆袭历程:核心技术深度解析

在ChatGPT问世之前,已有许多大模型存在,但为何只有它成为了AI时代的“iPhone时刻”?这不仅得益于其技术优势,还在于其发展过程中所采用的一系列创新策略。本文将深度复盘ChatGPT的逆袭历程,分析其核心技术,…

GIS毕业薪资从2K到20K究竟要多久?

同大多数行业一样,GIS毕业生薪资跟行业有密切关系。 测绘地理信息行业紧跟时代步伐,随着测绘地理信息技术的变革和进步,测绘产品也逐渐升级发展。 经过三个阶段的发展,测绘地理信息产品初步实现从抽象到真实、从平面到立体、从静…

npm run dev 同时运行vue前端项目和node后端项目

将两个项目放到一个目录下 项目拖进vscode中,安装包依赖,修改配置 npm i concurrently "dev": "concurrently \"vite --mode development\" \"nodemon app.js\"" 命令行 npm run dev 运行 没有运行成功排查 …

window11 设置 ubuntu2204 至最佳体验(安装/右键菜单/root用户/docker)

前言 在 window 中如果不使用 ubuntu 命令行会非常不方便,还好微软提供了 ubuntu 的终端,下载安装后简单设置下就可以愉快的使用了。 本文会涉及的方面 安装右键菜单设置root 用户设置docker 设置 安装 ubuntu 到微软的软件商店中下载安装即可&…

探索python数据可视化的奥秘:打造专业绘图环境

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、搭建专业绘图环境 二、掌握绘图基本原理 三、解锁绘图高级技巧 四、总结与展望 在数据…

taskENTER_CRITICAL()分析

1. 临界段代码 //任务级的临界段代码保护 taskENTER_CRITICAL() taskEXIT_CRITICAL()//中断级的临界段代码保护 taskENTER_CRITICAL_FROM_ISR() taskEXIT_CRITICAL_FROM_ISR()2. 以STM32为例 (1)STM32有0~15,共16级中断,可嵌套…

【linux】开机调用python脚本

linux中,可以使用crontab 设置开机自动调用 crontab的安装在前面文章里写过了,不再重复 首先,还是进入crontab配置文件 crontab -e 进入之后,跟其他定时任务不同,只需要在时间配置那里用rebooot 这类之后的两个文件的…

计算机图形学入门05:投影变换

1.投影变换 上一章已经介绍了投影变换,就是将三维图像投影到二维平面上,而投影变换又分为正交投影(Orthographic Projection)和透视投影(Perspective Projection)。如下图: 正交投影 没有近大远小的现象,无论图形与视点距离是远是…

Three.js 研究:4、创建设备底部旋转的科技感圆环

1、实现效果 2、PNG转SVG 2.1、原始物料 使用网站工具https://convertio.co/zh/png-svg/进行PNG转SVG 3、导入SVG至Blender 4、制作旋转动画 4.1、给圆环着色 4.2、修改圆环中心位置 4.3、让圆环旋转起来 参考一下文章 Three.js 研究:1、如何让物体动起来 Thre…

万字长文深度解析Agent反思工作流框架Reflexion上篇:安装与运行

今天,我们将迈出从理论到实践的关键一步——通过安装和测试Reflexion框架,我们将揭开智能体工作流的神秘面纱,实现知识的深度融合与应用。由于框架东西较多,我们暂定分为上中下三篇来讲解。 1. 安装 1.1 克隆和查看项目 git clo…

大语言模型实战——最小化模型评测

1. 引言 现在国内外的主流模型,在新模型发布时都会给出很多评测数据,用以说明当前模型在不同数据集上的测评表现(如下面llama3发布的评测数据)。 这些评测数据是如何给出来的呢?这篇文章会用一个最小化的流程来还原下…

u盘文件保密的方法有哪些?关于U盘的使用你要知道这些!

U盘作为便携式的存储设备,被广泛应用于日常工作和生活中。 然而,U盘的丢失或被盗可能导致敏感数据泄露,因此,掌握U盘文件保密的方法至关重要。 本文将介绍几种有效的U盘文件保密方法,并分享关于U盘使用的关键知识&…

Android HIDL接口添加

一.HIDL介绍 HIDL的全称是HAL interface definition language(硬件抽象层接口定义语言),是Android Framework 与Android HAL之间的接口。HIDL 旨在用于进程间通信 (IPC),进程之间的通信 采用 Binder 机制。 二.HIDL 与AIDL 的对…

CSRF跨站请求伪造漏洞

CSRF跨站请求伪造漏洞 1.CSRF漏洞概述2.防御CSRF攻击3.CSRF防御绕过CSRF令牌未绑定到用户会话自定义标头令牌绕过绕过Referer检查关键词绕过 4.利用示例使用HTML标签进行GET表单 GET 请求表单POST请求通过 iframe 发送表单 POST 请求Ajax POST 请求 5.CSRF BP 验证方法6.CSRF测…