用户可以选择使用哪个WebView实现,如here所述。是否有可能以编程方式确定他们选择的实现方式?我知道get the User-Agent string以编程方式可以实现这一点,但这并不完全相同。
在上面的例子中,我想知道" 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提供动力)......如果我们没有追踪到它,我们会无限期地停留在这个位置上:
答案 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
包更改,则任何已加载WebView的应用进程都将被终止。下次应用启动并加载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"
}