본문 바로가기
Programando/Android

[Android/Java] 다음 우편번호 API 사용, WebView 흰 화면 오류

먼저, 다음 우편번호 API를 웹뷰에 띄우고, 데이터를 가져오는 것은 아래의 게시글을 참고해서 진행했습니다.

 

[Android] 다음 우편번호 API 사용하기

※ 이 글은 개인 서버에 파일을 업로드한 후 작동시키는 예제다. 개인 서버에 파일을 업로드하지 않고서는 시도해보지 않아서 되는지 안되는지 모른다. 업데이트 내역) 21.10.16 - daum.html의 태그

onlyfor-me-blog.tistory.com

 

1. daum address.html 다운로드 및 설정하기

아래의 첨부파일을 다운받고, 프로젝트의 app 파일 내에 assets 파일을 생성한 후에 안드로이드 스튜디오를 종료한 상태에서 assets 파일 내에 해당 첨부파일을 붙여넣습니다. 해당 첨부파일은 개인서버에도 올려야 합니다. 저는 AWS에 서버를 구축해뒀으므로, 사용중인 인스턴스에 해당 파일을 작성해두었습니다.

daum_address.html
0.01MB

 

2. 구현

  • OrderActivity.java
    private static final int SEARCH_ADDRESS_ACTIVITY = 1002;

    // onCreate 함수 안
    // btn_order_zipcode 버튼을 누르면 다음 우편주소 api 화면으로 이동
    btn_order_zipcode.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
             Intent intent = new Intent(getApplicationContext(), DaumAddressActivity.class);

             startActivityForResult(intent, SEARCH_ADDRESS_ACTIVITY);
         }
    });

    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);
        switch (requestCode) {
            case SEARCH_ADDRESS_ACTIVITY:
                if (resultCode == RESULT_OK) {
                    String data = intent.getExtras().getString("data");
                    if (data != null) {
                        // data의 정보를 각각 우편번호와 실주소로 나누어 EditText에 표시
                        et_order_zipcode.setText(data.substring(0, 5));
                        et_order_address1.setText(data.substring(7));
                    }
                }
                break;
        }
    }

 

  • activity_daum_address.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".DaumAddressActivity">

    <!--상단 툴바-->
    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:minHeight="?attr/actionBarSize">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="15dp"
            android:layout_marginRight="10dp"
            android:fontFamily="@font/nanumbarungothicbold"
            android:text="우편번호 검색"
            android:textSize="23dp"></TextView>

    </androidx.appcompat.widget.Toolbar>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="10dp">

        <WebView
            android:id="@+id/wv_search_address"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

        <!-- 화면이 로딩될 때까지 뜨는 화면 -->
        <ProgressBar
            android:id="@+id/web_progress"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:visibility="gone" />

    </RelativeLayout>

</LinearLayout>

 

반응형

 

  • DaumAddressActivity.java
    private static String IP_ADDRESS = "IP ADDRESS";

    class MyJavaScriptInterface
    {
        @JavascriptInterface
        @SuppressWarnings("unused")
        public void processDATA(String data) {
            Bundle extra = new Bundle();
            Intent intent = new Intent();
            extra.putString("data", data);
            intent.putExtras(extra);
            setResult(RESULT_OK, intent);
            finish();
        }
    }

    public WebView wv_search_address;

    private ProgressBar progress;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_daum_address);

        progress = findViewById(R.id.web_progress);

        wv_search_address = findViewById(R.id.wv_search_address);

        wv_search_address.getSettings().setJavaScriptEnabled(true);
        wv_search_address.getSettings().setDomStorageEnabled(true);
        wv_search_address.addJavascriptInterface(new MyJavaScriptInterface(), "Android");

        wv_search_address.setWebViewClient(new WebViewClient() {

            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                handler.proceed(); // SSL 에러가 발생해도 계속 진행
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);

                return true;
            }

            // 페이지 로딩 시작시 호출
            @Override
            public void onPageStarted(WebView view,String url , Bitmap favicon){
                progress.setVisibility(View.VISIBLE);

            }

            @Override
            public void onPageFinished(WebView view, String url) {
                progress.setVisibility(View.GONE);
                wv_search_address.loadUrl("javascript:sample2_execDaumPostcode();");
            }
        });

        //ssl 인증이 없는 경우 해결을 위한 부분
        wv_search_address.setWebChromeClient(new WebChromeClient() {
            @TargetApi(Build.VERSION_CODES.LOLLIPOP)
            @Override
            public void onPermissionRequest(final PermissionRequest request) {
                request.grant(request.getResources());
            }
        });

        wv_search_address.loadUrl("http://" + IP_ADDRESS + "/daum_address.html");

    }

 

3. 오류 해결

위의 코드는 오류를 모두 수정해 하얀 화면이 뜨지 않지만, 초반에는 아무런 에러 로그도 뜨지 않으면서 WebView에 하얀 화면만 뜨는 오류가 생겼습니다. 찾아보니까 오류의 원인은 다양한 것 같은데 제가 해결하기 위해 사용한 방법들을 포스팅합니다.

  • SSL 인증서 무시
        wv_search_address.setWebViewClient(new WebViewClient() {

            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                handler.proceed(); // SSL 에러가 발생해도 계속 진행
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);

                return true;
            }

        });

        //ssl 인증이 없는 경우 해결을 위한 부분
        wv_search_address.setWebChromeClient(new WebChromeClient() {
            @TargetApi(Build.VERSION_CODES.LOLLIPOP)
            @Override
            public void onPermissionRequest(final PermissionRequest request) {
                request.grant(request.getResources());
            }
        });

 

  • DOMStorage 허용
     // DOMStorage를 허용해줍니다.
     wv_search_address.getSettings().setDomStorageEnabled(true);

 

4. 완성된 화면

 

그 외

자료 참조

 

안드로이드 - 웹뷰 로드시 흰 화면만 나오는 문제. - 안드로이드 Q&A

webview.setDomStorageEnabled(true); 를 추가해보시는건 어떨까요? javascript를 사용하는 웹의 경우에는 DOMStorage를 사용하는 경우도 있기 때문에.. 만일, DOMStorage가 허용되지 않았다면 javascript가 뻗으면서

www.masterqna.com

 

반응형