Android 获取历史 Application 的截图

Android Framework中的WindowManagerService提供了获取历史Application截图的方法getTaskTopThumbnail,下面演示的只获取了最近一个app的Thumbnail。需要注意的是framework只提供了缩略图,没有提供完整的截图,但是我们可以通过在WindowManagerService中修改getTaskTopThumbnail来提供完整的Application截图。 另:这个方法只能截取Window属性为TYPE_APPLICATION的窗口,对于像属性为TYPE_KEYGUARD等窗口不能使用这个方法,可以通过Surface来截图。 这种方法的意义在于: 你可以获取一个处于pause或stop(可能被另一个窗口遮挡)状态的avtivity的截图,而使用Surface截图只能获取当前显示的画面(也就是framebuffer中的内容)。

 ActivityManager am = (ActivityManager) getContext().getSystemService(
                Context.ACTIVITY_SERVICE);

    private Bitmap takeScreenshot() {
        Bitmap bmp = null;

        final List<ActivityManager.RecentTaskInfo> recentTasks = am.getRecentTasksForUser(
                1, ActivityManager.RECENT_IGNORE_UNAVAILABLE,
                UserHandle.CURRENT.getIdentifier());
        if (recentTasks.size() > 0) {
            ActivityManager.RecentTaskInfo recentInfo = recentTasks.get(0);
            bmp = am.getTaskTopThumbnail(recentInfo.persistentId);
        }

        return bmp;
    }

ref: frameworks/base/services/java/com/android/server/wm/WindowManagerService.java