2013-10-28 4 views
0

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

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

Покушение One:

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?

+1

второй возвращает null, потому что вы пытаетесь создать растровое изображение с размером -1 или -2 – Blackbelt

+0

О, хорошо, как это так? – user2459186

+0

view.getLayoutParams(). Width возвращает один из fill_parent и wrap_content – Blackbelt

ответ

0

Вы не хотите:

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.

+0

Спасибо за ваш ответ CW. Я изменил его на «view.getWidth()» и «getHeight()», и обе эти функции возвращают 0? Возможно ли, что макет больше не существует к тому времени, когда вызывается обработчик исключений? – user2459186

+0

@ user2459186: Либо это, либо исключение произошло до того, как макет был измерен (например, в 'onCreate()' активности). – CommonsWare

+0

Спасибо за ваш вклад, я действительно намеренно вызывал исключение нулевого указателя в моем методе OnResume, чтобы проверить этот код, и кажется, что вы правы, макет не был измерен на данный момент времени. – user2459186