Webview de Android: detecta cuándo finaliza la renderización

Quiero fotografiar el WebView después de cargar el WebView. Sin embargo, el bitmap devuelto siempre es nulo porque el render no se ha cargado completo aunque uso onPageFinished . Busco en Internet y la gente sugiere usar WebView.PictureListener , pero esta función está obsoleta en API 12 .

Algunos códigos

 public class MainActivity extends Activity { private WebView mButterflyWebView; /** * Gets html content from the assets folder. */ private String getHtmlFromAsset() { InputStream is; StringBuilder builder = new StringBuilder(); String htmlString = null; try { is = getAssets().open(getString(R.string.butterfly_html)); if (is != null) { BufferedReader reader = new BufferedReader( new InputStreamReader(is)); String line; while ((line = reader.readLine()) != null) { builder.append(line); } htmlString = builder.toString(); } } catch (IOException e) { e.printStackTrace(); } return htmlString; } /** * Initializes views, controls... */ private void init() { mButterflyWebView = (WebView) findViewById(R.id.butterfly_webview); mButterflyWebView.setWebChromeClient(new WebChromeClient() { public void onProgressChanged(WebView view, int newProgress) { if (newProgress == 100){ if (capturePictureWebView() != null){ saveBitmapToFile(capturePictureWebView()); } } } }); } /** * Loads html page with the content. */ private void loadHtmlPage() { String htmlString = getHtmlFromAsset(); if (htmlString != null) mButterflyWebView.loadDataWithBaseURL( "file:///android_asset/images/", htmlString, "text/html", "UTF-8", null); else Toast.makeText(this, R.string.no_such_page, Toast.LENGTH_LONG) .show(); } /** * Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); init(); loadHtmlPage(); } private Bitmap capturePictureWebView() { mButterflyWebView.measure(MeasureSpec.makeMeasureSpec( MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); mButterflyWebView.layout(0, 0, mButterflyWebView.getMeasuredWidth(), mButterflyWebView.getMeasuredHeight()); mButterflyWebView.setDrawingCacheEnabled(true); mButterflyWebView.buildDrawingCache(); if (mButterflyWebView.getMeasuredWidth() == 0 || mButterflyWebView.getMeasuredHeight() == 0){ return null; } Bitmap bm = Bitmap.createBitmap(720, 1280, Bitmap.Config.ARGB_8888); System.out.println("width=" + mButterflyWebView.getMeasuredWidth()); System.out.println("height=" + mButterflyWebView.getMeasuredHeight()); Canvas bigcanvas = new Canvas(bm); // bigcanvas.scale(720/mButterflyWebView.getMeasuredWidth(), 1280/mButterflyWebView.getMeasuredHeight()); Paint paint = new Paint(); int iHeight = bm.getHeight(); bigcanvas.drawBitmap(bm, 0, iHeight, paint); mButterflyWebView.draw(bigcanvas); return bm; } private void saveBitmapToFile(Bitmap bitmap) { try { FileOutputStream out = new FileOutputStream("/storage/sdcard0/a.png"); bitmap.compress(Bitmap.CompressFormat.PNG, 90, out); out.close(); } catch (Exception e) { e.printStackTrace(); } } } 

Usted debe tratar de usar un WebChromeClient e implementar onProgressChanged :

http://developer.android.com/reference/android/webkit/WebChromeClient.html#onProgressChanged(android.webkit.WebView , int)

 mButterflyWebView.setWebChromeClient(new WebChromeClient() { @Override public void onProgressChanged(WebView view, int progress) { if (progress == 100) { // do screenshot } } }); 

EDIT : para comprobar si onPageStarted se carga más de una vez:

 mButterflyWebView.setWebViewClient(new WebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { Log.d("WebView", "onPageStarted " + url); } @Override public void onPageFinished(WebView view, String url) { Log.d("WebView", "onPageFinished " + url); } }); 

Puedes hacerlo así, en tu WebView:

 @Override public void invalidate() { super.invalidate(); if (getContentHeight() > 0) { // WebView has displayed some content and is scrollable. } } 

Gracias a: https://stackoverflow.com/a/14678910/1310343

Finalmente conseguí el muy detallado para este problema. Esto explica por qué siempre devuelve bitmap nulo.

Cada cambio en mi aplicación es activado por una acción del usuario, así que me ocurrió una versión modificada que sólo activa invalidate () después de un touchEvent

Gracias por toda su ayuda.

WebView de Android se muestra en blanco / blanco, la vista no se actualiza en los cambios de css o cambios de HTML, las animaciones son intermitentes

 private class CfdWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Log.v(TAG, "shouldOverrideUrlLoading: " + url);; return true; } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); Log.v(TAG, "onPageFinished: " + url); // do something } } 
  • WebView no cambia de tamaño
  • Bloqueo de aplicación al hacer clic en el cuadro de selección en la vista web
  • Trabajar con archivos ePub en android
  • Cómo recuperar el contenido HTML de WebView (como una cadena)
  • Vista web de Android: lee las cookies
  • Conflicto de la información de ubicación GPS en las aplicaciones de Android
  • ¿Cómo puede Android escribir un valor en HTML5 localstorage?
  • ¿Cómo puedo utilizar los efectos de transición de Android en la vista web?
  • Cómo mostrar barras de desplazamiento en WebView de Android
  • No se puede cargar el archivo HTML local en Android WebView
  • Cómo WebView.getTitle () de un hilo de interfaz de usuario?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.