|
|
@@ -11,10 +11,8 @@ import android.webkit.ConsoleMessage;
|
|
|
import android.webkit.JsPromptResult;
|
|
|
import android.webkit.JsResult;
|
|
|
import android.webkit.WebChromeClient;
|
|
|
-import android.webkit.WebResourceRequest;
|
|
|
import android.webkit.WebSettings;
|
|
|
import android.webkit.WebView;
|
|
|
-import android.webkit.WebViewClient;
|
|
|
import android.widget.RelativeLayout;
|
|
|
|
|
|
public class RAWebView extends RelativeLayout {
|
|
|
@@ -23,8 +21,9 @@ public class RAWebView extends RelativeLayout {
|
|
|
private WebView mWebView;
|
|
|
private Context mCtx;
|
|
|
private RAWebView self = this;
|
|
|
- private RAWebViewDelegate delegate;
|
|
|
|
|
|
+ /**
|
|
|
+ private RAWebViewDelegate delegate;
|
|
|
public interface RAWebViewDelegate {
|
|
|
void webViewPerformJSAction(RAWebView webView, String action, String params);
|
|
|
boolean webViewCanResponseJSAction(RAWebView webView, String action);
|
|
|
@@ -51,6 +50,28 @@ public class RAWebView extends RelativeLayout {
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
+ */
|
|
|
+
|
|
|
+ public static RAWebView findWebViewByIdWithDelegate(Object object, int id) {
|
|
|
+
|
|
|
+ if (object != null) {
|
|
|
+
|
|
|
+ RAWebView webView = null;
|
|
|
+ if (object instanceof AppCompatActivity) {
|
|
|
+
|
|
|
+ webView = ((AppCompatActivity)object).findViewById(id);
|
|
|
+ } else if (object instanceof View) {
|
|
|
+
|
|
|
+ webView = ((View)object).findViewById(id);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (webView != null) {
|
|
|
+ webView.init();
|
|
|
+ return webView;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
|
|
|
public RAWebView(Context context) {
|
|
|
super(context);
|
|
|
@@ -73,84 +94,15 @@ public class RAWebView extends RelativeLayout {
|
|
|
}
|
|
|
|
|
|
private void initWebSetting() {
|
|
|
- //声明WebSettings子类
|
|
|
- WebSettings webSettings = mWebView.getSettings();
|
|
|
-
|
|
|
- //如果访问的页面中要与Javascript交互,则webview必须设置支持Javascript
|
|
|
- webSettings.setJavaScriptEnabled(true);
|
|
|
-// // 若加载的 html 里有JS 在执行动画等操作,会造成资源浪费(CPU、电量)
|
|
|
-// // 在 onStop 和 onResume 里分别把 setJavaScriptEnabled() 给设置成 false 和 true 即可
|
|
|
-//
|
|
|
-// //设置自适应屏幕,两者合用
|
|
|
-// webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小
|
|
|
-// webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小
|
|
|
-//
|
|
|
-// //缩放操作
|
|
|
-// webSettings.setSupportZoom(true); //支持缩放,默认为true。是下面那个的前提。
|
|
|
-// webSettings.setBuiltInZoomControls(true); //设置内置的缩放控件。若为false,则该WebView不可缩放
|
|
|
-// webSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件
|
|
|
-//
|
|
|
-// //其他细节操作
|
|
|
-// webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); //关闭webview中缓存
|
|
|
-// webSettings.setAllowFileAccess(true); //设置可以访问文件
|
|
|
-// webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
|
|
|
-// webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片
|
|
|
-// webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式
|
|
|
-
|
|
|
- hackWebJSMethod();
|
|
|
-// hackWebURL(); // 似乎不起作用
|
|
|
- }
|
|
|
+ if (mWebView != null) {
|
|
|
+ //声明WebSettings子类
|
|
|
+ WebSettings webSettings = mWebView.getSettings();
|
|
|
|
|
|
- private boolean canHack(String message) {
|
|
|
+ //如果访问的页面中要与Javascript交互,则webview必须设置支持Javascript
|
|
|
+ webSettings.setJavaScriptEnabled(true);
|
|
|
|
|
|
- if (delegate != null) {
|
|
|
- return delegate.webViewCanResponseJSAction(self, message);
|
|
|
+ hackWebJSMethod();
|
|
|
}
|
|
|
-
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- private void hackWebJSMethod() {
|
|
|
- mWebView.setWebChromeClient(new RAWebChromeClient());
|
|
|
- }
|
|
|
-
|
|
|
- private void hackWebURL() {
|
|
|
- mWebView.setWebViewClient(new WebViewClient() {
|
|
|
-
|
|
|
- @Override
|
|
|
- public boolean shouldOverrideUrlLoading(WebView view, String url) {
|
|
|
-
|
|
|
- if (canHack(url)) {
|
|
|
-
|
|
|
- Log.d(TAG, "shouldOverrideUrlLoading: " + url);
|
|
|
- if (delegate != null) {
|
|
|
- delegate.webViewPerformJSAction(self, url, null);
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- return super.shouldOverrideUrlLoading(view, url);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
|
|
|
-
|
|
|
- String url = request.getUrl().toString();
|
|
|
- if (canHack(url)) {
|
|
|
-
|
|
|
- Log.d(TAG, "shouldOverrideUrlLoading: " + url);
|
|
|
- if (delegate != null) {
|
|
|
- delegate.webViewPerformJSAction(self, url, null);
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- return super.shouldOverrideUrlLoading(view, request);
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
}
|
|
|
|
|
|
public void init() {
|
|
|
@@ -164,18 +116,42 @@ public class RAWebView extends RelativeLayout {
|
|
|
}
|
|
|
|
|
|
public void loadUrl(String url) {
|
|
|
- mWebView.loadUrl(url);
|
|
|
+ if (mWebView != null) {
|
|
|
+ mWebView.loadUrl(url);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
@SuppressLint("JavascriptInterface")
|
|
|
public void addJSInterface(Object object, String name) {
|
|
|
- mWebView.addJavascriptInterface(object, name);
|
|
|
+ if (mWebView != null) {
|
|
|
+ mWebView.addJavascriptInterface(object, name);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
public void removeJSInterface(String name) {
|
|
|
- mWebView.removeJavascriptInterface(name);
|
|
|
+ if (mWebView != null) {
|
|
|
+ mWebView.removeJavascriptInterface(name);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+
|
|
|
+ private boolean canHack(String message) {
|
|
|
+
|
|
|
+ if (delegate != null) {
|
|
|
+ return delegate.webViewCanResponseJSAction(self, message);
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ */
|
|
|
+
|
|
|
+ private void hackWebJSMethod() {
|
|
|
+ mWebView.setWebChromeClient(new RAWebChromeClient());
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* Hack Method
|
|
|
* */
|
|
|
@@ -185,26 +161,12 @@ public class RAWebView extends RelativeLayout {
|
|
|
@Override
|
|
|
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
|
|
|
|
|
|
- Log.d(TAG, "onJsPrompt: " + url + " Msg: " + message + " Value: " + defaultValue);
|
|
|
-
|
|
|
- if (canHack(message)) {
|
|
|
-
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
return super.onJsPrompt(view, url, message, defaultValue, result);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
|
|
|
|
|
|
- Log.d(TAG, "onJsAlert: " + url + " Msg: " + message);
|
|
|
-
|
|
|
- if(canHack(message)) {
|
|
|
-
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
return super.onJsAlert(view, url, message, result);
|
|
|
|
|
|
}
|
|
|
@@ -212,13 +174,6 @@ public class RAWebView extends RelativeLayout {
|
|
|
@Override
|
|
|
public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
|
|
|
|
|
|
- Log.d(TAG, "onJsConfirm: " + url + " Msg: " + message);
|
|
|
-
|
|
|
- if(canHack(message)) {
|
|
|
-
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
return super.onJsConfirm(view, url, message, result);
|
|
|
|
|
|
}
|
|
|
@@ -226,15 +181,6 @@ public class RAWebView extends RelativeLayout {
|
|
|
@Override
|
|
|
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
|
|
|
|
|
|
- String message = consoleMessage.message();
|
|
|
-
|
|
|
- Log.d(TAG, "onConsoleMessage: " + message);
|
|
|
-
|
|
|
- if(canHack(message)) {
|
|
|
-
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
return super.onConsoleMessage(consoleMessage);
|
|
|
|
|
|
}
|