Intereting Posts
Автоматически принимать все лицензии SDK Меню Упорядочение различий из-за иерархии фрагментов и активности. (onCreateOptionsMenu) Как добавить JSoup.jar в мой проект Android? Android Google Maps API V2 Увеличить до текущего местоположения Android, как сфокусировать ActionBar searchView Изменить цвет курсора edittext Отображение метода dex по пакету Android SQLiteOpenHelper не может открыть файл базы данных Как установить OnClickListener на RadioButton в Android? Как приложение Content Provider определяет разрешения, которые необходимы клиентским приложениям для доступа к данным провайдера? Как использовать муравей для сборки с помощью андроида Использование ResultReceiver в Android Не найден ресурс, который соответствует указанному имени: attr 'android: actionModeShareDrawable' appcompat-v7: 21.0.0 с compileSdkVersion 21 Android logcat регистрирует только информационный уровень на реальном устройстве. Не удается получить отладочные сообщения, даже необработанные исключения Android: плотность устройства возвращается с нуля на некоторых устройствах

Получение растрового изображения из WebView приводит к сбою OutOfMemory

У меня есть пользовательский WebView и я хочу получить растровое изображение его содержимого (включенное WebView ). Я использовал этот код, который я получил отсюда :

  public static Bitmap getBitmapFromWebviewV2(WebView webView) { webView.measure(View.MeasureSpec.makeMeasureSpec( View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); webView.layout(0, 0, webView.getMeasuredWidth(), webView.getMeasuredHeight()); webView.setDrawingCacheEnabled(true); webView.buildDrawingCache(); Bitmap bm = Bitmap.createBitmap(webView.getMeasuredWidth(), webView.getMeasuredHeight(), Bitmap.Config.ARGB_8888); Canvas bigcanvas = new Canvas(bm); Paint paint = new Paint(); int iHeight = bm.getHeight(); bigcanvas.drawBitmap(bm, 0, iHeight, paint); webView.draw(bigcanvas); return bm; } 

Он работает отлично до такой степени, когда я увеличиваю масштаб, и в этом случае я получаю OutOfMemory Crash. Я проверил это с одним и тем же изображением (слегка увеличенным и увеличенным до максимального), и он ведет себя так же, как я упоминал выше.

Я попытался противостоять этому, добавив

 while(webView.canZoomOut()){ webView.zoomOut(); } в while(webView.canZoomOut()){ webView.zoomOut(); } 

В начале, но это совсем не помогает.

Solutions Collecting From Web of "Получение растрового изображения из WebView приводит к сбою OutOfMemory"

Хорошо, я взломал это. Проблема действительно заключалась в том, что функция вернула битмап-waay до того, как процедура масштабирования закончилась, поэтому мне пришлось ее отложить.

Я включил

 Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { //bulk of my code } }, 1000); 

Который заставил изменить структуру функции из public Bitmap в public void . Вот прямая ссылка . Несмотря на некоторые незначительные хитрости, которые мне еще нужно исправить, подход работает как шарм

Быстрая починка:-

Установите android: largeHeap = "true" в вашем файле AndroidManifest.xml.

 <application android:name="yourapplication" android:allowBackup="true" android:icon="@mipmap/ic_launcher_rounded" android:label="@string/app_name" android:largeHeap="true" android:roundIcon="@mipmap/ic_launcher_rounded" android:supportsRtl="true" android:theme="@style/AppTheme"> 

Удачи удачи 🙂