有博主写过O、P版本的去除方式:frameworks/native / services/surfaceflinger/SurfaceFlinger.cpp下有个rebuildLayerStacks方法,可以在这个方法中进行过滤。
但我的环境是Android12,源码中没有这个方法了..
(修改AOSP源码从而达到)录屏时去除屏幕上原有的悬浮窗,而非录屏标识
Android屏幕录制时怎样在录屏中去掉悬浮窗_Easyhood的博客-CSDN博客 可以看看这篇博客
可以安装专门的录屏软件
我的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
有专门的软件就没有
百度搜索:录屏高手
图标:背景是黄色的,里面一个摄像头加一个红点
有帮助请点个采纳,谢谢。