webview 에 android.uid.system 을 추가 한 후 오류 보고 문 제 를 해결 합 니 다.
3757 단어 kotlin
class FaqActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStatusNavBarColor(Color.TRANSPARENT, Color.WHITE)
with(window) {
decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR or View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR
clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
}
hookWebView()
setContentView(R.layout.activity_faq)
initView()
}
private fun initView() {
faqWeb.loadUrl("https://www.baidu.com/")
faqWeb.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
return false
}
}
}
fun hookWebView() {
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.get(null)
if (sProviderInstance != null) {
Log.i("ww", "sProviderInstance isn't null")
return
}
val getProviderClassMethod: Method
getProviderClassMethod = when {
sdkInt > 22 -> factoryClass.getDeclaredMethod("getProviderClass")
sdkInt == 22 -> factoryClass.getDeclaredMethod("getFactoryClass")
else -> {
Log.i("ww", "Don't need to Hook WebView")
return
}
}
getProviderClassMethod.isAccessible = true
val factoryProviderClass = getProviderClassMethod.invoke(factoryClass) as Class
val delegateClass = Class.forName("android.webkit.WebViewDelegate")
val delegateConstructor = delegateClass.getDeclaredConstructor()
delegateConstructor.isAccessible = true
if (sdkInt < 26) {// Android O
val providerConstructor = factoryProviderClass.getConstructor(delegateClass)
if (providerConstructor != null) {
providerConstructor.isAccessible = true
sProviderInstance = providerConstructor.newInstance(delegateConstructor.newInstance())
}
} else {
val chromiumMethodName = factoryClass.getDeclaredField("CHROMIUM_WEBVIEW_FACTORY_METHOD")
chromiumMethodName.isAccessible = true
var chromiumMethodNameStr: String? = chromiumMethodName.get(null) as String
if (chromiumMethodNameStr == null) {
chromiumMethodNameStr = "create"
}
val staticFactory = factoryProviderClass.getMethod(chromiumMethodNameStr, delegateClass)
if (staticFactory != null) {
sProviderInstance = staticFactory.invoke(null, delegateConstructor.newInstance())
}
}
if (sProviderInstance != null) {
field.set("sProviderInstance", sProviderInstance)
Log.i("ww", "Hook success!")
} else {
Log.i("ww", "Hook failed!")
}
} catch (e: Throwable) {
Log.w("ww", e)
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 실험, 에피소드 1a String 의 중심에 있는 문자를 반환하는 메서드를 작성하려는 경우 Java에서 가장 좋은 옵션은 유틸리티 클래스를 정의하는 것입니다. Kotlin을 사용하면 을 통해 기존 클래스에 새 메서드를 추가할 수 있습...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.