본문 바로가기

android

Webpage 스크린 캡쳐해 Bmp로 저장하기


  

WebView에서 스크린을 캡쳐하여 둥근 모서리 사각형을 만들어 각 site의 아이콘으로 사용하였다


......

webView.setWebViewClient(new MyWebViewClient());

webView.setWebChromeClient(new MyWebChromeClient());

.....
/*webViewClient 에 onPageFinished 이벤트가 있지만 테스트해 본 결과 웹페이지가
   완전히 로드되지 않았는데도 이벤트가 발생한다.  그래서 아래와 같은 방법으로 웹페이지가
  완전히 로드되면 캡쳐를 한다.  그렇치 않으면 완전하 스크린샷을 얻을 수 없다.
*/

public class MyWebChromeClient extends WebChromeClient{
  
  @Override
  public void onProgressChanged(WebView view, int newProgress) {
   super.onProgressChanged(view, newProgress);
   progressbar.setProgress(newProgress);    
   
   if (newProgress == 100){          
    //screen capture
    String url = view.getUrl();        
    Uri uri = Uri.parse(url);
    String host = uri.getHost();
    String fileName =  APP_HOME + "/" + host + ".png";
    
    File f = new File(fileName);
    
    if (f.exists()) return ;
    
    Picture pic = view.capturePicture();   
    
    saveScreenshot(pic, fileName);
   }
  }  
 } 

private void saveScreenshot(final Picture pic, final String fileName){
  new Thread(new Runnable() {   
   @Override
   public void run() {
    
    Bitmap bmp = Bitmap.createBitmap(200,200, Bitmap.Config.ARGB_8888);
    Bitmap roundBmp = Bitmap.createBitmap(200,200, Bitmap.Config.ARGB_8888);
    
    Canvas canvas = new Canvas(bmp);
    pic.draw(canvas);

    Canvas rCanvas = new Canvas(roundBmp);   
       
    //for round image
    final int color = 0xff424242;
    final Paint paint = new Paint();
    final Rect rect = new Rect(0,0,200, 200);  
    final RectF rectF = new RectF(rect);
    final float roundPx = 20;
    
    paint.setAntiAlias(true);
    paint.setColor(color);
    rCanvas.drawARGB(0,0,0,0);
    rCanvas .drawRoundRect(rectF, roundPx, roundPx, paint);
    
    paint.setXfermode(new PorterDuffXfermode(android.graphics.PorterDuff.Mode.SRC_IN));
    rCanvas .drawBitmap(bmp, rect, rect, paint);
    
    try {
     FileOutputStream output = new FileOutputStream(fileName);
     
     roundBmp.compress(Bitmap.CompressFormat.PNG, 90, output);
     
     output.flush();
     output.close();
     //     Images.Media.insertImage(getContentResolver(), bmp, fileName, null);
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace(); 
    }
   }
  }).start(); 
 }