Android屏幕錄製時怎樣在錄屏中去掉懸浮窗

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 {
                ......
                }

這樣在我們錄屏的時候就可以不將懸浮窗不錄入進去了

參考文章:
https://blog.csdn.net/chaojiangluo/article/details/83008865

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章