본문 바로가기

구글과인터넷/안드로이드

안드로이드|Android WebViewClient 사용하기

출처: http://blog.naver.com/jolangma?Redirect=Log&logNo=150106605897

WebView webView = (WebView) findViewById(R.id.webview);

webView.getSettings().setJavaScriptEnabled(true);

// 각종 알림 및 요청을 받게되는 WebViewClient를 설정합니다. - option

webView.setWebViewClient(new CustomWebViewClient());

// 크롬 핸들러 설정. 이 핸들러는 자바 스크립트 대화 상자, favicon, 제목과 진행상황 처리에 
// 사용하기 위해 WebChromeClient을 구현한 것입니다. - option
webView.setWebChromeClient(new CustomWebChormeClient());

webView.loadUrl("...");


private class CustomWebViewClient extends WebViewClient {


    /** ↓↓ WebView에서 처음 한 번만 호출되는 메쏘드 ↓↓

     * 페이지 로딩이 시작된 것을 알립니다. 이 메쏘드가 각각의 main frame이 iframe에 

     * 페이지를 로드하기 위해 한번 호출되거나  frameset이 main frame에 대해 이 메쏘드를 

     * 한번 호출할 것 입니다. 이 메쏘드가 임베디드 프레임 내용이 변경되었을 때 호출되지

     * 않는다는 것도 뜻합니다. 예를 들면, iframe이 있는 대상 링크를 클릭한 것 입니다.

     * /

    @Override

    public void onPageStarted(WebView view, String url, Bitmap favicon) {

        super.onPageStarted(view, url, favicon);

    }

  

    /**
     WebView가 주어진 URL로 지정된 리소스를 로드할 것이라고 알립니다.

     * 페이지 로딩이 완료될 때까지 여러번 호출됩니다. 페이지가 나뉘어서 로딩되나 봅니다.

     * /

    @Override

    public void onLoadResource(WebView view, String url) {

        super.onLoadResource(view, url);

    }

  

    /**

     * 방문한 링크를 데이터베이스에 업데이트한다고 알립니다.

     * /

    @Override

    public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) {

        Log.i("WebView", "History: " + url );

        super.doUpdateVisitedHistory(view, url, isReload);

    }

/* 결과 (url이 변할 때 마다)

History: http://www.abc.com/djfk...

History: http://www.abc.com/djfk.../fdfd

*/

  

    /** ↓↓ WebView에서 처음 한 번만 호출되는 메쏘드 ↓↓
     * 페이지 로딩이 완료된 것을 알립니다. 이 메쏘드는 메인 프레임에 대해서만 호출됩니다.

     * 이 메쏘드가 호출되었을 때, picture rendering은 아직 업데이트되지 않을 수 있습니다.

     * 새로운 Picture가 있다는 사실을 알기위해, onNewPicture(WebView, Picture) 메쏘드를

     * 사용합니다.

     * /

    @Override

    public void onPageFinished(WebView view, String url) {

        super.onPageFinished(view, url);

    }

  

    /**

     * As the host application if the browser should resend data as the requested page

     * was a result of a POST. 기본적으론 데이터를 재발송하지 않는 것입니다.

     * /

    @Override

    public void onFormResubmission(WebView view, Message dontResend,

            Message resend) {

        super.onFormResubmission(view, dontResend, resend);

    }

  

    /**

     * 호스트 응용 프로그램에게 오류를 보고합니다. 이러한 오류는 복구할 수 없습니다.

     * (예, main resource를 사용할 수 없는 상태) errorCode 매개 변수

     * WebViewClient.ERROR_* 상수 중 하나에 해당합니다.

     * /

    @Override

    public void onReceivedError(WebView view, int errorCode,

            String description, String failingUrl) {

        super.onReceivedError(view, errorCode, description, failingUrl);

 

        switch(errorCode) {
        case ERROR_AUTHENTICATION: break;               // 서버에서 사용자 인증 실패
        case ERROR_BAD_URL: break;                           // 잘못된 URL
        case ERROR_CONNECT: break;                          // 서버로 연결 실패
        case ERROR_FAILED_SSL_HANDSHAKE: break;    // SSL handshake 수행 실패
        case ERROR_FILE: break;                                  // 일반 파일 오류
        case ERROR_FILE_NOT_FOUND: break;               // 파일을 찾을 수 없습니다
        case ERROR_HOST_LOOKUP: break;           // 서버 또는 프록시 호스트 이름 조회 실패
        case ERROR_IO: break;                              // 서버에서 읽거나 서버로 쓰기 실패
        case ERROR_PROXY_AUTHENTICATION: break;   // 프록시에서 사용자 인증 실패
        case ERROR_REDIRECT_LOOP: break;               // 너무 많은 리디렉션
        case ERROR_TIMEOUT: break;                          // 연결 시간 초과
        case ERROR_TOO_MANY_REQUESTS: break;     // 페이지 로드중 너무 많은 요청 발생
        case ERROR_UNKNOWN: break;                        // 일반 오류
        case ERROR_UNSUPPORTED_AUTH_SCHEME: break; // 지원되지 않는 인증 체계
        case ERROR_UNSUPPORTED_SCHEME: break;          // URI가 지원되지 않는 방식
        }

    }

  

    /**

     * 인증 요청을 처리한다고 알립니다. 기본 동작은 요청을 취소하는 것입니다.

     * /

    @Override

    public void onReceivedHttpAuthRequest(WebView view,

            HttpAuthHandler handler, String host, String realm) {

        super.onReceivedHttpAuthRequest(view, handler, host, realm);

    }

  

    /**

     * WebView가 변화하기위해 scale이 적용된다고 알립니다.

     * /

    @Override

    public void onScaleChanged(WebView view, float oldScale, float newScale) {

        super.onScaleChanged(view, oldScale, newScale);

    }


    /**

     * 이 메쏘드는 사용이 중지되었습니다. 이 메쏘드는 더이상 호출되지 않습니다.

     * WebView가 재시작된 루프를 발견하면, 로드가 취소됩니다

     * /

    @Override

    public void onTooManyRedirects(WebView view, Message cancelMsg,

            Message continueMsg) {

        super.onTooManyRedirects(view, cancelMsg, continueMsg);

    }


    /** ↓↓ 잘못된 키 입력이 있을 경우 호출되는 메쏘드 

     * 키가 WebView에 의해 처리되지 않았음을 호스트 응용 프로그램에게 알림.

     * 시스템 키를 제외하고, WebView는 shouldOverrideKeyEvent가 true를 반환하는 경우나

     * 일반적인 flow에서 항상 키 이벤트를 처리합니다. 키 이벤트가 발생된 곳으로 부터

     * 비동기적으로 호출됩니다. 호스트 응용 프로그램에게 처리되지 않은 키 이벤트를 처리할

     * 기회를 제공합니다.

     * /

   @Override

   public void onUnhandledKeyEvent(WebView view, KeyEvent event) {

      super.onUnhandledKeyEvent(view, event);

   }

  

    /** ↓↓ 잘못된 키 입력이 있을 경우 호출되는 메쏘드 ↓↓

     * 호스트 응용 프로그램에게 동기적으로 키 이벤트를 처리할 기회를 줍니다. 예: 메뉴 바로

     * 가기 키 이벤트를 이런식으로 필터링해야합니다. true를 반환할 경우, WebView는 키 이벤트를

     * 처리하지 않습니다. false를 반환할 경우, WebView 항상 키 이벤트를 처리합니다. So none

     * of the super in the view chain will see the key event. 기본 동작은 false를 반환합니다.

     * /

    @Override

    public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {

        return super.shouldOverrideKeyEvent(view, event);

    }

  

    /**

     * 새로운 URL이 현재 WebView에 로드되려고 할 때 호스트 응용 프로그램에게 컨트롤을

     * 대신할 기회를 줍니다. WebViewClient가 제공되지 않으면, 기본적으로 WebView는 URL에

     * 대한 적절한 핸들러를 선택하려고 Activity Manager에게 물어봅니다. WebViewClient가

     * 제공되면, 호스트 응용 프로그램이 URL을 처리한다는 의미인 true를 반환거나 현재

     * WebView가 URL을 처리한다는 의미인 false를 반환합니다.

     * /

    public boolean shouldOverrideUrlLoading(WebView view, String url) {

        return super.shouldOverrideUrlLoading(view, url);

    }

}


///////////////////////////////////////////////////////////////////////////



출처: http://blog.naver.com/jolangma?Redirect=Log&logNo=150106605897


WebView webView = (WebView) findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true);

// 각종 알림 및 요청을 받게되는 WebViewClient를 설정합니다. - option

webView.setWebViewClient(new CustomWebViewClient());

// 크롬 핸들러 설정. 이 핸들러는 자바 스크립트 대화 상자, favicon, 제목과 진행상황 처리에 
// 사용하기 위해 WebChromeClient을 구현한 것입니다. - option
webView.setWebChromeClient(new CustomWebChormeClient());
webView.loadUrl(url);

private class CustomWebChormeClient extends WebChromeClient {

    /**
     * 페이지를 로딩하는 현재 진행 상황을 전해줍니다.
     * newProgress  현재 페이지 로딩 진행 상황, 0과 100 사이의 정수로 표현.(0% ~ 100%)
     */
    @Override
    public void onProgressChanged(WebView view, int newProgress) {
        Log.i("WebView", "Progress: " + String.valueOf(newProgress)); 
        super.onProgressChanged(view, newProgress);
    }
/* 결과 : 
Progress: 10
Progress: 15
Progress: 35
...
Progress: 76
Progress: 100
*/

    /**
     * 현재 페이지에 새로운 favicon이 있다고 알립니다.
     * icon 현재 페이지의 favicon이 들어있는 비트맵  
     */
    @Override
    public void onReceivedIcon(WebView view, Bitmap icon) {
        super.onReceivedIcon(view, icon);
    }

/* 
favicon이란:
일반적으로 웹 브라우저의 URL이 표시되기 전에 특정 웹사이트와 관련된 16 × 16 픽셀 아이콘 
*/






    /**
     * 문서 제목에 변경이 있다고 알립니다.
     * title  문서의 새로운 타이틀이 들어있는 문자열  
     */
    @Override
    public void onReceivedTitle(WebView view, String title) {
        super.onReceivedTitle(view, title);
    }
/*  아래처럼 title 태그 사이의 값을 가져옵니다.
<title> LG텔레콤 전자결제 서비스 </title>
*/

    @Override
    public Bitmap getDefaultVideoPoster() {
        return super.getDefaultVideoPoster();
    }

    @Override
    public View getVideoLoadingProgressView() {
        return super.getVideoLoadingProgressView();
    }

    @Override
    public void getVisitedHistory(ValueCallback<String[]> callback) {
        super.getVisitedHistory(callback);
    }

    @Override
    public void onCloseWindow(WebView window) {
         super.onCloseWindow(window);
    }

    @Override
    public void onConsoleMessage(String message, int lineNumber, String sourceID) {
        super.onConsoleMessage(message, lineNumber, sourceID);
    }

    @Override
    public boolean onCreateWindow(WebView view, boolean dialog,
            boolean userGesture, Message resultMsg) {
         return super.onCreateWindow(view, dialog, userGesture, resultMsg);
    }

    @Override
    public void onExceededDatabaseQuota(String url, String databaseIdentifier, 
            long currentQuota, long estimatedSize, long totalUsedQuota,
            QuotaUpdater quotaUpdater) {
        super.onExceededDatabaseQuota(url, databaseIdentifier, currentQuota,
                estimatedSize, totalUsedQuota, quotaUpdater);
    }

    @Override
    public void onGeolocationPermissionsHidePrompt() {
         super.onGeolocationPermissionsHidePrompt();
    }

    @Override
    public void onGeolocationPermissionsShowPrompt(String origin,
            Callback callback) {
         super.onGeolocationPermissionsShowPrompt(origin, callback);
    }

    @Override
    public void onHideCustomView() {
        super.onHideCustomView();
    }
 
    /**
     * 자바 스크립트 경고 대화 상자를 디스플레이한다고 클라이언트에게 알려줍니다. 
     * 클라이언트가 true를 반환할 경우, WebView는 클라이언트가 대화 상자를 처리할 수 있다고
     * 여깁니다. 클라이언트가 false를 반환할 경우, WebView는 실행을 계속합니다.
     * /
    @Override
    public boolean onJsAlert(WebView view, String url, String message,
            JsResult result) {
         return super.onJsAlert(view, url, message, result);
    }
 
    /**
     * 
현재 페이지에서 나와 탐색을 확정하는 대화 상자를 디스플레이한다고 클라이언트에게
     * 알려줍니다. 이것은 자바 스크립트 이벤트 onbeforeunload()의 결과입니다. 클라이언트가
     * true를 반환하는 경우, WebView는 클라이언트가 대화 상자를 처리하고 적절한 JsResult
     * 메쏘드를 호출할 것이라고 여깁니다. 클라이언트가 false를 반환하는 경우, true의 기본값은
     * 현재 페이지에서 나와 탐색하기를 수락하기 위한 자바 스크립트를 반환하게 될 것입니다.
     * 기본 동작은 false를 반환하는 것입니다. JsResult를 true로 설정한 것은 현재 페이지에서 나와
     탐색할 것이고 false로 설정한 것은 탐색을 취소할 것입니다.
     * /
    @Override
    public boolean onJsBeforeUnload(WebView view, String url,
            String message, JsResult result) {
        return super.onJsBeforeUnload(view, url, message, result);
    }
 
    /**
     * 
사용자에게 확인 대화 상자를 디스플레이한다고 클라이언트에게 알려줍니다. 클라이언트가
     * true를 반환하는 경우, WebView는 클라이언트가 확인 대화 상자를 처리하고 적절한
     * JsResult 메쏘드를 호출할 수 있다고 여깁니다. 클라이언트가 false를 반환하는 경우 false의
     * 기본값은 자바 스크립트로 반환될 것 입니다. 기본 동작은 false를 반환하는 것입니다.
     * /
    @Override
    public boolean onJsConfirm(WebView view, String url, String message,
            JsResult result) {
         return super.onJsConfirm(view, url, message, result);
    }
 
    /**
     * 
사용자에게 프롬프트 대화 상자를 디스플레이한다고 클라이언트에게 알려줍니다.
     * 클라이언트가 true를 반환하는 경우, WebView는 클라이언트가 확인 대화 상자를 처리하고
     * 적절한 JsResult 메쏘드를 호출할 수 있다고 여깁니다. 클라이언트가 false를 반환하는 경우
     * false의 기본값은 자바 스크립트로 반환될 것 입니다. 기본 동작은 false를 반환하는 것입니다.
     * /
    @Override
    public boolean onJsPrompt(WebView view, String url, String message,
            String defaultValue, JsPromptResult result) {
          return super.onJsPrompt(view, url, message, defaultValue, result);
    }
 
    /**
     * 자바 스크립트 실행 제한 시간을 초과했다고 클라이언트에게 알려줍니다. 그리고
     * 클라이언트가 실행을 중단할지 여부를 결정할 수 있습니다. 클라이언트가 true를 반환하는
     * 경우, 자바 스크립트가 중단됩니다. 클라이언트가 false를 반환하는 경우, 계속 실행됩니다.
     * 참고로 지속적인 실행 상태에서는 제한 시간 카운터가 재설정되고  스크립트가 다음 체크
     * 포인트에서 완료되지 않을 경우 계속 콜백되어질 것집니다.
     * /
    @Override
    public boolean onJsTimeout() {
        return super.onJsTimeout();
    }

   

    @Override
    public void onReachedMaxAppCacheSize(long spaceNeeded,
            long totalUsedQuota, QuotaUpdater quotaUpdater) {
        super.onReachedMaxAppCacheSize(spaceNeeded, totalUsedQuota, quotaUpdater);
    }

    

    @Override
    public void onReceivedTouchIconUrl(WebView view, String url,
            boolean precomposed) {
        super.onReceivedTouchIconUrl(view, url, precomposed);
    }

    @Override
    public void onRequestFocus(WebView view) {
        super.onRequestFocus(view);
    }

    @Override
    public void onShowCustomView(View view, CustomViewCallback callback) {
        super.onShowCustomView(view, callback);
    }