| | |
| | | package safeluck.drive.evaluation.fragment; |
| | | |
| | | import android.os.Build; |
| | | import android.os.Bundle; |
| | | |
| | | import android.view.Gravity; |
| | | import android.util.Log; |
| | | import android.view.LayoutInflater; |
| | | import android.view.View; |
| | | import android.view.ViewGroup; |
| | | import android.widget.TextView; |
| | | |
| | | import androidx.annotation.NonNull; |
| | | import androidx.annotation.Nullable; |
| | | |
| | | import com.anyun.exam.lib.MyLog; |
| | | import com.tencent.smtt.export.external.interfaces.SslError; |
| | | import com.tencent.smtt.export.external.interfaces.SslErrorHandler; |
| | | import com.tencent.smtt.export.external.interfaces.WebResourceRequest; |
| | | import com.tencent.smtt.export.external.interfaces.WebResourceResponse; |
| | | import com.tencent.smtt.sdk.WebSettings; |
| | | import com.tencent.smtt.sdk.WebView; |
| | | import com.tencent.smtt.sdk.WebViewClient; |
| | | |
| | | import java.lang.reflect.Constructor; |
| | | import java.lang.reflect.Field; |
| | | import java.lang.reflect.Method; |
| | | |
| | | import me.yokeyword.fragmentation.SupportFragment; |
| | | |
| | |
| | | return vpFragment; |
| | | } |
| | | |
| | | private String url = "http://192.168.40.202:9527/#/visitor/monitor?device_id=0314200100000002"; |
| | | private String url1 = "http://www.baidu.com"; |
| | | private static final String TAG = VPFragment.class.getCanonicalName(); |
| | | |
| | | @Nullable |
| | | @Override |
| | | public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { |
| | | TextView textView = new TextView(_mActivity); |
| | | hookWebView(); |
| | | WebView webView = new WebView(_mActivity); |
| | | ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); |
| | | textView.setGravity(Gravity.CENTER); |
| | | textView.setLayoutParams(layoutParams); |
| | | webView.setLayoutParams(layoutParams); |
| | | Bundle bundle = getArguments(); |
| | | if (bundle != null){ |
| | | |
| | | textView.setText(bundle.getString("argu")); |
| | | }else |
| | | textView.setText("kong"); |
| | | return textView; |
| | | }else{ |
| | | |
| | | } |
| | | WebSettings webSettings = webView.getSettings(); |
| | | |
| | | |
| | | webSettings.setDomStorageEnabled(true); |
| | | webSettings.setAppCacheMaxSize(1024*1024*8);//存储的最大容量 |
| | | String appCachePath = _mActivity.getCacheDir().getAbsolutePath(); |
| | | webSettings.setAppCachePath(appCachePath); |
| | | webSettings.setAllowFileAccess(true); |
| | | webSettings.setAppCacheEnabled(true); |
| | | webSettings.setJavaScriptEnabled(true); |
| | | webSettings.setJavaScriptCanOpenWindowsAutomatically(true); |
| | | webView.loadUrl(url); |
| | | webView.setWebViewClient(new WebViewClient(){ |
| | | @Override |
| | | public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { |
| | | view.loadUrl(url); |
| | | return true; |
| | | } |
| | | |
| | | @Override |
| | | public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) { |
| | | super.onReceivedHttpError(view, request, errorResponse); |
| | | Log.i(TAG,errorResponse.getReasonPhrase()); |
| | | } |
| | | |
| | | @Override |
| | | public void onReceivedSslError(WebView webView, SslErrorHandler sslErrorHandler, SslError sslError) { |
| | | super.onReceivedSslError(webView, sslErrorHandler, sslError); |
| | | sslErrorHandler.proceed(); |
| | | } |
| | | }); |
| | | return webView; |
| | | } |
| | | public static void hookWebView() { |
| | | int sdkInt = Build.VERSION.SDK_INT; |
| | | try { |
| | | Class<?> factoryClass = Class.forName("android.webkit.WebViewFactory"); |
| | | Field field = factoryClass.getDeclaredField("sProviderInstance"); |
| | | field.setAccessible(true); |
| | | Object sProviderInstance = field.get(null); |
| | | if (sProviderInstance != null) { |
| | | MyLog.i("sProviderInstance isn't null"); |
| | | return; |
| | | } |
| | | Method getProviderClassMethod; |
| | | if (sdkInt > 22) { |
| | | getProviderClassMethod = factoryClass.getDeclaredMethod("getProviderClass"); |
| | | } else if (sdkInt == 22) { |
| | | getProviderClassMethod = factoryClass.getDeclaredMethod("getFactoryClass"); |
| | | } else { |
| | | MyLog.i("Don't need to Hook WebView"); |
| | | return; |
| | | } |
| | | getProviderClassMethod.setAccessible(true); |
| | | Class<?> providerClass = (Class<?>) getProviderClassMethod.invoke(factoryClass); |
| | | Class<?> delegateClass = Class.forName("android.webkit.WebViewDelegate"); |
| | | Constructor<?> providerConstructor = providerClass.getConstructor(delegateClass); |
| | | if (providerConstructor != null) { |
| | | providerConstructor.setAccessible(true); |
| | | Constructor<?> declaredConstructor = delegateClass.getDeclaredConstructor(); |
| | | declaredConstructor.setAccessible(true); |
| | | sProviderInstance = providerConstructor.newInstance(declaredConstructor.newInstance()); |
| | | MyLog.i("sProviderInstance:{}", sProviderInstance); |
| | | field.set("sProviderInstance", sProviderInstance); |
| | | } |
| | | MyLog.i("Hook done!"); |
| | | } catch (Throwable e) { |
| | | MyLog.i(e); |
| | | } |
| | | } |
| | | } |