Android Studio/java

08. [안드로이드/java] 웹뷰 안드로이드 <-> 자바스크립트 함수 호출(javascriptInterface 기능)

drizzle0925 2021. 7. 6. 18:28
728x90

하이브리드 앱을 개발하다 보면 안드로이드에서 웹의 자바스크립트를 호출하거나 반대로 웹에서 안드로이드의 함수를 호출하고 싶은 경우가 발생합니다. 이럴 때 유용하게 사용할 수 있는 기능이 javascriptInterface기능입니다.

오늘은 이 기능의 예제코드를 작성해보겠습니다.

 

Web -> Android 호출

1. JavaScript 작성

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>Web -> Android 함수호출</h1>
    <script>
        //web -> android 호출
        function callAndroid(){
            window.Android.openAlert("web에서 호출한 메세지입니다.");
        }
        callAndroid();
    </script>
</body>
</html>

 

 

2. Android studio 코드 작성

핸들러 전역변수 추가

// Bridge handler 추가
private final Handler handler = new Handler();

 

 

OnCreate 내부에 브리지 명칭 추가

// Bridge 명칭 추가
mWebView.addJavascriptInterface(new AndroidBridge(), "Android");

 

 

OnCreate 외부에서 Web에서 호출할 함수 추가

private class AndroidBridge {
        @JavascriptInterface
        public void openAlert(String arg){
            handler.post(new Runnable(){
                @Override
                public void run(){
                    Toast.makeText(MainActivity.this, arg, Toast.LENGTH_SHORT).show();
                }
            });
        }
    }

 

 

 

MainActivity.java 최종 소스 코드

package com.drizzle.webview2;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.view.KeyEvent;
import android.webkit.JavascriptInterface;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private WebView mWebView;
    // Bridge handler 추가
    private final Handler handler = new Handler();

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

        mWebView = (WebView) findViewById(R.id.activity_main_webview);

        WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        // Bridge 명칭 추가
        mWebView.addJavascriptInterface(new AndroidBridge(), "Android");

        mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });

        mWebView.setWebChromeClient(new WebChromeClient() {
            @Override
            public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
                new AlertDialog.Builder(view.getContext())
                        .setTitle("Alert")
                        .setMessage(message)
                        .setPositiveButton(android.R.string.ok,
                                new AlertDialog.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int which) {
                                        result.confirm();
                                    }
                                })
                        .setCancelable(false)
                        .create()
                        .show();
                return true;
            }

            @Override
            public boolean onJsConfirm(WebView view, String url, String message,
                                       final JsResult result) {
                new AlertDialog.Builder(view.getContext())
                        .setTitle("Confirm")
                        .setMessage(message)
                        .setPositiveButton("Yes",
                                new AlertDialog.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int which) {
                                        result.confirm();
                                    }
                                })
                        .setNegativeButton("No",
                                new AlertDialog.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int which) {
                                        result.cancel();
                                    }
                                })
                        .setCancelable(false)
                        .create()
                        .show();
                return true;
            }
        });

        mWebView.loadUrl("http://example.com/");
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (mWebView.canGoBack()) {
                mWebView.goBack();
                return false;
            }
        }

        return super.onKeyDown(keyCode, event);
    }

    private class AndroidBridge {
        @JavascriptInterface
        public void openAlert(String arg){
            handler.post(new Runnable(){
                @Override
                public void run(){
                    Toast.makeText(MainActivity.this, arg, Toast.LENGTH_SHORT).show();
                }
            });
        }
    }
}

 

결과 화면

앱을 실행하면 Toast 메시지가 바로 표시됩니다.


Android -> Web 호출

1. JavaScript 작성

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>Web -> Android 함수호출</h1>
    <script>
        //web -> android 호출
        function callAndroid(){
            window.Android.openAlert("web에서 호출한 메세지입니다.");
        }
        callAndroid();

        // android -> web 호출
        function callWeb(message){
            alert(message);
        }
    </script>
</body>
</html>

 

 

 

2. Android studio > MainActivity.java 코드 작성

openAlert 함수 아래 아래 코드 추가

mWebView.loadUrl("javascript:callWeb('안드로이드에서 웹 함수 호출')");

 

 

결과 화면

앱이 실행되면

1) JavaScript -> Android 함수 호출

2) Android -> JavaScript 함수 호출

방식으로 호출되면서 아래 화면과 같이 동작합니다.

728x90