WebActivity.kt 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. package com.jld.vod.view
  2. import android.content.Intent
  3. import android.os.Build
  4. import android.os.Bundle
  5. import android.view.KeyEvent
  6. import android.widget.LinearLayout
  7. import androidx.appcompat.app.AppCompatActivity
  8. import androidx.fragment.app.FragmentActivity
  9. import com.jld.vod.R
  10. import com.jld.vod.utils.LogUtils
  11. import com.just.agentweb.AgentWeb
  12. import kotlinx.android.synthetic.main.activity_web.*
  13. import java.lang.reflect.Constructor
  14. import java.lang.reflect.Field
  15. import java.lang.reflect.Method
  16. /**
  17. * @author ZhaoFuXin
  18. * @Email:18276061387@163.com
  19. * @description:
  20. * @date :2020/7/16 14:46
  21. */
  22. class WebActivity : AppCompatActivity() {
  23. private var mAgentWeb: AgentWeb? = null
  24. private var mLinearLayout : LinearLayout? = null
  25. // val mWebViewClient: WebViewClient = object : WebViewClient() {
  26. // override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
  27. // LogUtils.logD("url=="+url)
  28. // }
  29. // }
  30. //
  31. // val mWebChromeClient: WebChromeClient = object : WebChromeClient() {
  32. // override fun onProgressChanged(view: WebView?, newProgress: Int) {
  33. // //LogUtils.logD("newProgress=="+newProgress)
  34. // }
  35. // }
  36. override fun onCreate(savedInstanceState: Bundle?) {
  37. super.onCreate(savedInstanceState)
  38. hookWebViews()
  39. setContentView(R.layout.activity_web)
  40. val intnet = intent
  41. val url = intnet.getStringExtra("url")
  42. mLinearLayout = findViewById(R.id.ll_webview)
  43. mAgentWeb = AgentWeb.with(this)
  44. .setAgentWebParent(mLinearLayout!!, LinearLayout.LayoutParams(-1, -1))
  45. .useDefaultIndicator(-1,6)
  46. // .setWebChromeClient(mWebChromeClient)
  47. // .setWebViewClient(mWebViewClient)
  48. .createAgentWeb()
  49. .ready()
  50. .go(url)
  51. //后退
  52. iv_web_back.setOnClickListener {
  53. if ( mAgentWeb!!.getWebCreator().getWebView().canGoBack()) { // 表示按返回键时的操作
  54. mAgentWeb!!.getWebCreator().getWebView().goBack() // 后退
  55. }
  56. }
  57. //前进
  58. iv_web_go_forward.setOnClickListener {
  59. val webview = mAgentWeb!!.getWebCreator().getWebView()
  60. webview.goForward()//前进
  61. }
  62. //退出
  63. iv_web_exit.setOnClickListener {
  64. this.onBackPressed()
  65. // System.exit(0)
  66. }
  67. //回到主界面
  68. iv_web_home.setOnClickListener {
  69. startActivity(Intent(this,HomeActivity::class.java))
  70. finish()
  71. }
  72. //刷新
  73. iv_web_refresh.setOnClickListener {
  74. val webview = mAgentWeb!!.getWebCreator().getWebView()
  75. webview.reload() //刷新
  76. }
  77. }
  78. override fun onPause() {
  79. mAgentWeb!!.webLifeCycle.onPause()
  80. super.onPause()
  81. }
  82. override fun onResume() {
  83. mAgentWeb!!.webLifeCycle.onResume()
  84. super.onResume()
  85. }
  86. override fun onDestroy() {
  87. mAgentWeb!!.webLifeCycle.onDestroy()
  88. super.onDestroy()
  89. }
  90. override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
  91. return if (mAgentWeb!!.handleKeyEvent(keyCode, event)) { true }
  92. else super.onKeyDown(keyCode, event)
  93. }
  94. private fun hookWebView() {
  95. var factoryClass: Class<*>? = null
  96. try {
  97. factoryClass = Class.forName("android.webkit.WebViewFactory")
  98. var getProviderClassMethod: Method? = null
  99. var sProviderInstance: Any? = null
  100. LogUtils.logD("Build.VERSION.SDK_INT="+Build.VERSION.SDK_INT)
  101. if (Build.VERSION.SDK_INT === 23) {
  102. getProviderClassMethod = factoryClass.getDeclaredMethod("getProviderClass")
  103. getProviderClassMethod.setAccessible(true)
  104. val providerClass =
  105. getProviderClassMethod.invoke(factoryClass) as Class<*>
  106. val delegateClass =
  107. Class.forName("android.webkit.WebViewDelegate")
  108. val constructor: Constructor<*> = providerClass.getConstructor(delegateClass)
  109. if (constructor != null) {
  110. constructor.setAccessible(true)
  111. val constructor2: Constructor<*> = delegateClass.getDeclaredConstructor()
  112. constructor2.setAccessible(true)
  113. sProviderInstance = constructor.newInstance(constructor2.newInstance())
  114. }
  115. } else if (Build.VERSION.SDK_INT === 22) {
  116. getProviderClassMethod = factoryClass.getDeclaredMethod("getFactoryClass")
  117. getProviderClassMethod.setAccessible(true)
  118. val providerClass =
  119. getProviderClassMethod.invoke(factoryClass) as Class<*>
  120. val delegateClass =
  121. Class.forName("android.webkit.WebViewDelegate")
  122. val constructor: Constructor<*> = providerClass.getConstructor(delegateClass)
  123. if (constructor != null) {
  124. constructor.setAccessible(true)
  125. val constructor2: Constructor<*> = delegateClass.getDeclaredConstructor()
  126. constructor2.setAccessible(true)
  127. sProviderInstance = constructor.newInstance(constructor2.newInstance())
  128. }
  129. } else if (Build.VERSION.SDK_INT === 21) { // Android 21无WebView安全限制
  130. getProviderClassMethod = factoryClass.getDeclaredMethod("getFactoryClass")
  131. getProviderClassMethod.setAccessible(true)
  132. val providerClass =
  133. getProviderClassMethod.invoke(factoryClass) as Class<*>
  134. sProviderInstance = providerClass.newInstance()
  135. }
  136. if (sProviderInstance != null) {
  137. val field: Field = factoryClass.getDeclaredField("sProviderInstance")
  138. field.setAccessible(true)
  139. field.set("sProviderInstance", sProviderInstance)
  140. }
  141. } catch (e: Exception) {
  142. e.printStackTrace()
  143. }
  144. }
  145. fun hookWebViews() {
  146. val sdkInt = Build.VERSION.SDK_INT
  147. try {
  148. val factoryClass = Class.forName("android.webkit.WebViewFactory")
  149. val field = factoryClass.getDeclaredField("sProviderInstance")
  150. field.isAccessible = true
  151. var sProviderInstance = field[null]
  152. if (sProviderInstance != null) {
  153. LogUtils.logD("sProviderInstance isn't null")
  154. return
  155. }
  156. val getProviderClassMethod: Method
  157. getProviderClassMethod = if (sdkInt > 22) {
  158. factoryClass.getDeclaredMethod("getProviderClass")
  159. } else if (sdkInt == 22) {
  160. factoryClass.getDeclaredMethod("getFactoryClass")
  161. } else {
  162. LogUtils.logD( "Don't need to Hook WebView")
  163. return
  164. }
  165. getProviderClassMethod.isAccessible = true
  166. val providerClass = getProviderClassMethod.invoke(factoryClass) as Class<*>
  167. val delegateClass = Class.forName("android.webkit.WebViewDelegate")
  168. val providerConstructor = providerClass.getConstructor(delegateClass)
  169. if (providerConstructor != null) {
  170. providerConstructor.isAccessible = true
  171. val declaredConstructor = delegateClass.getDeclaredConstructor()
  172. declaredConstructor.isAccessible = true
  173. sProviderInstance = providerConstructor.newInstance(declaredConstructor.newInstance())
  174. field["sProviderInstance"] = sProviderInstance
  175. }
  176. LogUtils.logD( "Hook done!")
  177. } catch (e: Throwable) {
  178. }
  179. }
  180. }