最近在用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 屏幕录制时去除悬浮窗相关推荐

  1. android 仿微信来电_Android 悬浮窗功能实现(微信语音通话悬浮窗效果实现)

    目录 1.基本介绍 2.代码示例 3.实现效果及便捷工具类 4.仿微信语音通话悬浮窗效果实现 4.1 需求分析及效果展示 4.2 实现 5.最后 1.基本介绍 Android 界面绘制都是通过 Win ...

  2. Android检测是否有悬浮窗,Android 获取判断是否有悬浮窗权限的方法

    现在很多应用都会用到悬浮窗,很多国产rom把悬浮窗权限加入控制了,你就需要判断是否有悬浮窗权限,然后做对应操作. Android 原生有自带权限管理的,只是被隐藏了.看android源码在androi ...

  3. android悬浮动态权限,Android 获取判断是否有悬浮窗权限的方法

    现在很多应用都会用到悬浮窗,很多国产rom把悬浮窗权限加入控制了,你就需要判断是否有悬浮窗权限,然后做对应操作. Android 原生有自带权限管理的,只是被隐藏了.看android源码在androi ...

  4. Android屏幕旋转时Activity不重新调用onCreate的方法

    2019独角兽企业重金招聘Python工程师标准>>> android屏幕旋转时Activity不重新调用onCreate的方法 当手机转屏时,Activity的onDestroy和 ...

  5. android 实现录屏功能(悬浮窗)

    前言:网上关于录屏的介绍已经很多了,本篇文章也不过多介绍详细,主要是阐述其流程原理,输出demo,该demo样式仿照小米自带的系统录屏 1.如何录屏 Android中在5.0以上的版本中系统已经提供了 ...

  6. android屏幕录制功能,Android利用ADB进行屏幕录制

    前言 在写博客时,为了方便大家理解,我们经常需要把一些操作或动画录制成Gif,一般需要下载一个屏幕录制App将手机屏幕录制成视频(可能需要Root权限),然后导出到电脑,再转为Gif.今天就来教大家一 ...

  7. Android可拖动可吸附悬浮窗

    第一次写稿,写的不好,请大神多提建议 前言 前一段时间由于项目需要,写了一个可拖动可靠边吸附的悬浮窗,特意记录下来,方便大家一起学习 一.FloatingViewMagnet 悬浮窗的吸附管理类,代码 ...

  8. python web Android屏幕录制

    执行测试用例时,自动触发屏幕录制,单用例单录制 录制方式采用多线程,主线程开始,另开一个线程,跑录制脚本 web端 录制检测的是电脑页面,录制电脑页面展示的数据. from datetime impo ...

  9. android 屏幕录制方案,Android录屏的三种解决方案

    本文总结三种用于安卓录屏的解决方案: adb shell命令screenrecord MediaRecorder, MediaProjection MediaProjection , MediaCod ...

最新文章

  1. SQL Server 创建定时任务JOB
  2. numpy.sum详解
  3. my life-long goal
  4. BUUCTF-WEB:[极客大挑战 2019]EasySQL 1(收藏了URL编码表)
  5. [好东西]使用ngrok把本机的网站端口映射到外网
  6. eclipse将java工程转换为java动态web工程(工程转换均可参照)
  7. make_shared和shared_ptr的区别
  8. quarkus_Quarkus入门
  9. ios开发 多人语音聊天_在 Unity 多人游戏中实现语音对话
  10. postgreSQL源码分析——索引的建立与使用——Hash索引(1)
  11. 生成三角网算法java,一种低效但逻辑简单清晰的Delaunay三角网生成算法
  12. BasicAuth和OAuth
  13. Eclipse设置Android Logcat输出字体大小
  14. 【Django】The view userWeb.views. didn‘t return an HttpResponse object. It returned None instead.
  15. c语言程序设计现代方法算法pdf,c语言程序设计(排序算法).pdf
  16. python123监考系统可以识别_在线考试系统的视频监考怎么防作弊?
  17. Python语言程序设计----【第8周 程序设计方法学】之8.2 Python程序设计思维
  18. win7查看计算机硬盘序列号,win7系统通过cmd查看硬盘序列号的操作方法
  19. 数值分析原理课程实验——牛顿(Newton)迭代法
  20. 根证书、服务器证书、用户证书的区别

热门文章

  1. python的环境,你再也不用愁-conda
  2. 实现一个简单的众筹(ICO)合约
  3. 将html或者div转换为图片
  4. 超级好用的录屏软件:FSCapture
  5. 为什么说Objective-C是一门动态的语言?
  6. whisper使用时候报错
  7. 【MOT】多目标跟踪sort的加速思路
  8. PCIe VPD (Vital Product Data) 介绍
  9. 新疆能源产业发展走势及十四五供需规模调研报告2021版
  10. 计算机创意作品画图,快乐画图 趣味画图 创意画图