java - 以编程方式获取 WebView 实现

标签 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+ 的情况下也是如此more appropriate而是选择了 Chrome。

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

enter image description here

最佳答案

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

If WebView has already been loaded into the current process this method will return the package that was used to load it. Otherwise, the package that would be used if the WebView was loaded right now will be returned; this does not cause WebView to be loaded, so this information may become outdated at any time. The WebView package changes either when the current WebView package is updated, disabled, or uninstalled. It can also be changed through a Developer Setting. If the WebView package changes, any app process that has loaded WebView will be killed. The next time the app starts and loads WebView it will use the new WebView package instead.

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

API 25

API 26

关于你的问题:

So I want to know particularly if "Android System WebView" is selected, even for 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"
    }

关于java - 以编程方式获取 WebView 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47577525/

相关文章:

android - HTML 电子邮件中的背景图像无法在 Android 6.0 和 4.4 上正确呈现

reflection - 如何使用 Groovy 获取没有继承方法的类的所有方法名称?

Java,通过反射记录方法名称

java - 使用方法句柄转发对功能接口(interface)的调用

java - 使用内部联接查询运行 count() 时,Room 返回包含一项的列表,而不是空列表

java - Java中通过SSH2的远程主机文件操作

java - GridBagLayout:最后一个组件影响网格宽度

java - 当我在 ControllerAdvice 中有 RuntimeException 的 ExceptionHandler 时,spring AccessDeniedHandler 接口(interface)不会被调用?

java - Jackson Json 序列化器附加内部属性

Android 人脸检测仅适用于可绘制对象,不适用于 SD 卡中的图像