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

Méthodes d'implémentation de la capture d'écran de WebView dans Android

Dans les applications Hybrid App, les modes de partage de la partie page Web deviennent de plus en plus diversifiés, et les modes d'opération courants des utilisateurs incluent : copier le lien de la page Web, choisir directement l'application cible pour partager automatiquement, etc. Parmi eux, le comportement de capture d'écran devient de plus en plus une manière riche des opérations utilisateur et une interaction appréciée par les utilisateurs, que nous pouvons voir dans de nombreuses applications de communauté de contenu. Cet article résume les méthodes d'implémentation de la capture d'écran WebView dans les applications Android.

WebView, en tant que contrôle spécial, ne peut pas obtenir de capture d'écran comme d'autres View système ou des méthodes de capture d'écran (généralement pour capturer des images longues). Par exemple :

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

Si vous utilisez ce code sur un WebView, vous obtiendrez une capture d'écran incomplète. En réalité, le système WebView fournit lui-même des API pour obtenir des objets 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;
}

Après avoir obtenu l'objet Bitmap, vous pouvez utiliser ce code pour l'enregistrer sur la carte de stockage de l'appareil :

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;
}

Encore une fois, il faut mentionner que la méthode getScale() est disponible dans l'API 17 La méthode de récupération de la valeur de scale a été abandonnée par le système. Donc, une autre manière plus élégante de récupérer la valeur de scale est :

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

Enfin, dans le processus d'utilisation pratique, nous devons également prendre en compte la question de l'utilisation de la mémoire par Bitmap, bien gérer les exceptions pour éviter l'apparition d'OOM.

Résumé

Ce que j'ai mentionné ci-dessus est la manière d'effectuer la capture d'écran WebView dans Android que j'ai présentée aux éditeurs. J'espère que cela pourra vous aider. Si vous avez des questions, laissez un message, je vous répondrai à temps. Je tiens également à remercier vivement le soutien de呐喊教程 !

Déclaration : Le contenu de cet article est tiré d'Internet, propriété des auteurs respectifs, le contenu est contribué et téléchargé par les utilisateurs d'Internet, ce site n'a pas de propriété, n'a pas été édité par l'homme, ni n'assume la responsabilité des responsabilités juridiques pertinentes. Si vous trouvez du contenu suspect de violation de droits d'auteur, veuillez envoyer un e-mail à : notice#oldtoolbag.com (veuillez remplacer # par @ lors de l'envoi d'un e-mail pour signaler une violation, et fournir des preuves pertinentes. Une fois vérifié, ce site supprimera immédiatement le contenu suspect de violation de droits d'auteur.)

Vous pourriez aussi aimer