gpt4 book ai didi

android - 如何从 WebView 获取 WebviewClient 实例而不是在 Android 的 API 26 上?

转载 作者:太空狗 更新时间:2023-10-29 14:41:42 26 4
gpt4 key购买 nike

我正在开发适用于 Android 的 SDK。作为此 SDK 的一部分,我需要设置自己的 WebViewClientWebView WebView 的应用程序和 SDK 是集成的(意味着不是我的 SDK 的一部分)。

因此,这 WebView可能已经设置了 WebViewClient在这种情况下,我需要获取此 WebViewClient 的实例来自 WebView设置我自己的 WebViewClient并转发我的 WebViewCleint 的回调方法为应用开发者设置的最初配置。

我注意到 API V26 中有一个 getWebViewClient WebView 的方法类(class)。但显然,我也在寻找一种在以前的版本上执行此操作的方法。也许有某种方法可以使用支持库来做到这一点?

有人知道如何在旧版本的 WebView 中获取 set WebViewClient 的实例吗?使用反射或任何其他方法?

最佳答案

我设法像这样使用反射获取 WebViewClient 的实例:

Object providerInstance = getProviderInstance();
Object contentsClientAdapter = getContentsClientAdapter(providerInstance);
Object webViewClient = getWebViewClientFromClientAdapter(contentsClientAdapter);
if (webViewClient instanceof WebViewClient) {
mPreviousWebViewClient = (WebViewClient) webViewClient;
}

这些是深入WebView对象以获取WebViewClient对象的三种方法:

public Object getProviderInstance() {
Object returnValue = null;
try {
Class<? extends WebView> mWebViewClass = mWebView.getClass();
Field providerField = mWebViewClass.getDeclaredField("mProvider");
providerField.setAccessible(true);
Object mProvider = providerField.get(mWebView);
returnValue = mProvider;

} catch (NoSuchFieldException aE) {
aE.printStackTrace();
} catch (IllegalAccessException aE) {
aE.printStackTrace();
}

return returnValue;
}


private Object getContentsClientAdapter(Object aProviderInstance) {
Object returnValue = null;
try {
Class<?> aClass = aProviderInstance.getClass();
Field contentsClientAdapterField = aClass.getDeclaredField("mContentsClientAdapter");
contentsClientAdapterField.setAccessible(true);
Object mContentsClientAdapter = contentsClientAdapterField.get(aProviderInstance);
returnValue = mContentsClientAdapter;

} catch (NoSuchFieldException aE) {
aE.printStackTrace();
} catch (IllegalAccessException aE) {
aE.printStackTrace();
}

return returnValue;
}


private Object getWebViewClientFromClientAdapter(Object aContentsClientAdapter) {
Object returnValue = null;
try {
Class<?> aClass = aContentsClientAdapter.getClass();
Field WebViewClientField = aClass.getDeclaredField("mWebViewClient");
WebViewClientField.setAccessible(true);
Object mWebViewClient = WebViewClientField.get(aContentsClientAdapter);
returnValue = mWebViewClient;

} catch (NoSuchFieldException aE) {
aE.printStackTrace();
} catch (IllegalAccessException aE) {
aE.printStackTrace();
}

return returnValue;
}

但我真的希望找到某种另一种方法来做同样的事情。不易破损的东西。

关于android - 如何从 WebView 获取 WebviewClient 实例而不是在 Android 的 API 26 上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47016686/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com