Android 屏幕录制时去除悬浮窗
最近在用Android8.0开发一个屏幕录制的功能,要求录制的视频不能有录屏的控制悬浮窗。
录屏方案使用的是MediaRecorder、MediaProjection、VirtualDisplay。
Android支持多个屏幕:主显、外显、虚显,虚显就是VirtualDisplay。
VirtualDisplay的使用场景很多,比如录屏,WED显示等。其作用就是抓取屏幕上显示的内容。
录屏时通过加载SurfaceFlinger画布,通过加载中形成的虚显而形成的,所以我们需要在画布虚显中将悬浮窗的View图层去掉。
首先需要定义悬浮窗View的名字,也就是window的title,可以通过WindowManager.LayoutParams的setTitle()设置。
mWindowParams.setTitle("com.tpv.screenrecord.view.FloatView");
然后修改SurfaceFinger.cpp文件。
frameworks/native / services/surfaceflinger/SurfaceFlinger.cpp
以下是基于Android 8.0的修改,代码如下:
void SurfaceFlinger::rebuildLayerStacks() {......if (CC_UNLIKELY(mVisibleRegionsDirty)) {ATRACE_CALL();mVisibleRegionsDirty = false;invalidateHwcGeometry();for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {Region opaqueRegion;Region dirtyRegion;Vector<sp<Layer>> layersSortedByZ;const sp<DisplayDevice>& displayDevice(mDisplays[dpy]);const Transform& tr(displayDevice->getTransform());const Rect bounds(displayDevice->getBounds());if (displayDevice->isDisplayOn()) {computeVisibleRegions(displayDevice->getLayerStack(), dirtyRegion,opaqueRegion);mDrawingState.traverseInZOrder([&](Layer* layer) {if (layer->getLayerStack() == displayDevice->getLayerStack()) {Region drawRegion(tr.transform(layer->visibleNonTransparentRegion));drawRegion.andSelf(bounds);if (!drawRegion.isEmpty()) {//[start] zhongxiang.huang,20200221, screenrecord--remove floatViewif (DisplayDevice::DISPLAY_VIRTUAL == displayDevice->getDisplayType()) {if (!strstr(layer->getName().string(), "com.tpv.screenrecord.view.FloatView")) {layersSortedByZ.add(layer);} } else {layersSortedByZ.add(layer);}//layersSortedByZ.add(layer);//[end] zhongxiang.huang,20200221, screenrecord--remove floatView} else {// Clear out the HWC layer if this layer was// previously visible, but no longer islayer->setHwcLayer(displayDevice->getHwcDisplayId(),nullptr);}} else {// WM changes displayDevice->layerStack upon sleep/awake.// Here we make sure we delete the HWC layers even if// WM changed their layer stack.layer->setHwcLayer(displayDevice->getHwcDisplayId(),nullptr);}//HISILICON add begin//for freeze-frame in hiplayif (layer->mSidebandStream.get()){vecCurrentQuedSidebandList.add(layer->mSidebandStream);}//HISILICON add end});}displayDevice->setVisibleLayersSortedByZ(layersSortedByZ);displayDevice->undefinedRegion.set(bounds);displayDevice->undefinedRegion.subtractSelf(tr.transform(opaqueRegion));displayDevice->dirtyRegion.orSelf(dirtyRegion);}......}
}
参考:https://blog.csdn.net/Easyhood/article/details/101534780
Android 屏幕录制时去除悬浮窗相关推荐
- android 仿微信来电_Android 悬浮窗功能实现(微信语音通话悬浮窗效果实现)
目录 1.基本介绍 2.代码示例 3.实现效果及便捷工具类 4.仿微信语音通话悬浮窗效果实现 4.1 需求分析及效果展示 4.2 实现 5.最后 1.基本介绍 Android 界面绘制都是通过 Win ...
- Android检测是否有悬浮窗,Android 获取判断是否有悬浮窗权限的方法
现在很多应用都会用到悬浮窗,很多国产rom把悬浮窗权限加入控制了,你就需要判断是否有悬浮窗权限,然后做对应操作. Android 原生有自带权限管理的,只是被隐藏了.看android源码在androi ...
- android悬浮动态权限,Android 获取判断是否有悬浮窗权限的方法
现在很多应用都会用到悬浮窗,很多国产rom把悬浮窗权限加入控制了,你就需要判断是否有悬浮窗权限,然后做对应操作. Android 原生有自带权限管理的,只是被隐藏了.看android源码在androi ...
- Android屏幕旋转时Activity不重新调用onCreate的方法
2019独角兽企业重金招聘Python工程师标准>>> android屏幕旋转时Activity不重新调用onCreate的方法 当手机转屏时,Activity的onDestroy和 ...
- android 实现录屏功能(悬浮窗)
前言:网上关于录屏的介绍已经很多了,本篇文章也不过多介绍详细,主要是阐述其流程原理,输出demo,该demo样式仿照小米自带的系统录屏 1.如何录屏 Android中在5.0以上的版本中系统已经提供了 ...
- android屏幕录制功能,Android利用ADB进行屏幕录制
前言 在写博客时,为了方便大家理解,我们经常需要把一些操作或动画录制成Gif,一般需要下载一个屏幕录制App将手机屏幕录制成视频(可能需要Root权限),然后导出到电脑,再转为Gif.今天就来教大家一 ...
- Android可拖动可吸附悬浮窗
第一次写稿,写的不好,请大神多提建议 前言 前一段时间由于项目需要,写了一个可拖动可靠边吸附的悬浮窗,特意记录下来,方便大家一起学习 一.FloatingViewMagnet 悬浮窗的吸附管理类,代码 ...
- python web Android屏幕录制
执行测试用例时,自动触发屏幕录制,单用例单录制 录制方式采用多线程,主线程开始,另开一个线程,跑录制脚本 web端 录制检测的是电脑页面,录制电脑页面展示的数据. from datetime impo ...
- android 屏幕录制方案,Android录屏的三种解决方案
本文总结三种用于安卓录屏的解决方案: adb shell命令screenrecord MediaRecorder, MediaProjection MediaProjection , MediaCod ...
最新文章
- SQL Server 创建定时任务JOB
- numpy.sum详解
- my life-long goal
- BUUCTF-WEB:[极客大挑战 2019]EasySQL 1(收藏了URL编码表)
- [好东西]使用ngrok把本机的网站端口映射到外网
- eclipse将java工程转换为java动态web工程(工程转换均可参照)
- make_shared和shared_ptr的区别
- quarkus_Quarkus入门
- ios开发 多人语音聊天_在 Unity 多人游戏中实现语音对话
- postgreSQL源码分析——索引的建立与使用——Hash索引(1)
- 生成三角网算法java,一种低效但逻辑简单清晰的Delaunay三角网生成算法
- BasicAuth和OAuth
- Eclipse设置Android Logcat输出字体大小
- 【Django】The view userWeb.views. didn‘t return an HttpResponse object. It returned None instead.
- c语言程序设计现代方法算法pdf,c语言程序设计(排序算法).pdf
- python123监考系统可以识别_在线考试系统的视频监考怎么防作弊?
- Python语言程序设计----【第8周 程序设计方法学】之8.2 Python程序设计思维
- win7查看计算机硬盘序列号,win7系统通过cmd查看硬盘序列号的操作方法
- 数值分析原理课程实验——牛顿(Newton)迭代法
- 根证书、服务器证书、用户证书的区别