|
43 | 43 | import java.net.URLEncoder; |
44 | 44 | import java.util.HashMap; |
45 | 45 | import java.util.Map; |
| 46 | +import android.annotation.SuppressLint; |
46 | 47 |
|
47 | 48 |
|
48 | 49 | /** |
@@ -70,36 +71,44 @@ public AgentWebView(Context context, AttributeSet attrs) { |
70 | 71 |
|
71 | 72 | /** |
72 | 73 | * 经过大量的测试,按照以下方式才能保证JS脚本100%注入成功: |
| 74 | + @SuppressLint("AddJavascriptInterface") |
73 | 75 | * 1、在第一次loadUrl之前注入JS(在addJavascriptInterface里面注入即可,setWebViewClient和setWebChromeClient要在addJavascriptInterface之前执行); |
74 | 76 | * 2、在webViewClient.onPageStarted中都注入JS; |
75 | 77 | * 3、在webChromeClient.onProgressChanged中都注入JS,并且不能通过自检查(onJsPrompt里面判断)JS是否注入成功来减少注入JS的次数,因为网页中的JS可以同时打开多个url导致无法控制检查的准确性; |
76 | 78 | * |
| 79 | + @SuppressLint("AddJavascriptInterface") |
77 | 80 | * @deprecated Android 4.2.2及以上版本的 addJavascriptInterface 方法已经解决了安全问题,如果不使用“网页能将JS函数传到Java层”功能,不建议使用该类,毕竟系统的JS注入效率才是最高的; |
78 | 81 | */ |
79 | 82 | @Override |
80 | 83 | @Deprecated |
| 84 | + @SuppressLint("AddJavascriptInterface") |
81 | 85 | public final void addJavascriptInterface(Object interfaceObj, String interfaceName) { |
82 | 86 |
|
83 | 87 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { |
| 88 | + @SuppressLint("AddJavascriptInterface") |
84 | 89 | super.addJavascriptInterface(interfaceObj, interfaceName); |
85 | 90 | Log.i(TAG, "注入"); |
86 | 91 | return; |
87 | 92 | } else { |
88 | 93 | Log.i(TAG, "use mJsCallJavas:" + interfaceName); |
89 | 94 | } |
90 | 95 |
|
| 96 | + @SuppressLint("AddJavascriptInterface") |
91 | 97 | LogUtils.i(TAG, "addJavascriptInterface:" + interfaceObj + " interfaceName:" + interfaceName); |
92 | 98 | if (mJsCallJavas == null) { |
93 | 99 | mJsCallJavas = new HashMap<String, JsCallJava>(); |
94 | 100 | } |
95 | 101 | mJsCallJavas.put(interfaceName, new JsCallJava(interfaceObj, interfaceName)); |
96 | 102 | injectJavaScript(); |
97 | 103 | if (LogUtils.isDebug()) { |
| 104 | + @SuppressLint("AddJavascriptInterface") |
98 | 105 | Log.d(TAG, "injectJavaScript, addJavascriptInterface.interfaceObj = " + interfaceObj + ", interfaceName = " + interfaceName); |
99 | 106 | } |
| 107 | + @SuppressLint("AddJavascriptInterface") |
100 | 108 | addJavascriptInterfaceSupport(interfaceObj, interfaceName); |
101 | 109 | } |
102 | 110 |
|
| 111 | + @SuppressLint("AddJavascriptInterface") |
103 | 112 | protected void addJavascriptInterfaceSupport(Object interfaceObj, String interfaceName) { |
104 | 113 | } |
105 | 114 |
|
@@ -197,6 +206,7 @@ && getSettings() == null) { |
197 | 206 | } |
198 | 207 |
|
199 | 208 | /** |
| 209 | + @SuppressLint("AddJavascriptInterface") |
200 | 210 | * 添加并注入JavaScript脚本(和“addJavascriptInterface”注入对象的注入时机一致,100%能注入成功); |
201 | 211 | * 注意:为了做到能100%注入,需要在注入的js中自行判断对象是否已经存在(如:if (typeof(window.Android) = 'undefined')); |
202 | 212 | * |
|
0 commit comments