Programing

Android WebView를 통해 JavaScript에서 Java 함수 호출

crosscheck 2020. 11. 2. 07:40
반응형

Android WebView를 통해 JavaScript에서 Java 함수 호출


내 Android 앱에서 일부 Java 코드를 동기식으로 호출하고 싶습니다.

이 솔루션을 사용하고 있습니다 : https://stackoverflow.com/a/3338656

내 자바 코드 :

final class MyWebChromeClient extends WebChromeClient {
        public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
            Log.d("LogTag", message);
            result.confirm();
            return true;
        }
    }

내 JavaScript 코드 :

<html>
<script>
function java_request(){
    alert('test');
}
</script>
<body>
<h2>Welcome</h2>
<div id="area"></div>
<form>
<input type="button" value="java_call" onclick="java_request()">
</form>
</body>
</html>

java_call버튼을 하면 버튼이 눌린 상태가됩니다. 'test'콘솔 로그에서 볼 수 있습니다 . 여기까지 모든 것이 정상입니다.

문제는 버튼이 정상 상태로 돌아 가지 않는다는 것입니다. 눌린 상태로 유지됩니다. 자바 스크립트 실행이 깨졌을까요?

버튼이 정상 상태로 돌아 가지 않는 이유는 무엇입니까?


나는 이것이 자바 코드를 실행하기 위해 자바 스크립트를 얻는 최선의 해결책이라고 생각하지 않습니다. 여길 봐:

자바 스크립트를 통해 호출 가능하도록 네이티브 코드를 HTML에 노출하려면 웹보기 선언에서 다음을 수행하세요.

JavaScriptInterface jsInterface = new JavaScriptInterface(this);
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(jsInterface, "JSInterface");

수업 선언 JavaScriptInterface:

public class JavaScriptInterface {
    private Activity activity;

    public JavaScriptInterface(Activity activity) {
        this.activity = activity;
    }

    @JavascriptInterface
    public void startVideo(String videoAddress){
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(Uri.parse(videoAddress), "video/3gpp"); 
        activity.startActivity(intent);
    }
}

비디오 재생을위한 단일 기능을 선언하고 있지만 원하는 것은 무엇이든 할 수 있습니다.

마지막으로 WebView간단한 자바 스크립트 호출을 통해 콘텐츠 에서이를 호출합니다.

<video width="320" height="240" controls="controls" poster='poster.gif'
       onclick="window.JSInterface.startVideo('file:///sdcard/test.3gp');" >
   Your browser does not support the video tag.
</video>

이 예는 비디오 재생에 대한 내 다른 답변에서 가져 왔지만 충분히 설명해야합니다.

@CedricSoubrie의 의견에 따라 편집 : 애플리케이션의 대상 버전이 17 이상으로 설정된 @JavascriptInterface경우 웹보기로 내보내 려는 각 메서드 위에 주석을 추가해야합니다 .


함수는 'true'를 반환합니다. 그러면 HTML 코드의 'onclick'속성이 true가되므로 버튼이 '클릭'된 상태로 유지됩니다.


" YourJavaScriptInterface "클래스에 정의 된 메소드는 " @JavascriptInterface "로 노출하려는 각 메소드에 주석을 추가하는 것을 잊지 마십시오. 그렇지 않으면 메소드가 트리거되지 않습니다.

예를 들어 아래 코드는 웹보기 페이지에서 호출하기위한 Google 클라우드 프린트 자바 스크립트 인터페이스에서 가져온 것입니다.

        final class PrintDialogJavaScriptInterface {
        @JavascriptInterface
        public String toString() { return JS_INTERFACE; }

        @JavascriptInterface
        public String getType() {
            return cloudPrintIntent.getType();
        }

        @JavascriptInterface
        public String getTitle() {
            return cloudPrintIntent.getExtras().getString("title");
        }

        @JavascriptInterface
        public String getContent() {
            try {
                ContentResolver contentResolver = getActivity().getContentResolver();
                InputStream is = contentResolver.openInputStream(cloudPrintIntent.getData());
                ByteArrayOutputStream baos = new ByteArrayOutputStream();

                byte[] buffer = new byte[4096];
                int n = is.read(buffer);
                while (n >= 0) {
                    baos.write(buffer, 0, n);
                    n = is.read(buffer);
                }
                is.close();
                baos.flush();

                return Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return "";
        }

        @JavascriptInterface
        public String getEncoding() {
            return CONTENT_TRANSFER_ENCODING;
        }

        @JavascriptInterface
        public void onPostMessage(String message) {
            if (message.startsWith(CLOSE_POST_MESSAGE_NAME)) {
                finish();
            }
        }
    }

참고 URL : https://stackoverflow.com/questions/10389572/call-java-function-from-javascript-over-android-webview

반응형