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

طرق تنفيذ لـ WebView للتصوير في Android

يصبح طريقة مشاركة جزء الويب في التطبيقات المختلطة (Hybrid App) أكثر تنوعًا، والطرق الشائعة للاستخدام التي يتم استخدامها تشمل: نسخ رابط الصفحة، اختيار التطبيق المستهدف وتقاسمه تلقائيًا، وما إلى ذلك. حيث أصبح سلوك التقاط الصور يصبح أكثر وأكثر شعبية كواحدة من الطرق التي تثرى العمليات التفاعلية للمستخدمين والمحبوبة من قبل المستخدمين، ونرى هذه الوظيفة في العديد من التطبيقات المجتمعية. هذا المقال يلخص طرق تحقيق التقاط الصور لـ WebView في تطبيقات Android.

كما أنه واجهة خاصة، لا يمكن للحصول على صورة الشاشة مثل واجهات النظام الأخرى أو طرق التقاط الشاشة (غالباً التقاط الصور الطويلة). مثلًا:

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, 80, 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، فهذا يعني قبل method 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.

النهاية

ما ذكرته أعلاه هو طريقة تحقيق إلتقاط الشاشة لـ WebView في Android التي قدمها المحرر لكم، نأمل أن تكون مفيدة لكم. إذا كان لديكم أي أسئلة، فمن فضلكم ترك تعليق، وسأقوم بالرد على أسئلتكم في أقرب وقت. شكرًا جزيلاً أيضًا لدعمكم لتعليمات النفخ!

البيان: محتوى هذا المقال تم جمعه من الإنترنت، وله حقوق الملكية الأصلية للمالك، تم إدراجه من قبل المستخدمين على الإنترنت بشكل متعاوني وتحميله بشكل مستقل، هذا الموقع لا يمتلك حقوق الملكية، لم يتم تعديل المحتوى بشكل إنساني، ولا يتحمل أي مسؤولية قانونية. إذا كنت قد وجدت محتوى يشتبه في حقوق النسخ، فنرجو منك إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # ب @) للإبلاغ، وقدم الدليل على الدليل، إذا تم التحقق من ذلك، فإن هذا الموقع سيقوم بإزالة المحتوى المشبوه فورًا.

مفضل لك