【Andriod中Webview与JS交互】

Andriod中Webview与JS交互

AgentWeb

AgentWeb 是一个高度封装的 Android WebView ,简单易用 , 带有进度条 、 支持文件上传 、 下载 、 简化 Javascript 通信 、 链式调用 、 加强 Web 安全的库 。

AgentWeb使用

Gradle 引入
	allprojects {
		repositories {
			...
			maven { url 'https://jitpack.io' }
		}
	}
	    //AgentWeb
	    implementation 'com.github.Justson.AgentWeb:agentweb-core:v5.0.6-androidx' // (必选)
	//    implementation 'com.github.Justson.AgentWeb:agentweb-filechooser:v5.0.6-androidx' // (可选)
	//    implementation 'com.github.Justson:Downloader:v5.0.4-androidx' // (可选)
AgentWeb设置
	AgentWeb.PreAgentWeb mAgentWeb = AgentWeb.with(this)
	                .setAgentWebParent(frameLayout, new FrameLayout.LayoutParams(-1, -1))
	                .closeIndicator()
	                .setWebViewClient(new MyWebViewClient())
	                .createAgentWeb()
	                .ready();
	AgentWeb agentWeb = mAgentWeb.go(uri.toString());

JS交互实现

交互过程

自定义uri协议

	methods: {
        finishWeb(){
            window.location.href = "finishweb://finish/webview";
        },
        trMassage(){
            window.location.href = "trmassage://tr?data=" + JSON.stringify(this.str);
        },
    },

解析uri协议

定义一个继承WebViewClient的类,重写shouldOverrideUrlLoading方法,解析uri协议并执行相关操作,其中可以利用GSON将传递过来的数据JSON化。

	implementation 'com.google.code.gson:gson:2.9.1'
	private class MyWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            //解析uri协议并执行相关操作
            Uri uri = request.getUrl();
            if("finishweb".equals(uri.getScheme())){
                finish();
            } else if ("trmassage".equals(uri.getScheme())) {
                String data = uri.getQueryParameter("data");
                DataTest test = new Gson().fromJson(data, new TypeToken<DataTest>(){}.getType());
                textView.setText(test.getData().getNodes().get(0).getName());
            }
            return true;
        }
    }

与 Javascript 通信

利用AgentWeb封装好的方法,可以简化和 Javascript 通信

	if(agentWeb != null){
		String s = textView.getText().toString();
        agentWeb.getJsAccessEntrace().quickCallJs("app.reTitle",s);
	}

完整代码

Android代码

package com.example.webjsdemo;

import android.annotation.SuppressLint;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.webkit.WebResourceRequest;
import android.webkit.WebView;
import android.widget.FrameLayout;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import com.example.webjsdemo.model.DataTest;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.just.agentweb.AgentWeb;
import com.just.agentweb.WebViewClient;

public class WebActivity extends AppCompatActivity {
    private FrameLayout frameLayout;
    private TextView textView;
    private TextView bt;
    @SuppressLint("SetJavaScriptEnabled")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web);
        frameLayout = findViewById(R.id.web);
        textView = findViewById(R.id.tv_data);
        bt = findViewById(R.id.bt_com);

        Uri uri = Uri.parse("file:///android_asset" + "/h5/index.html")
                .buildUpon()
                .build();

        AgentWeb.PreAgentWeb mAgentWeb = AgentWeb.with(this)
                .setAgentWebParent(frameLayout, new FrameLayout.LayoutParams(-1, -1))
                .closeIndicator()
                .setWebViewClient(new MyWebViewClient())
                .createAgentWeb()
                .ready();
        AgentWeb agentWeb = mAgentWeb.go(uri.toString());
        bt.setOnClickListener(view -> {
            if(agentWeb != null){
                String s = textView.getText().toString();
                agentWeb.getJsAccessEntrace().quickCallJs("app.reTitle",s);
            }
        });
    }

    private class MyWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            //解析uri协议并执行相关操作
            Uri uri = request.getUrl();
            if("finishweb".equals(uri.getScheme())){
                finish();
            } else if ("trmassage".equals(uri.getScheme())) {
                String data = uri.getQueryParameter("data");
                DataTest test = new Gson().fromJson(data, new TypeToken<DataTest>(){}.getType());
                textView.setText(test.getData().getNodes().get(0).getName());
            }
            return true;
        }
    }
}

H5代码

H5代码放入app/src/main/assets/ 中,访问路径为“file:///android_asset”+assets文件夹中h5路径
index.html

<!DOCTYPE html>
<html>
    <head>
        <link href="index.css" rel="stylesheet">
        <title>WebJs</title>
    </head>
    <body>
        <div id="app">
            <div class="title" style="display: flex;">
                <span style="flex-grow: 1; text-align: left; color: white;" @click="finishWeb">返回</span>
                <span style="flex-grow: 2; text-align: center;">{{title}}</span>
                <span style="flex-grow: 1; text-align: right; color: white;" @click="trMassage">将H5数据传给Android</span>
            </div>
        </div>
        <script type="text/javascript" src="common/vue.global.js" charset="utf-8"></script>
        <script src="index.js"></script>
    </body>
</html>

index.js

var app;
app = Vue.createApp({
	data() {
		return{
			str: {
				"code": 0,
				"msg": "success",
				"data": {
					"id": "333333333",
					"name": "测试测试测试测试测试测试测试",
				}
			},
			title: 'WebJs相互调用',
		}
	},
    methods: {
        finishWeb(){
            window.location.href = "finishweb://finish/webview";
        },
        trMassage(){
            window.location.href = "trmassage://tr?data=" + JSON.stringify(this.str);
        },
        reTitle(res){
            this.title = res;
        }
    },
}).mount('#app')
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值