\ [안드로이드]webview new tab/새 창 으로 열기 :: Something New
728x90
반응형

웹뷰에서는 브라우저와 다르게 newtab으로 페이지를 열경우 oncreate외에 코드를 추가해 주어야한다.

webChromeClient를 이용해서 새로운 창을 여는 웹뷰설정과 그안에서의 다운로드 처리도 별도로 진행된다.

 

public class MyWebChromeClient extends WebChromeClient {
 //신규탭으로 열었을때
        @Override
        public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
            WebView newWebView = new WebView(view.getContext());
            WebSettings settings = newWebView.getSettings();
            //ウェブページのjavascript使用許可
            settings.setJavaScriptEnabled(true);
            //新しくタブを使用許可
            settings.setSupportMultipleWindows(true);
            //画面zoom許可
            settings.setSupportZoom(true);
            //画面拡大縮小許可
            settings.setBuiltInZoomControls(true);
            //拡大ショートカット許可しない
            settings.setDisplayZoomControls(false);
            //GPS許可
            settings.setGeolocationEnabled(true);
            //DBアクセス許可
            settings.setDatabaseEnabled(true);
            //フォームデータを保存しない
            settings.setSaveFormData(false);
            final Dialog dialog = new Dialog(view.getContext(), R.style.Theme_DialogPage);
            dialog.setContentView(newWebView);

            //다운로드처리
            newWebView.setDownloadListener(new DownloadListener() {

                @Override
                public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimeType, long contentLength) {
                    try {
                        String mFileName;
                        DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
                        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));

                        request.setMimeType(mimeType);
                        String cookies = CookieManager.getInstance().getCookie(url);

                        request.addRequestHeader("cookie", cookies);
                        request.addRequestHeader("User-Agent", userAgent);
                        request.addRequestHeader("Referer", getReferrer().getAuthority());
                        request.addRequestHeader("Content-Disposition", contentDisposition);
                        request.setDescription("Downloading file...");
                        String content = contentDisposition;
                        //アンドロイド側で読み込めるようにファイル名を編集
                        mFileName = content.replace("attachment; filename=", "").trim();
                        //WEBでエンコードされたファイル名をDecodeする
                        mFileName = URLDecoder.decode(mFileName, String.valueOf(UTF_8));
                        request.setTitle(mFileName);
                        //このダウンロードの実行中または完了時に、ダウンロード マネージャーによってシステム通知が投稿されるかどうかを制御します。
                        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                        //다운로드폴더설정 path=\내부스토리지\Android\data\어플이름\cache
                        request.setDestinationUri(Uri.fromFile(new File(getExternalCacheDir().getAbsolutePath(), mFileName)));
                        //このダウンロードを実行できるネットワークの種類を制限します。
                        request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI);
                        //ダウンロード マネージャーがダウンロードを実行する準備ができ、接続が利用可能になると、ダウンロードは自動的に開始されます。
                        dm.enqueue(request);

                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
            newWebView.clearCache(true);
            dialog.show();
            //뒤로가기 키 설정
            dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
                @Override
                public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
                    if (keyCode == KeyEvent.KEYCODE_BACK) {
                        //다이얼로그 닫기
                        dialog.dismiss();
                    }
                    return true;
                }
            });

            newWebView.setWebViewClient(new MyWebViewClient());
            newWebView.setWebChromeClient(new MyWebChromeClient());

            //スレッド境界を越えて WebView を返すためのトランスポート オブジェクト。
            WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
            transport.setWebView(newWebView);
            resultMsg.sendToTarget();
            return true;
        }
        
  }
728x90

+ Recent posts