개인 공부

안드로이드 다음 주소 검색 이슈

Machine_웅 2019. 10. 7. 20:50
728x90
반응형

안드로이드에서 웹뷰를 이용하여 다음 주소 검색 api 를 이용 하려고 하는데,

 

웹뷰에서는  안뜨고  php 주소를 쳐서 확인해보면  팝업형식으로 뜨면서 정상작동하는 경우를 봤을 것이다.

 

 

다음 주소검색 api의 경우 팝업으로 열리기때문에 

 

웹쪽에서 iframe으로 처리를 하거나, 

 

안드로이드에서 웹뷰가 팝업으로 실행되게 처리해야한다.

 

 

나는 웹 쪽 iframe으로 처리하는 방법을 선택했다.

 

< 안드로이드 >

public class MainActivity extends AppCompatActivity {
    private WebView webView;

    private TextView result;

    private Handler handler;

    Context context;
    Activity activity;

    Dialog dialog1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = this;
        activity =this;

        result = (TextView) findViewById(R.id.result);
        webView = (WebView) findViewById(R.id.webView);

        // 핸들러를 통한 JavaScript 이벤트 반응
        handler = new Handler();

        result.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // WebView 초기화
                init_webView();

            }
        });

    }

    @SuppressLint("SetJavaScriptEnabled")
    public void init_webView() {
        // WebView 설정
        // JavaScript 허용
        webView.getSettings().setJavaScriptEnabled(true);

        // JavaScript의 window.open 허용
        webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);

        // JavaScript이벤트에 대응할 함수를 정의 한 클래스를 붙여줌
        webView.addJavascriptInterface(new AndroidBridge(), "TestApp");

        // web client 를 chrome 으로 설정
        webView.setWebChromeClient(new WebChromeClient());

        // webview url load
        webView.loadUrl("http://192.168.0.4:80/search_navi_address.php");

    }



    public class AndroidBridge {

        @JavascriptInterface
        public void setAddress(final String arg1, final String arg2, final String arg3) {
            handler.post(new Runnable() {
                @Override
                public void run() {
                   //  result.setText(String.format("(%s) %s %s", arg1, arg2, arg3));
                    // WebView를 초기화 하지않으면 재사용할 수 없음

                    Log.d("@@@@",String.format("(%s) %s %s", arg1, arg2, arg3));
                    init_webView();
                }
            });
        }

    }
}

 

< 웹 php >

<?php
header("Content-Type: text/html; charset=UTF-8");
?>


<div id="wrap" style="display:none;border:1px solid;width:400px;height:300px;margin:5px 0;position:relative">
<img src="//t1.daumcdn.net/postcode/resource/images/close.png" id="btnFoldWrap" style="cursor:pointer;position:absolute;right:0px;top:-1px;z-index:1" onclick="foldDaumPostcode()" alt="접기 버튼">
</div>

<script src="https://t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
<script>
   
   
    // 우편번호 찾기 찾기 화면을 넣을 element
    var element_wrap = document.getElementById('wrap');
    element_wrap.style.display = 'block';

    var currentScroll = Math.max(document.body.scrollTop, document.documentElement.scrollTop);
        new daum.Postcode({
            oncomplete: function(data) {
                // 검색결과 항목을 클릭했을때 실행할 코드를 작성하는 부분.

                if(data.userSelectedType=="R"){
                // userSelectedType : 검색 결과에서 사용자가 선택한 주소의 타입
                // return type : R - roadAddress, J : jibunAddress
                // TestApp 은 안드로이드에서 등록한 이름
                window.TestApp.setAddress(data.zonecode, data.roadAddress, data.buildingName);

                }

                else{
                window.TestApp.setAddress(data.zonecode, data.jibunAddress, data.buildingName);
                
                }       
                // iframe을 넣은 element를 안보이게 한다.
                // (autoClose:false 기능을 이용한다면, 아래 코드를 제거해야 화면에서 사라지지 않는다.)
                element_wrap.style.display = 'none';

                // 우편번호 찾기 화면이 보이기 이전으로 scroll 위치를 되돌린다.
                document.body.scrollTop = currentScroll;
            },
            // 우편번호 찾기 화면 크기가 조정되었을때 실행할 코드를 작성하는 부분. iframe을 넣은 element의 높이값을 조정한다.

            onresize : function(size) {
                element_wrap.style.height = size.height+'px';
            },

            width : '100%',
            height : '100%'
        }).embed(element_wrap);


</script>

 

728x90
반응형