以编程方式获取WebView实现

时间:2017-11-30 15:57:37

标签: java android reflection webview android-webview

用户可以选择使用哪个WebView实现,如here所述。是否有可能以编程方式确定他们选择的实现方式?我知道get the User-Agent string以编程方式可以实现这一点,但这并不完全相同。

enter image description here

enter image description here

在上面的例子中,我想知道" Chrome Stable"已被选为WebView实现。在某些用户设备上,显然还有一个选项可以选择" Android WebView"从列表中,即使Chrome也是一个选项,即使在系统应用列表中禁用了Android WebView。

这很令人不安,因为大概Android系统WebView将不再接收更新(它将在过去停留),而Chrome将接收更新,并且是更适合作为WebView实现的选择。更令人不安的是因为WebView实现的选择完全隐藏在普通用户之外。

所以我想特别了解" Android WebView"已被选中,即使对于Android 7.0+而言,选择Chrome也会more appropriate

编辑...以下是我的一位用户在Android 7.0上的选择屏幕,显示了" Android WebView"和" Chrome"是选项...并且用户99%确定" Android WebView"是默认的(由一个古老的Chrome 51.0.2704.91提供动力)......如果我们没有追踪到它,我们会无限期地停留在这个位置上:

enter image description here

2 个答案:

答案 0 :(得分:2)

尝试" adb shell设置列表全局" 您将获得类似" webview_provider = com.chrome.beta " 然后,您可以使用" dumpsys包 com.chrome.beta | grep versionName"获取chrome版本!(取决于webview_provider的packageName)

如果你无法获得webview_provider = ....,也许这意味着你无法在设置中设置webview实现。

答案 1 :(得分:1)

从SDK 26引入了一个新的API - WebView#getCurrentWebViewPackage()

  

如果WebView已加载到当前进程中,则此方法将返回用于加载它的包。否则,将返回当前加载WebView时将使用的包;这不会导致WebView被加载,因此此信息可能随时变得过时。当WebView包更新,禁用或卸载时,WebView包会更改。它也可以通过开发人员设置进行更改。如果WebView包更改,则任何已加载W​​ebView的应用进程都将被终止。下次应用启动并加载WebView时,它将使用新的WebView包。

从API 25开始,not possible选择“Android System WebView”:

API 25

API 26

关于你的问题:

  

所以我想知道是否选择了“Android System WebView”,即使对于Android 7.0 +

也是如此

我看不出如何为Android 7.0+选择“Android System WebView”。 对于早期版本,显然,您无法使用getCurrentWebViewPackage() API,它可用于API 26。我已经查看了该方法的实现,并找到了这段代码,它将提供所需的输出:


    Class webViewFactory = Class.forName("android.webkit.WebViewFactory");
    Method method = webViewFactory.getMethod("getLoadedPackageInfo");
    PackageInfo packageInfo = (PackageInfo) method.invoke(null, null);

    if ("com.android.webview".equals(packageInfo.packageName)) {
        // "Android System WebView" is selected
    } else {
        // something else selected
        // in case of chrome it would be "com.android.chrome"
    }