1

我正在尝试实现一个系统,如果发生未捕获的异常,我的异常处理程序将截取活动的屏幕截图,保存并作为错误报告的一部分发送。这在Android中甚至可能吗?我将活动传递给构造函数中的异常处理程序,但到目前为止我用来获取屏幕截图的每一次尝试都返回了 null。

我尝试了以下方法:

尝试一:

private Bitmap screenshot() {
    View view = activity.getWindow().getDecorView(); //also tried getDecorView().getRootView()
    view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    view.setDrawingCacheEnabled(true);
    view.buildDrawingCache(true);
    Bitmap image = view.getDrawingCache();
    Rect windowbounds = new Rect();
    view.getWindowVisibleDisplayFrame(windowbounds);
    int width = activity.getWindowManager().getDefaultDisplay().getWidth();
    int height = activity.getWindowManager().getDefaultDisplay().getHeight();
    Bitmap secondaryBitmap = Bitmap.createBitmap(image, 0, 0, width, height);
    view.destroyDrawingCache();
    return secondaryBitmap;
}

尝试二:

private Bitmap screenshot2()
{
    View view = activity.getWindow().getDecorView(); //also tried getDecorView().getRootView()
    view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    Bitmap viewBmp = Bitmap.createBitmap(view.getWidth(),view.getHeight(),
            Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(viewBmp);
    view.draw(canvas);
    return viewBmp;
}

在尝试 #1 中 view.getDrawingCache() 返回 null,在尝试 #2 Bitmap.createBitmap 返回 null。

任何 Android 开发人员都知道如何在 UncaughtExceptionHandler 中截取屏幕截图?

4

1 回答 1

0

你不想要:

Bitmap viewBmp = Bitmap.createBitmap(view.getLayoutParams().width, view.getLayoutParams().height,
        Bitmap.Config.ARGB_8888);

LayoutParams通常没有实际的宽度和高度。通常它有负值,表示wrap_contentmatch_parent

相反,请尝试:

Bitmap viewBmp = Bitmap.createBitmap(view.getWidth(), view.getHeight(),
        Bitmap.Config.ARGB_8888);

或类似的规定。您需要容器的实际宽度和高度,而不是其请求的宽度和高度LayoutParams

于 2013-10-28T11:39:16.833 回答