본문 바로가기
Android

WebView와 통신하기

by 루에 2015. 9. 7.
반응형

안드로이드 웹뷰 내의 javascript와 커뮤니케이션하는 방법은 간단하다. 애플보다 간단하고, (개인적으로) 더 강력하다.


1. Javascript -> Android

2. 그 반대


1번은 정말 간단하고 강력하다. 안드로이드 내에 클래스를 하나 만든다. 어떤 것이든 상관 없다.

그 안에 자바스크립트 내에서 호출할 함수를 작성하고, 그 위에 @JavascriptInterface 어노테이션을 기술한다.

해당 함수가 작성된 클래스 이름이 CommunicationWithJavascript 라고 하면

myWebView.addJavascriptInterface(new CommunicationWithJavascript(this), "자바스크립트에서 사용할 이름");


이후 자바스크립트에서, 본인이 정한 태그(예를 들어 Android)를 이용해 Andoroid.myMethod() 이런 방식으로 호출해서 사용하면 된다. 객체 하나를 import한 것과 같다.


아래는 코드 일부


CommuJavaScript.class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
public class CommJavaScript implements GoogleMap.OnMyLocationChangeListener{
    Context mContext;
    Location mCurrPosition;
    
    public CommJavaScript(Context mContext) {
        this.mContext = mContext;
    }
    @JavascriptInterface
    public void toast(String msg){
        Toast.makeText(mContext, msg, Toast.LENGTH_SHORT).show();
    }
    
    @JavascriptInterface
    public void getCurrentPosition(){
        Location l = null;
        if(null == mCurrPosition){
            l = new Location(LocationManager.NETWORK_PROVIDER);
        }
        else{
            l = mCurrPosition;
        }
        onMyLocationChange(l);
//        return new Float[] { (float)l.getLatitude(), (float)l.getLongitude()};
    }
cs


MainActivity.class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mWebView = (WebView) findViewById(R.id.vw_main_web);
        mActionBar = getSupportActionBar();
 
        mClient = new WebChromeClient();
        mWebView.setWebChromeClient(mClient);
        mWebView.setWebViewClient(new WebViewClient());
 
        settingForWebView(mWebView.getSettings());
        setButtonListener();
        mWebView.addJavascriptInterface(new CommJavaScript(this), "Android");
        mWebView.loadUrl(URL);
cs



2번은 정말 간단하다. 자바스크립트 내에 receiveFromAndroid(message) 함수가 있다고 가정하면, 안드로이드의 웹뷰 객체의 loadUrl을 사용하면 된다. 어떻게? 스키마를 통해서.


myWebView.loadUrl("javascript:receiveFromAndroid("my message");


열려 있는 웹페이지에 해당 함수가 없으면

"Uncaught ReferenceError: receiveFromAndroid is not defined", source: 웹페이지 주소

라는 에러를 뱉는다.



기본적으로 애플과 맥락은 같이 하나 더 편하다고 생각한다. 무엇보다 직관적이고 ios처럼 내부적으로 자동 호출되는 부분이 없다. 적어도 사용자가 연결을 시켜야 된다는 점은 초보자에게 오히려 더 쉽게 다가오지 않을까 싶다. ios 방법 찾느라 개고생해서 이런 소리 하는건 아니다..

반응형

댓글