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

Metodi di realizzazione dello screenshot di WebView in Android

Nei Hybrid App, i modi di condivisione della parte web stanno diventando sempre più diversificati, tra cui le operazioni comuni degli utenti sono: copia del link web, selezione diretta dell'applicazione target per condivisione automatica, ecc. Tra questi, l'azione di screenshot sta diventando sempre più un modo interattivo apprezzato dagli utenti per arricchire le operazioni degli utenti. Questo articolo riassume i modi di implementazione del screenshot di WebView in applicazioni Android.

WebView, essendo un componente speciale, non può essere utilizzato come altri componenti View del sistema o metodi di screenshot per ottenere screenshot (spesso per catturare immagini lunghe). Ad esempio:

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 applichi il codice sopra a un WebView, otterrai una schermata che non contiene tutto il contenuto. Tuttavia, il sistema WebView stesso fornisce API per ottenere l'oggetto 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;
}

Dopo aver ricevuto l'oggetto Bitmap, è possibile utilizzarlo per salvare l'immagine sulla scheda di archiviazione del dispositivo con il seguente codice:

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

Due passaggi semplici e il lavoro è fatto. Tuttavia, quando si opera sui dispositivi con sistema Android 5.0 o superiore, si noterà che lo screenshot non è completo. Anche se le dimensioni dell'immagine corrispondono ai requisiti effettivi, il contenuto include solo il contenuto del WebView visualizzato nella schermata corrente.

Il motivo è che, per ridurre l'uso della memoria e migliorare le prestazioni, a partire da Android 5.0, il sistema può scegliere intelligentemente solo parte dei documenti Html per la rendering. Pertanto, di default, possiamo catturare solo parte del contenuto del WebView visualizzato nella schermata, il che ha portato al problema menzionato sopra.

Tuttavia, il sistema fornisce anche l'API corrispondente per modificare questo comportamento di ottimizzazione predefinito. Il codice è molto semplice:

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

Deve essere notato che questo codice deve essere aggiunto prima della creazione dell'istanza WebView. Se si utilizza Activity, è prima del metodo setContentView().

Anche se il metodo capturePicture() è in grado di ottenere lo screenshot del WebView, ma a partire dall'API 19 il metodo è stato dismesso dal sistema. Invece, è possibile ottenere l'oggetto Bitmap utilizzando il metodo 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;
}

Ancora una volta, devo menzionare che il metodo getScale() è stato dismesso dal sistema a partire dall'API 17. Pertanto, un altro modo più elegante per ottenere il valore di scale è:

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

Ultimo punto, durante l'uso pratico, dobbiamo anche considerare il problema di utilizzo della memoria di Bitmap, fare una buona cattura delle eccezioni per prevenire la comparsa di OOM.

Sommario

Il metodo di realizzazione dello screenshot di WebView in Android descritto sopra è stato presentato dall'autore. Spero che sia utile a tutti. Se avete qualsiasi domanda, lasciate un messaggio e l'autore risponderà tempestivamente. In questo senso, ringrazio anche tutti i sostenitori del manuale urla!

Dichiarazione: il contenuto di questo articolo è stato prelevato da Internet, il copyright è di proprietà del rispettivo proprietario, il contenuto è stato caricato autonomamente dagli utenti di Internet, il sito web non possiede il diritto di proprietà, non è stato elaborato manualmente e non assume alcuna responsabilità legale. Se trovi contenuti sospetti di violazione del copyright, ti preghiamo di inviare un'e-mail a notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare il problema e fornire prove pertinenti. Una volta verificata, il sito web rimuoverà immediatamente il contenuto sospetto di violazione del copyright.

Ti potrebbe interessare