Android12隐藏录屏时屏幕上原有的悬浮窗

问题遇到的现象和发生背景

有博主写过O、P版本的去除方式:frameworks/native / services/surfaceflinger/SurfaceFlinger.cpp下有个rebuildLayerStacks方法,可以在这个方法中进行过滤。
但我的环境是Android12,源码中没有这个方法了..

我想要达到的结果

(修改AOSP源码从而达到)录屏时去除屏幕上原有的悬浮窗,而非录屏标识

Android屏幕录制时怎样在录屏中去掉悬浮窗_Easyhood的博客-CSDN博客 可以看看这篇博客

https://blog.csdn.net/easyhood/article/details/101534780?ops_request_misc=&request_id=&biz_id=102&utm_term=Android12%E9%9A%90%E8%97%8F%E5%BD%95%E5%B1%8F%E6%97%B6%E5%B1%8F%E5%B9%95%E4%B8%8A%E5%8E%9F%E6%9C%89%E7%9A%84%E6%82%AC%E6%B5%AE%E7%AA%97&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-101534780.142^v40^control,185^v2^tag_show&spm=1018.2226.3001.4187

https://ask.csdn.net/questions/233282?spm=1005.2026.3001.5635&utm_medium=distribute.pc_relevant_ask_down.none-task-ask-2~default~OPENSEARCH~Rate-1-233282-ask-7772169.pc_feed_download_top3ask&depth_1-utm_source=distribute.pc_relevant_ask_down.none-task-ask-2~default~OPENSEARCH~Rate-1-233282-ask-7772169.pc_feed_download_top3ask

可以安装专门的录屏软件

我的android12手机(google pixel3, samsung galaxy 21)都没有悬浮窗,只有右上角的角标

可以用其他录屏软件试一下

录屏是通过加载SurfaceFlinger画布,通过加载中形成的虚显而形成的,所以我们需要在画布虚显中悬浮窗的view图层去掉

以下是基于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 floatView
                        if (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 is
                        layer->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 hiplay
                if (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);
    }
    ......
}

}

Android12上,AOSP隐藏悬浮窗挪到其它方法了吧?

Android12我的没有悬浮窗

可以不给录屏软件悬浮窗权限,在第一次录屏打开后关闭悬浮窗权限即可

Android支持多个屏幕:主显,外显,和虚显,虚显就是我们要说的VirtualDisplay。VirtualDisplay的使用场景很多,比如录屏,WFD显示等。其作用就是抓取屏幕上显示的内容。VirtualDisplay抓取屏幕内容,其实现方式有很多。在API中就提供了ImageReader进行读取VirtualDisplay里的内容。
而录屏是通过加载SurfaceFlinger画布,通过加载中形成的虚显而形成的,所以我们需要在画布虚显中悬浮窗的view图层去掉,首先,需要清楚你悬浮窗的view被定义的名字,比方说我定义悬浮窗的view名字为"floatball",那么我就可以这样修改:

frameworks/native / services/surfaceflinger/SurfaceFlinger.cpp
void SurfaceFlinger::rebuildLayerStacks() {
ATRACE_CALL();
ALOGV("rebuildLayerStacks");

// rebuild the visible layer list per screen
if (CC_UNLIKELY(mVisibleRegionsDirty)) {
ATRACE_NAME("rebuildLayerStacks VR Dirty");
......
mDrawingState.traverseInZOrder([&](Layer* layer) {
bool hwcLayerDestroyed = false;
if (layer->belongsToDisplay(displayDevice->getLayerStack(),
displayDevice->isPrimary())) {
Region drawRegion(tr.transform(
layer->visibleNonTransparentRegion));
drawRegion.andSelf(bounds);
// ------------start-------------
if (!drawRegion.isEmpty()) {
//我们在这里判断是否使用虚显录屏,并将floatball不加入录屏中
if (DisplayDevice::DISPLAY_VIRTUAL == displayDevice->getDisplayType()) {
if (!strstr(layer->getName().string(), "floatball")) {
layersSortedByZ.add(layer);
}
} else {
layersSortedByZ.add(layer);
}
//-------------end---------------
} else {
// Clear out the HWC layer if this layer was
// previously visible, but no longer is
hwcLayerDestroyed = layer->destroyHwcLayer(
displayDevice->getHwcDisplayId());
}
} else {
......
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
这样在我们录屏的时候就可以不将悬浮窗不录入进去了

你可以看看这个网站:https://blog.csdn.net/chaojiangluo/article/details/83008865

可以看一下这个 挺全的
https://blog.csdn.net/u011897782/article/details/82775077

有专门的软件就没有
百度搜索:录屏高手
图标:背景是黄色的,里面一个摄像头加一个红点


有帮助请点个采纳,谢谢。