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

Android에서 WebView 캡처의 구현 방법

Hybrid App에서 웹 부분의 공유 방식은 점점 다양화되고 있습니다. 가장 일반적인 사용자操作 방식으로는 웹 페이지 링크를 복사하는 방식, 목표 애플리케이션을 선택하여 자동으로 공유하는 방식 등이 있습니다. 그 중, 스크린샷 행동은 사용자 operation을 풍부하게 하고 사용자에게 사랑받는 인터랙티브 방식 중 하나로 자리잡고 있습니다. 이러한 기능은 많은 콘텐츠 커뮤니티 애플리케이션에서 볼 수 있습니다. 이 기사는 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에 적용하면 내용이 불complete한 스크린샷을 얻게 됩니다. 실제로, WebView 시스템 자체는 Bitmap 객체를 얻기 위한对应的 API를 제공합니다.

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 50 및 이상 버전의 시스템 장치에서 작업할 때, 캡처 이미지는 완전하지 않게 보일 수 있습니다. 그래서, 이미지의 너비와 높이는 실제 요구 사항에 맞지만, 내용은 현재 화면 영역 내 WebView의 내용만 포함됩니다.

이유는 Android 50.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;
}

이를 다시 말해서, 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#w로 이메일을 보내 주시기 바랍니다.3codebox.com에 이메일을 보내면(#을 @으로 변경해 주세요) 신고하시고 관련 증거를 제공하시면, 확인되면 즉시 저작권 침해 내용을 삭제하겠습니다.

추천 합니다