簡體   English   中英

使用根視圖進行Android屏幕捕獲

[英]Android Screen Capture using root view

我正在嘗試捕獲屏幕

    View decorView = activity.getWindow().getDecorView();
    decorView.setDrawingCacheEnabled(true);
    Bitmap bitmap = decorView.getDrawingCache();

一切正常,我可以截屏了。 但是對於一種情況,我面臨一個問題。 但是,當存在Dialog片段時,不會捕獲Dialog片段的視圖,但是會捕獲部分可見的背景活動視圖,就像在最頂層的活動的根視圖一樣。

但是,當存在Dialog片段時,不會捕獲Dialog片段的視圖,但是會捕獲部分可見的背景活動視圖,就像在最頂層的活動的根視圖一樣。

那是因為Dialog在單獨的窗口中。 我對此一無所知。

您可以在反射的幫助下獲取應用程序所有窗口的裝飾視圖列表。 該列表不僅包含活動的裝飾視圖,還包含對話框和彈出窗口的裝飾視圖。

void processDialogWindow(Context context) {
    WindowManager windowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
    Field globalField = Class.forName("android.view.WindowManagerImpl").getDeclaredField("mGlobal");
    globalField.setAccessible(true);
    Object globalFieldValue = globalField.get(windowManager);
    List<?> viewsFieldValue = getViews(globalFieldValue);
    for (int i = viewsFieldValue.size() - 1; i >= 0; i--) {
        View decorView = (View)viewsFieldValue.get(i);
        WindowManager.LayoutParams castedParams = (WindowManager.LayoutParams)decorView.getLayoutParams();
        if (castedParams.type == WindowManager.LayoutParams.TYPE_APPLICATION) { // Dialog
            //TODO: get decorView screenshot.
        }
    }
}

List<?> getViews(Object globalWindowManager) throws NoSuchFieldException, IllegalAccessException {
    Field viewsField = globalWindowManager.getClass().getDeclaredField("mViews");
    viewsField.setAccessible(true);
    Object viewsFieldValue = viewsField.get(globalWindowManager);
    if (viewsFieldValue instanceof List<?>)
        return (List<?>)viewsFieldValue;
    else if (viewsFieldValue instanceof View[]) {
        return new ArrayList<>(Arrays.asList((View[])viewsFieldValue));
    }
    return null;
}

我已經在Android 5、6和7上測試了這種方法。當然,當您使用反射時,應該檢查某個字段的值是否不為null且確實具有預期的類型。 因此,可以在將來的Android版本中或通過設備供應商甚至在現有的Android版本中更改通過反射訪問的內部數據結構。 為了簡潔起見,我沒有在此處添加對null或錯誤類型的檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM