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

AndroidのWebViewでのスクリーンショットの実現方法

Hybrid Appでは、ウェブ部分のシェア方法は多様化しています。一般的なユーザーの操作方法としては、ウェブリンクをコピーする方法や、ターゲットアプリを選択して自動的にシェアする方法などがあります。その中で、スクリーンショットの行為は、ユーザー操作を豊かにし、ユーザーに好まれるインタラクティブな方法の一つとしてますます注目されています。この機能は、多くのコンテンツコミュニティアプリで見られます。この記事では、AndroidアプリにおけるWebViewスクリーンショットの実現方法をまとめます。

WebViewは特別なコントロールであるため、他のシステムViewやスクリーンショットの方法のようにスクリーンショットを取得することはできません(長い画像を取得する場合が多いです)。例えば:

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

上記のコードをWebViewに適用すると、内容が不完整なスクリーンショットが得られます。実際には、WebViewシステム自体が対応するAPIを提供して、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;
}

Bitmapオブジェクトを取得した後、このコードを使用してそのビットマップをデバイスのストレージカードに保存できます:

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 このメソッドはシステムによって廃止されました。代わりに、Bitmap オブジェクトを取得するために onDraw() メソッドを使用します。

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

ここでまた言及するのは、getScale()メソッドはAPIから来ています。 17 最初はシステムが廃止されました。したがって、scale値を取得するもう一つのよりエレガントな方法は:

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

最後に、実際の使用において、Bitmapのメモリ使用量を考慮し、例外をキャッチして、OOMが発生しないようにすることも重要です。

まとめ

上記で紹介したのは、Android で WebView 画像をキャプチャする方法です。皆様に役立つことを願っています。何かご不明な点がございましたら、コメントを残してください。編集者は迅速に回答します。このチュートリアルのサポートに感謝します!

声明:この記事の内容はインターネットから収集され、著作権者に帰属します。インターネットユーザーによって自発的に貢献し、自己でアップロードされた内容であり、このサイトは所有権を持ちません。また、人工的な編集は行われていません。著作権侵害が疑われる場合は、以下のメールアドレスまでご連絡ください:notice#oldtoolbag.com(メールを送信する際には、#を@に置き換えてください。報告を行い、関連する証拠を提供してください。一旦確認がとれましたら、このサイトは即座に侵害される内容を削除します。)

基礎教程
おすすめ