Сделать снимок экрана в UncaughtExceptionHandler

Я пытаюсь внедрить систему, в которой в случае возникновения неперехваченного исключения мой обработчик исключений сделает снимок экрана действия, который будет сохранен и отправлен как часть отчета об ошибке. Это вообще возможно в Android? Я передаю действие обработчику исключений в конструкторе, но каждая попытка, которую я до сих пор использовал, чтобы получить снимок экрана, возвращалась с нулевым значением.

Я пробовал следующее:

Попытка первая:

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() возвращает ноль, а при попытке № 2 Bitmap.createBitmap возвращает ноль.

Кто-нибудь из разработчиков Android знает, как сделать снимок экрана в UncaughtExceptionHandler?

1 ответ

Решение

Ты не хочешь:

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

LayoutParams обычно не имеет фактической ширины и высоты. Часто оно имеет отрицательные значения, указывающие wrap_content или же match_parent,

Вместо этого попробуйте:

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

Или что-то вдоль этих линий. Вы хотите, чтобы фактическая ширина и высота контейнера, а не ширина и высота, запрошенные его LayoutParams,

Другие вопросы по тегам