프로젝트/최종 프로젝트

[Android] webview javascriptinterface 사용하기

허니눈 2018. 12. 12. 18:12

안드로이드에서 웹뷰를 이용해 웹 화면을 디바이스 화면에 구현할 수 있다.

상황에 따라 Native로 만드는 것보다 웹으로 만들어서 화면에 띄우는 게 나을 경우가 있다.


고객이 앱으로 주문 할 시 실제 도로명 주소를 사용해야한다.

Daum 우편번호 서비스 http://postcode.map.daum.net/guide

무료로 간편하게 사용할 수 있다.


---------------------------------------------------------------------------------------------

[프로젝트에 실제 적용한 모습]


---------------------------------------------------------------------------------------------


[Manifest.xml]


<activity
android:name=".DaumWebViewActivity"
android:theme="@android:style/Theme.Dialog" />

먼저 Manifest를 설정해준다.

Theme를 Dialog로 해서 Activity 변경이 아닌 Dialog 창으로 데이터를 주고 받는다.




[Activity.java]

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

//타이틀바 없애기
requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(R.layout.activity_daum_web_view);



// WebView 초기화
init_webView();
// 핸들러를 통한 JavaScript 이벤트 반응
handler = new Handler();
}


public void init_webView() {
// WebView 설정
daum_webView = (WebView) findViewById(R.id.daum_webview);
// JavaScript 허용
daum_webView.getSettings().setJavaScriptEnabled(true);
// JavaScript의 window.open 허용
daum_webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
// JavaScript이벤트에 대응할 함수를 정의 한 클래스를 붙여줌
daum_webView.addJavascriptInterface(new AndroidBridge(), "TestApp");
// web client 를 chrome 으로 설정
daum_webView.setWebChromeClient(new WebChromeClient());
// webview url load. php 파일 주소
daum_webView.loadUrl(getString(R.string.server_addr) + "/spring/daum_address");
}


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

Log.d(TAG, "address1 : " + arg2);
Log.d(TAG, "address_building : " + arg3);

Intent intent = new Intent();
intent.putExtra("address1", arg2);
intent.putExtra("address_building", arg3);
setResult(1, intent);
finish();
}
});
}
}


@Override
public boolean onTouchEvent(MotionEvent event) {
//바깥레이어 클릭시 안닫히게
if(event.getAction()==MotionEvent.ACTION_OUTSIDE){
return false;
}
return true;
}





[layout : activity_daum_web_view.xml]

<WebView
android:id="@+id/daum_webview"
android:layout_width="match_parent"
android:layout_height="450dp"
android:layout_weight="0" />