1. ホーム
  2. javascript

Android の WebView 上で JavaScript から Java の関数を呼び出す

2023-08-15 03:52:11

質問

Androidアプリで、あるJavaコードを同期的に呼び出したいのですが、どうすればよいでしょうか。

私はこの解決策を使用しています。 https://stackoverflow.com/a/3338656

私のJavaコードです。

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' がコンソールログに表示されます。ここまでは正常です。

問題は、ボタンが通常の状態に戻らないことです。押された状態のままです。JavaScriptの実行が壊れているか何かでしょうか?

なぜボタンは決して通常の状態に戻らないのでしょうか?

どのように解決するのですか?

javascriptでjavaのコードを実行させるには、これが最適な解決方法とは思えません。ここを参照してください。

javascriptから呼び出せるように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);
    }
}

動画を再生するための関数を1つ宣言していますが、好きなようにしてください。

最後にこれを WebView のコンテンツで、単純なjavascriptの呼び出しによってこれを呼び出します。

<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>

この例は、動画の再生に関する私の別の回答から引用したものですが、十分に説明できるはずです。

EDIT CedricSoubrie さんのコメントにあるように、アプリケーションのターゲットバージョンが 17 以降に設定されている場合、アノテーション @JavascriptInterface を追加する必要があります。