| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- package com.jld.vod.view
- import android.content.Intent
- import android.os.Build
- import android.os.Bundle
- import android.view.KeyEvent
- import android.widget.LinearLayout
- import androidx.appcompat.app.AppCompatActivity
- import androidx.fragment.app.FragmentActivity
- import com.jld.vod.R
- import com.jld.vod.utils.LogUtils
- import com.just.agentweb.AgentWeb
- import kotlinx.android.synthetic.main.activity_web.*
- import java.lang.reflect.Constructor
- import java.lang.reflect.Field
- import java.lang.reflect.Method
- /**
- * @author ZhaoFuXin
- * @Email:18276061387@163.com
- * @description:
- * @date :2020/7/16 14:46
- */
- class WebActivity : AppCompatActivity() {
- private var mAgentWeb: AgentWeb? = null
- private var mLinearLayout : LinearLayout? = null
- // val mWebViewClient: WebViewClient = object : WebViewClient() {
- // override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
- // LogUtils.logD("url=="+url)
- // }
- // }
- //
- // val mWebChromeClient: WebChromeClient = object : WebChromeClient() {
- // override fun onProgressChanged(view: WebView?, newProgress: Int) {
- // //LogUtils.logD("newProgress=="+newProgress)
- // }
- // }
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- hookWebViews()
- setContentView(R.layout.activity_web)
- val intnet = intent
- val url = intnet.getStringExtra("url")
- mLinearLayout = findViewById(R.id.ll_webview)
- mAgentWeb = AgentWeb.with(this)
- .setAgentWebParent(mLinearLayout!!, LinearLayout.LayoutParams(-1, -1))
- .useDefaultIndicator(-1,6)
- // .setWebChromeClient(mWebChromeClient)
- // .setWebViewClient(mWebViewClient)
- .createAgentWeb()
- .ready()
- .go(url)
- //后退
- iv_web_back.setOnClickListener {
- if ( mAgentWeb!!.getWebCreator().getWebView().canGoBack()) { // 表示按返回键时的操作
- mAgentWeb!!.getWebCreator().getWebView().goBack() // 后退
- }
- }
- //前进
- iv_web_go_forward.setOnClickListener {
- val webview = mAgentWeb!!.getWebCreator().getWebView()
- webview.goForward()//前进
- }
- //退出
- iv_web_exit.setOnClickListener {
- this.onBackPressed()
- // System.exit(0)
- }
- //回到主界面
- iv_web_home.setOnClickListener {
- startActivity(Intent(this,HomeActivity::class.java))
- finish()
- }
- //刷新
- iv_web_refresh.setOnClickListener {
- val webview = mAgentWeb!!.getWebCreator().getWebView()
- webview.reload() //刷新
- }
- }
- override fun onPause() {
- mAgentWeb!!.webLifeCycle.onPause()
- super.onPause()
- }
- override fun onResume() {
- mAgentWeb!!.webLifeCycle.onResume()
- super.onResume()
- }
- override fun onDestroy() {
- mAgentWeb!!.webLifeCycle.onDestroy()
- super.onDestroy()
- }
- override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
- return if (mAgentWeb!!.handleKeyEvent(keyCode, event)) { true }
- else super.onKeyDown(keyCode, event)
- }
- private fun hookWebView() {
- var factoryClass: Class<*>? = null
- try {
- factoryClass = Class.forName("android.webkit.WebViewFactory")
- var getProviderClassMethod: Method? = null
- var sProviderInstance: Any? = null
- LogUtils.logD("Build.VERSION.SDK_INT="+Build.VERSION.SDK_INT)
- if (Build.VERSION.SDK_INT === 23) {
- getProviderClassMethod = factoryClass.getDeclaredMethod("getProviderClass")
- getProviderClassMethod.setAccessible(true)
- val providerClass =
- getProviderClassMethod.invoke(factoryClass) as Class<*>
- val delegateClass =
- Class.forName("android.webkit.WebViewDelegate")
- val constructor: Constructor<*> = providerClass.getConstructor(delegateClass)
- if (constructor != null) {
- constructor.setAccessible(true)
- val constructor2: Constructor<*> = delegateClass.getDeclaredConstructor()
- constructor2.setAccessible(true)
- sProviderInstance = constructor.newInstance(constructor2.newInstance())
- }
- } else if (Build.VERSION.SDK_INT === 22) {
- getProviderClassMethod = factoryClass.getDeclaredMethod("getFactoryClass")
- getProviderClassMethod.setAccessible(true)
- val providerClass =
- getProviderClassMethod.invoke(factoryClass) as Class<*>
- val delegateClass =
- Class.forName("android.webkit.WebViewDelegate")
- val constructor: Constructor<*> = providerClass.getConstructor(delegateClass)
- if (constructor != null) {
- constructor.setAccessible(true)
- val constructor2: Constructor<*> = delegateClass.getDeclaredConstructor()
- constructor2.setAccessible(true)
- sProviderInstance = constructor.newInstance(constructor2.newInstance())
- }
- } else if (Build.VERSION.SDK_INT === 21) { // Android 21无WebView安全限制
- getProviderClassMethod = factoryClass.getDeclaredMethod("getFactoryClass")
- getProviderClassMethod.setAccessible(true)
- val providerClass =
- getProviderClassMethod.invoke(factoryClass) as Class<*>
- sProviderInstance = providerClass.newInstance()
- }
- if (sProviderInstance != null) {
- val field: Field = factoryClass.getDeclaredField("sProviderInstance")
- field.setAccessible(true)
- field.set("sProviderInstance", sProviderInstance)
- }
- } catch (e: Exception) {
- e.printStackTrace()
- }
- }
- fun hookWebViews() {
- val sdkInt = Build.VERSION.SDK_INT
- try {
- val factoryClass = Class.forName("android.webkit.WebViewFactory")
- val field = factoryClass.getDeclaredField("sProviderInstance")
- field.isAccessible = true
- var sProviderInstance = field[null]
- if (sProviderInstance != null) {
- LogUtils.logD("sProviderInstance isn't null")
- return
- }
- val getProviderClassMethod: Method
- getProviderClassMethod = if (sdkInt > 22) {
- factoryClass.getDeclaredMethod("getProviderClass")
- } else if (sdkInt == 22) {
- factoryClass.getDeclaredMethod("getFactoryClass")
- } else {
- LogUtils.logD( "Don't need to Hook WebView")
- return
- }
- getProviderClassMethod.isAccessible = true
- val providerClass = getProviderClassMethod.invoke(factoryClass) as Class<*>
- val delegateClass = Class.forName("android.webkit.WebViewDelegate")
- val providerConstructor = providerClass.getConstructor(delegateClass)
- if (providerConstructor != null) {
- providerConstructor.isAccessible = true
- val declaredConstructor = delegateClass.getDeclaredConstructor()
- declaredConstructor.isAccessible = true
- sProviderInstance = providerConstructor.newInstance(declaredConstructor.newInstance())
- field["sProviderInstance"] = sProviderInstance
- }
- LogUtils.logD( "Hook done!")
- } catch (e: Throwable) {
- }
- }
- }
|