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

Emi*_*Adz 5 android webview webviewclient

我正在为Android开发SDK。作为此SDK的一部分,我需要将自己的应用程序设置WebViewClient为WebView将WebView 和SDK集成在一起的应用程序的(而不是我的SDK的一部分)。

因此,WebView可能已经使用设置了它WebViewClient,在这种情况下,我需要WebViewClient从WebView我自己的集合中获取此实例,WebViewClient并将其回调方法转发WebViewCleint给开发人员设置的最初配置的方法该应用程序。

我注意到从API V26开始,该类有一个getWebViewClient方法WebView。但显然,我也在寻找在以前的版本中执行此操作的方法。也许有一些使用支持库的方法吗?

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

Emi*_*Adz 1

我设法使用反射获取 WebViewClient 的实例,如下所示:

Object providerInstance = getProviderInstance();
Object contentsClientAdapter = getContentsClientAdapter(providerInstance);
Object webViewClient = getWebViewClientFromClientAdapter(contentsClientAdapter);
if (webViewClient instanceof WebViewClient) {
    mPreviousWebViewClient = (WebViewClient) webViewClient;
}
Run Code Online (Sandbox Code Playgroud)

这些是深入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;
}
Run Code Online (Sandbox Code Playgroud)

但我真的希望找到另一种方法来做到这一点。不易破损的东西。