2014-01-06 5 views
18

Ich habe eine Frage. Zu diesem Zeitpunkt ist capturePicture von WebView veraltet.Welche capturePicture Funktion ersetzen kann

Ich möchte fragen, ob es eine Möglichkeit gibt, die Funktion zu ersetzen. Ich meinte, es kann Capture gesamte von dem Webansicht (nicht nur die Ansicht angezeigt wird)

Dank

+1

Für die Anwendungen API-Ebene Targeting 21 (Lollipop) und a bove, siehe auch diese Frage: http://stackoverflow.com/questions/30078157/webview-draw-not-properly-working-on-latest-android-system-webview-update –

Antwort

20

Ich fand schließlich die Lösung aus.

Einige Codes

public class WebViewActivity extends Activity { 

    private static WebView webView; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.webview); 

     webView = (WebView) findViewById(R.id.webView1); 
     webView.loadUrl("http://developer.android.com/reference/packages.html"); 
//  webView.loadUrl("http://developer.android.com/training/basics/firstapp/creating-project.html"); 

     webView.setWebViewClient(new WebViewClient() { 

      public void onPageFinished(WebView view, String url) { 
       // do your stuff here 
       webView.measure(MeasureSpec.makeMeasureSpec(
         MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED), 
         MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 
       webView.layout(0, 0, webView.getMeasuredWidth(), 
         webView.getMeasuredHeight()); 
       webView.setDrawingCacheEnabled(true); 
       webView.buildDrawingCache(); 
       Bitmap bm = Bitmap.createBitmap(webView.getMeasuredWidth(), 
         webView.getMeasuredHeight(), Bitmap.Config.ARGB_8888); 

       Canvas bigcanvas = new Canvas(bm); 
       Paint paint = new Paint(); 
       int iHeight = bm.getHeight(); 
       bigcanvas.drawBitmap(bm, 0, iHeight, paint); 
       webView.draw(bigcanvas); 
       System.out.println("1111111111111111111111=" 
         + bigcanvas.getWidth()); 
       System.out.println("22222222222222222222222=" 
         + bigcanvas.getHeight()); 

       if (bm != null) { 
        try { 
         String path = Environment.getExternalStorageDirectory() 
           .toString(); 
         OutputStream fOut = null; 
         File file = new File(path, "/aaaa.png"); 
         fOut = new FileOutputStream(file); 

         bm.compress(Bitmap.CompressFormat.PNG, 50, fOut); 
         fOut.flush(); 
         fOut.close(); 
         bm.recycle(); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     }); 
    } 
} 

Die layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<WebView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/webView1" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
/> 
+2

Fehler erhalten java.lang.IllegalArgumentException: Breite und Höhe müssen> 0 sein bitte helfen Sie mir –

+0

@YogeshLakhotia: Stellen Sie sicher, dass das Webview vollständig geladen wird, bevor Sie Höhe oder Breite erhalten. Ich habe AsyncTask verwendet. Ich weiß nicht warum, aber onPageFinished kann ausgeführt werden, bevor Ihre Webansicht vollständig geladen ist. Ich habe das gleiche Problem. Ich sehe Ihren Code nicht, also schlage ich Ihnen nur einige Fälle vor. – lolyoshi

+0

mein Problem ist gelöst ... Ich habe den Code beantwortet. –

15

Verwendung draw() Methode der WebView

Beispiel:

ImageView imageview; 
WebView webview; 
class Background extends AsyncTask<Void, Void, Bitmap> 
{ 
    @Override 
    protected Bitmap doInBackground(Void... params) 
    { 
     try 
     { 
      Thread.sleep(2000); 
      Bitmap bitmap = Bitmap.createBitmap(webview.getWidth(), webview.getHeight(), Config.ARGB_8888); 
      Canvas canvas = new Canvas(bitmap); 
      webview.draw(canvas); 
      return bitmap; 
     } 
     catch (InterruptedException e){} 
     catch (Exception e){} 
     return null; 
    } 
    @Override 
    protected void onPostExecute(Bitmap result) 
    { 
     imageview.setImageBitmap(result); 
    } 
} 


webview.setWebChromeClient(new WebChromeClient() 
{ 
    public void onProgressChanged(WebView view, int progress) 
    { 
     if(progress==100) 
      new Background().execute(); 
    } 
}); 
+1

arbeitete auf 7-8 Möglichkeiten, aber nur diese Methode arbeitete an meinem Fall :) – userAndroid

Verwandte Themen