Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.danser.js_test
- import android.annotation.SuppressLint
- import android.app.Activity
- import android.os.Bundle
- import android.webkit.JavascriptInterface
- import android.webkit.WebView
- import kotlinx.android.synthetic.main.activity_main.*
- import kotlin.random.Random
- class MainActivity : Activity() {
- lateinit var jsExecutor: JSExecutor
- public override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_main)
- WebView.setWebContentsDebuggingEnabled(true)
- jsExecutor = JSExecutor(this)
- bExecute.setOnClickListener {
- callJavaScriptFunctionAndGetResultBack(333, Random.nextInt(100, 200))
- }
- }
- private fun callJavaScriptFunctionAndGetResultBack(val1: Int, val2: Int) {
- jsExecutor.execute(
- jsCode = JS_CODE,
- methodUrl = "addSomething(%s, %s)",
- params = *arrayOf(val1, val2)
- ) { result ->
- runOnUiThread { tvResult.text = "Callback got val: $result" }
- }
- }
- }
- private val JS_CODE =
- """
- function addSomething(a, b) {
- console.log('log from javascript');
- return a + b;
- }
- """
- class JSExecutor(activity: Activity) {
- private val webView = WebView(activity)
- private val jsInterface: JavaScriptInterface = JavaScriptInterface(activity, webView)
- init {
- initWebView()
- }
- @SuppressLint("SetJavaScriptEnabled")
- private fun initWebView() {
- webView.settings.javaScriptEnabled = true
- webView.addJavascriptInterface(jsInterface, HANDLER_NAME)
- }
- fun execute(jsCode: String, methodUrl: String, vararg params: Any, onResult: (Int) -> Unit) {
- jsInterface.onResult = onResult
- webView.loadUrl(getHtml(jsCode))
- webView.loadUrl(getMethodUrl(methodUrl, *params))
- }
- private fun getMethodUrl(method: String, vararg params: Any): String {
- val methodCall = String.format(method, *params)
- return "javascript:window.$HANDLER_NAME.setResult( $methodCall )"
- }
- private fun getHtml(jsText: String): String =
- """<html><head><script type="text/javascript">function addSomething(a, b) {
- console.log('log from javascript');
- return a + b;
- }</script></head></html>"""
- class JavaScriptInterface(
- private val activity: Activity,
- private val webView: WebView
- ) {
- var onResult: (Int) -> Unit = {}
- @JavascriptInterface
- fun loadURL(url: String) {
- activity.runOnUiThread { webView.loadUrl(url) }
- }
- @JavascriptInterface
- fun setResult(result: Int) {
- onResult(result)
- }
- }
- companion object {
- private const val HANDLER_NAME = "interface handler"
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement