0
点赞
收藏
分享

微信扫一扫

Android (Arctic Fox P2) Kotlin WebView.addJavascriptInterface

1. 自定义需要注入Webiew的JavascriptObject:

// 继承Object基类
class JavascriptObject: Object(){

    public fun doBefore(arg: Any?){
    }

    // 注解1
    @JavascriptInterface
    public fun do(arg: String?){
    }
}

2. 往Webiew注入Javascript Interface类:

// 注解2
@SuppressLint("JavascriptInterface")
private fun addJavascriptInterfaceObject(){
    val object1 = JavascriptObject()
    // 自定义参数: arg
    lateinit var arg: Any? 
    object1.doBefore(arg)
    // 自定义调用的Javascript Interface类JavascriptObject的别名——在Javascript调用中使用的名称
    webView.addJavascriptInterface(object1, "jsio")
}

3. 在Javascript中调用Javascript Interface类JavascriptObject方法do(arg: String?):

// 自定义传入参数arg
lateinit var arg: String?
var html: String = """<!DOCTYPE html><html><head><title>Test</title>
</head>
<body>"""
html += """<a href='javascript:window.jsio.do(\"$arg\");'><img width='36px' height='36px' src='file:///android_asset/trash.png' alt='DELETE'/></a>
</body>
</html>"""

 如果不需要混淆该类可以在build.gradle (:app)文件定义的规则文件

proguard-rules.pro或
proguard-android-optimize.txt

中进行注释。

gradle.build (:app):

android {
    compileSdkVersion 30
    buildToolsVersion "31.0.0"
    defaultConfig {
        applicationId "com.mr.n.x"
        minSdkVersion 21
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

 proguard-rules.pro:

-keep class androidx.annotation.Keep

给之前自定义的Javascript Interface类JavascriptObject标注@Keep:

@Keep
class JavascriptObject: Object() {
    // ...
}

注解1:

@JavascriptInterface需要标注在Javascript调用的方法定义前。

注解2:

@SuppressLint("JavascriptInterface")需要添加在调用Webiew.addJavascriptInterface方法的方法前。

举报

相关推荐

0 条评论