투케이2K

944. (Android/Java) [간단 소스] 안드로이드 Webview 웹뷰 window open 새창 열기 이벤트 발생 시 Alert 팝업창 표시 및 외부 링크 이동 수행 본문

Android

944. (Android/Java) [간단 소스] 안드로이드 Webview 웹뷰 window open 새창 열기 이벤트 발생 시 Alert 팝업창 표시 및 외부 링크 이동 수행

투케이2K 2025. 1. 26. 10:19

[개발 환경 설정]

개발 툴 : AndroidStudio

개발 언어 : Java / Kotlin

 

[소스 코드]

// --------------------------------------------------------------------------------------
[개발 및 테스트 환경]
// --------------------------------------------------------------------------------------

- 언어 : Java / Kotlin

- 개발 툴 : AndroidStudio

- 기술 구분 : Webview / Window Open / Alert

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[사전) 필요 설정]
// --------------------------------------------------------------------------------------

[AndroidManifest.xml 파일 필요 퍼미션]

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />


[JavaScript 의 window.open 허용]

main_webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
main_webview.getSettings().setSupportMultipleWindows(true); // [새창 띄우기 허용]

// --------------------------------------------------------------------------------------





// --------------------------------------------------------------------------------------
[소스 코드]
// --------------------------------------------------------------------------------------

// -----------------------------------------
// TODO [크롬 클라이언트 설정 실시]
// -----------------------------------------
main_webview.setWebChromeClient(new WebChromeClient() {

  // TODO [웹뷰 [window open] 새창 열기 이벤트 확인]
  @Override
  public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
      S_Log._F_(A_Webview.this, "웹뷰 [window open] 새창 열기 이벤트 발생", null);

      WebView mWebViewPop = new WebView(view.getContext());
      mWebViewPop.setWebViewClient(new WebViewClient(){
          @Override
          //public boolean shouldOverrideUrlLoading(WebView view, String url) {
          public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
              String url = request.getUrl().toString(); // [Get Web Url]

              S_Log._F_(A_Webview.this, "shouldOverrideUrlLoading :: 웹뷰 [window open] 새창 열기 주소 확인", new String[]{
                      "URL :: " + String.valueOf(url)
              });

              // [url 체크 수행 실시]
              if(url.contains("http://") || url.contains("https://")){

                  // [외부 링크 이동]
                  //C_MoveApp.goChromeBrowser(A_Webview.this, url);


                  // [Alert 팝업창 표시]
                  C_Ui_View.observableAlert(A_Webview.this, R.drawable.loading_bg, "알 림 (Window Open)", "\n" + url + " 주소 이동 이벤트가 감지 되었습니다. 외부 링크 이동 하시겠습니까?" + "\n", "이동", "취소")
                          .subscribeOn(AndroidSchedulers.mainThread()) // [Observable (생성자) 로직을 IO 스레드에서 실행 : 백그라운드]
                          .observeOn(Schedulers.io()) // [Observer (관찰자) 로직을 메인 스레드에서 실행]
                          .subscribe(new Observer<Boolean>() { // [Observable.create 타입 지정]
                              @Override
                              public void onSubscribe(@NonNull Disposable d) {
                              }
                              @Override
                              public void onNext(@NonNull Boolean value) {

                                  if (value == true){ // [이동 클릭]

                                      // [외부 링크 이동]
                                      C_MoveApp.goChromeBrowser(A_Webview.this, url);

                                  }
                              }
                              @Override
                              public void onError(@NonNull Throwable e) {

                              }
                              @Override
                              public void onComplete() {
                              }
                          });

              }
              return true; // [로직 종료]
          }
      });
      WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
      transport.setWebView(mWebViewPop);
      resultMsg.sendToTarget();

      // -------------------------------------------------------------
      return true; // [로직 종료]
      // -------------------------------------------------------------
  }



  // TODO [웹뷰 [window close] 새창 닫기 이벤트 확인]
  @Override
  public void onCloseWindow(WebView window) {
      S_Log._F_(A_Webview.this, "웹뷰 [window close] 새창 닫기 이벤트 확인", null);
      try {
          //window.setVisibility(View.GONE);
          //window.destroy();
      }
      catch (Exception e){}
      super.onCloseWindow(window);
  }

});  

// --------------------------------------------------------------------------------------





// --------------------------------------------------------------------------------------
[참고 사이트]
// --------------------------------------------------------------------------------------

// [안드로이드 웹뷰 유틸 파일]

https://blog.naver.com/kkh0977/222680670897

[안드로이드 ( android ) 웹뷰 window open 새창 열기 이벤트 발생 시 Alert 팝업창 표시, 외부링크 이동 개선 요청]

https://blog.naver.com/kkh0977/223738898023

// --------------------------------------------------------------------------------------
 

[결과 출력]

 
반응형
Comments