소곤소곤 ad

2015년 6월 26일 금요일

webview에서 새창으로 브라우저 열기, Opening new browser from webview

Webview를 이용하여 웹페이지를 앱내부에 넣는 것은 그리 어렵지 않다. 그런데, 보다 복잡한 곳으로의 링크를 webview아닌 브라우저를 이용해서 하도록 하고 싶을 때가 있다.

또, 내 경우는 웹뷰내에 Adsense 구글광고가 들어 있는데 이용자가 이 것을 클릭했을때에 처리가 되지 않는 문제가 있어서 별도 브라우저를 구동시키는 방법이 필요했다.


 mWebView.setWebViewClient (
  new WebViewClient () {
   @Override        
   public boolean shouldOverrideUrlLoading (WebView view, String url) 
   {             
    view.loadUrl(url);             
    return true;
   }
  }
 );


shoulOverrideUrlLoading 에서 url 이 내 페이지가 아닌 경우 브라우저를 실행시키면 될거 같았는데, 안타깝게도 이 아이디어는 동작하지 않는다.

stackoverflow.com 에서 찾아낸 아이디어는, ChromeClinet를 이용해서 새로운 WebView를 만든다음에, 그 안쪽의 shoulOverrideUrlLoading 에서 브라우저를 구동시키는 것이다. 이게 무슨 복잡한 방법이냐 싶은데...  잘 돌아가니 OK!


 WebSettings webSetting = mWebView.getSettings();

 webSetting.setJavaScriptEnabled(true); 
 webSetting.setJavaScriptCanOpenWindowsAutomatically(true);
 webSetting.setSupportMultipleWindows(true);


 mWebView.setWebChromeClient(new WebChromeClient() {
         @Override 
         public boolean onCreateWindow(WebView view, boolean dialog, boolean userGesture, Message resultMsg)
         {
          // return true or false after performing the URL request
          WebView newWebView = new WebView(MyActivity.this);
                view.addView(newWebView);
                WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
                transport.setWebView(newWebView);
                resultMsg.sendToTarget();

                newWebView.setWebViewClient(new WebViewClient() {
                    @Override
                    public boolean shouldOverrideUrlLoading(WebView view, String url) {
                        Intent browserIntent = new Intent(Intent.ACTION_VIEW);
                        browserIntent.setData(Uri.parse(url));
                        startActivity(browserIntent);
                        return true;
                    }
                });          
          return true;
         }
        });

        mWebView.loadUrl ("...");

댓글 없음:

댓글 쓰기