English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Métodos de captura de tela do WebView em Android

As maneiras de compartilhar a parte da web de um Hybrid App estão cada vez mais diversificadas, e as operações comuns dos usuários incluem: copiar o link da página da web, escolher automaticamente o aplicativo alvo para compartilhar diretamente, etc. Dentre elas, a ação de captura de tela está se tornando um dos métodos interativos mais enriquecedores e amados pelos usuários, que podemos ver essa função em muitos aplicativos de comunidade de conteúdo. Este artigo resume as maneiras de implementar a captura de tela do WebView em aplicativos Android.

Como um controle especial, o WebView não pode obter capturas de tela da mesma forma que outros View do sistema ou métodos de captura de tela (muitas vezes para capturar imagens longas). Por exemplo:

public static Bitmap getScreenShot(View view){
  View screenView = view.getRootView();
  screenView.setDrawingCacheEnabled(true);
  Bitmap bitmap = Bitmap.createBitmap(screenView.getDrawingCache());
  screenView.setDrawingCacheEnabled(false);
  return bitmap;
}

Se aplicar o código acima a um WebView, obterá uma captura de tela incompleta. De fato, o sistema WebView fornece APIs correspondentes para obter objetos Bitmap.

private Bitmap captureWebView(WebView webView){
 Picture picture = webView.capturePicture();
 int width = picture.getWidth();
 int height = picture.getHeight();
 if (width > 0 && height > 0) {
  Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
  Canvas canvas = new Canvas(bitmap);
  picture.draw(canvas);
  return bitmap;
 }
 return null;
}

Após obter o objeto Bitmap, utilize este código para salvá-lo na memória de armazenamento do dispositivo:

private void saveBitmap(Bitmap bitmap){
 File file = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis()) + ".jpg");
 try {
  FileOutputStream fos = new FileOutputStream(file);
  bitmap.compress(CompressFormat.JPEG, 8(0, fos);
  fos.flush();
  fos.close();
 } catch (java.io.IOException e) {
  e.printStackTrace();
 }
}

简单两步,大功告成。然而当你在 Android 5.0 及更高版本系统的设备中操作时,你会发现,截图显示并不完全。虽然图片宽高符合实际要求,但是内容只包含当前屏幕显示区域内 WebView 的内容。

原因在于,为了减少内存占用和提升性能,从 Android 5.0 开始,系统能够智能化地选择部分 Html 文档进行渲染。所以,默认情况下,我们只能截取到部分屏幕显示区域内 WebView 的内容,也就出现了上述问题。

不过,系统也提供了对应的 API 来修改这一默认优化行为。代码很简单:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
 WebView.enableSlowWholeDocumentDraw();
}

需要注意的是,这段代码必须添加在 WebView 实例被创建之前。如果使用 Activity 的话,也就是在 setContentView() 方法前面。

虽然 capturePicture() 方法已经能够获取 WebView 截图,但是到 API 19 当该方法被系统废弃掉了。取而代之的是使用 onDraw() 方法获取获取 Bitmap 对象。

private Bitmap captureWebView(WebView webView){
 float scale = webView.getScale();
 int width = webView.getWidth();
 int height = (int) (webView.getHeight()) * scale);
 Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
 Canvas canvas = new Canvas(bitmap);
 webView.draw(canvas);
 return bitmap;
}

Aqui também é necessário mencionar que o método getScale() da API 17 Agora, também é necessário mencionar que a outra maneira mais elegante de obter o valor de scale é:

webView.setWebViewClient(new WebViewClient() {
 @Override
 public void onScaleChanged(WebView view, float oldScale, float newScale){
  super.onScaleChanged(view, oldScale, newScale);
  scale = newScale;
 }
});

Por último, durante o uso real, precisamos considerar o problema de ocupação de memória do Bitmap, fazer uma captura de exceções para evitar a ocorrência de OOM.

Resumo

O que foi mencionado acima é a maneira de capturar a imagem da WebView no Android apresentada pelo editor. Esperamos que isso ajude a todos. Se você tiver alguma dúvida, por favor, deixe um comentário, o editor responderá a tempo. Agradecemos também o apoio ao tutorial de gritos!

Declaração: O conteúdo deste artigo é extraído da internet, pertencente ao respectivo detentor dos direitos autorais, o conteúdo é contribuído e carregado voluntariamente pelos usuários da internet, o site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidade por eventuais responsabilidades legais. Se você encontrar conteúdo suspeito de violação de direitos autorais, por favor, envie um e-mail para: notice#oldtoolbag.com (ao enviar e-mail, substitua # por @ para denunciar e forneça provas relevantes. Caso seja confirmado, o site deletará imediatamente o conteúdo suspeito de violação de direitos autorais.)

Você também pode gostar