From 40287a122801ecde5bb9b365123bf0b6f2717bd1 Mon Sep 17 00:00:00 2001 From: pedant Date: Mon, 15 Sep 2014 16:38:57 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=B3=A8=E5=85=A5=E5=90=8D?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 ++++-- .../SafeWebViewBridge/bridge/InjectedChromeClient.java | 4 ++-- src/cn/pedant/SafeWebViewBridge/bridge/JsCallJava.java | 4 ++-- src/cn/pedant/SafeWebViewBridge/demo/WebActivity.java | 4 +++- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 98fe007..e260cd8 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,14 @@ Safe Java-JS WebView Bridge 抛弃使用高风险的WebView addjavascriptInterface方法,利用onJsPrompt解析纯JSON字符串,来实现网页JS层反射调用Java方法,同时通过对js层调用函数及回调函数的包装,支持方法参数传入所有已知的类型,包括number、string、boolean、object、function。 ## 如何开始 -初始化Webview WebSettings时允许js脚本执行,同时使用你的注入类实例化一个**InjectedChromeClient**对象,然后关联到你的Webview实例。如demo中的例子(指定的注入类为HostJsScope): +初始化Webview WebSettings时允许js脚本执行,同时使用你的注入名和注入类来实例化一个**InjectedChromeClient**对象,然后关联到你的Webview实例。如demo中的例子(页面中引用的对象名为HostApp,指定的注入类为HostJsScope): WebView wv = new WebView(this); WebSettings ws = wv.getSettings(); ws.setJavaScriptEnabled(true); - wv.setWebChromeClient(new InjectedChromeClient(HostJsScope.class)); + wv.setWebChromeClient( + new InjectedChromeClient("HostApp", HostJsScope.class) + ); wv.loadUrl("file:///android_asset/test.html"); ## 方法的定义 diff --git a/src/cn/pedant/SafeWebViewBridge/bridge/InjectedChromeClient.java b/src/cn/pedant/SafeWebViewBridge/bridge/InjectedChromeClient.java index 5557517..128a948 100644 --- a/src/cn/pedant/SafeWebViewBridge/bridge/InjectedChromeClient.java +++ b/src/cn/pedant/SafeWebViewBridge/bridge/InjectedChromeClient.java @@ -20,8 +20,8 @@ public class InjectedChromeClient extends WebChromeClient { private JsCallJava mJsCallJava; private boolean mIsInjectedJS; - public InjectedChromeClient (Class injectedCls) { - mJsCallJava = new JsCallJava(injectedCls); + public InjectedChromeClient (String injectedName, Class injectedCls) { + mJsCallJava = new JsCallJava(injectedName, injectedCls); } // 处理Alert事件 diff --git a/src/cn/pedant/SafeWebViewBridge/bridge/JsCallJava.java b/src/cn/pedant/SafeWebViewBridge/bridge/JsCallJava.java index cb13dcd..02ee436 100644 --- a/src/cn/pedant/SafeWebViewBridge/bridge/JsCallJava.java +++ b/src/cn/pedant/SafeWebViewBridge/bridge/JsCallJava.java @@ -17,7 +17,7 @@ public class JsCallJava { private final String RETURN_RESULT_FORMAT = "{\"code\": %d, \"result\": %s}"; private String mPreloadInterfaceJS; - public JsCallJava (Class injectedCls) { + public JsCallJava (String injectedName, Class injectedCls) { try { mMethodsMap = new HashMap(); //获取自身声明的所有方法(包括public private protected), getMethods会获得所有继承与非继承的方法 @@ -33,7 +33,7 @@ public JsCallJava (Class injectedCls) { sb.append(String.format("a.%s=", method.getName())); } - sb.append("function(){var f=Array.prototype.slice.call(arguments,0);if(f.length<1){throw\"HostApp call error, message:miss method name\"}var e=[];for(var h=1;h