android – 如何检查 webview 是不是可用?

Posted

技术标签:

【中文标题】android – 如何检查 webview 是不是可用?【英文标题】:android – How to check if webview is available?android – 如何检查 webview 是否可用? 【发布时间】:2017-10-10 13:29:59 【问题描述】:

有没有办法检查设备上的 webview 是否可用?

背景: 如果我将<uses-feature android:name="android.software.webview"/> 添加到清单中,Google Play 上支持的设备数量将从 12,000 多台下降到 6,000 台以下。所以我在这个功能中添加了android:required="false"。如果 webview 可用,网站应显示在应用程序内,否则将在默认浏览器中启动:

String mUrl = "http://www.example.com";
if (*** WHAT TO PUT HERE? ***) 
    WebView webview = (WebView) findViewById(R.id.webView);
    if (Build.VERSION.SDK_INT >= 24) 
        webview.setWebViewClient(new WebViewClient() 
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) 
                view.loadUrl(request.toString());
                return false;
            
        );
     else 
        webview.setWebViewClient(new WebViewClient() 
            @SuppressWarnings("deprecation")
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) 
                view.loadUrl(url);
                return false;
            
        );
    
    webview.loadUrl(mUrl);
 else 
    Uri uri = Uri.parse(mUrl);
    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
    startActivity(intent);

编辑(为了清楚起见):<uses-permission android:name="android.permission.INTERNET" /> 是(并且一直是)清单的一部分。只是添加了<uses-feature android:name="android.software.webview" /> 导致支持的设备下降。

这里有人遇到同样的问题:https://issuetracker.google.com/issues/37035282 (很遗憾没有回答)

【问题讨论】:

【参考方案1】:

虽然@vsatkh 指出不一定要按要求声明此功能,但您可以通过以下方式检查设备的功能兼容性:

getPackageManager().hasSystemFeature("android.software.webview")

此方法返回真或假。

有关 Google Play 过滤的一些附加信息: Google Play 仅根据清单中声明的​​ <uses-feature> 元素过滤支持的设备。 <uses-permission> 元素不会影响 Google Play 的过滤,除非它们暗示某项功能。 android.permission.INTERNET 不暗示任何功能。此处列出了暗示功能的权限: https://developer.android.com/guide/topics/manifest/uses-feature-element.html#permissions

【讨论】:

使用 API 20 及更高版本,您可以使用 PackageManager.FEATURE_WEBVIEW 代替硬编码字符串。【参考方案2】:

替代方案:val hasWebView: Boolean = kotlin.runCatching CookieManager.getInstance() .isSuccess

它之所以有效,是因为如果 WebView 不可用,那么 CookieManager.getInstance() 将抛出 AndroidRuntimeException

getPackageManager().hasSystemFeature("android.software.webview") 不可靠。如果设备应该有 webview,但在系统设置中禁用它,它将返回 true。

我在华为 P20 上进行了测试,方法是转到设置 -> 应用程序 -> Android 系统 WebView -> 禁用

【讨论】:

在 Android 10 和 11 中测试。它有效!。添加了您的代码的 Java 版本。【参考方案3】:

您可以在此处阅读更多详细信息https://source.android.com/compatibility/android-cdd.pdf。

根据 WebView 兼容性部分,android.software.webview 功能表明设备或 oem 必须提供 android.webkit.WebView API 的完整实现。所以 Play Store 上的设备数量减少了,因为实际上,大多数设备并没有完全实现 webkit 所需的所有 api。

因此,如果您的网页内容需要某些 html5 功能,请在此处查看 http://mobilehtml5.org/ 如果您的应用针对 kitkat 甚至棒棒糖+,那么您应该是安全的。

所以没有必要声明 android.software.webview 功能,除非你的网页内容真的需要 webkit 的所有 api。

【讨论】:

【参考方案4】:

有一种解决方法:CookieManager

AFAIK:没有专门的 API 可以为您提供信息。但是有办法解决。

正如 Torkel 提到的,getPackageManager().hasSystemFeature(..) 不保证告诉 Android 系统 WebView 是启用还是禁用。

即使用户在设置中禁用 WebView,getPackageManager().hasSystemFeature(..) 仍会返回 true。

Cookie 管理器

所以另一种选择是使用CookieManager。应用程序 WebView cookie 由 CookieManager 管理。如果我们在禁用 WebView 时尝试创建 CookieManager 实例,则会引发异常。

在 Kotlin 中,您可以从块语句中获取结果,但在 Java 中是不可能的。因此,您可以将此函数与异常处理逻辑一起使用。

public boolean webViewEnabled()

    try

       CookieManager.getInstance();
       return true;

    catch(Exception e)

       return false;

    


注意:

当前的实现可能会在未来发生变化,或者他们可能会提出一个我们将在未来使用的专用函数。我试图在许多论坛中找到一个完美的解决方案,但这是我所达到的最接近的。此解决方案将防止您的应用崩溃,但您仍会在日志中看到错误,因为 CookieManager.getInstance 会引发 Exception 对象。

【讨论】:

【参考方案5】:

WebView 已在 Android API 1 中提供,因此它始终可用,不是互联网连接 https://developer.android.com/reference/android/webkit/WebView.html 在您的清单中,您需要互联网许可:

<uses-permission android:name="android.permission.INTERNET" />

【讨论】:

当然。此权限已成为清单的一部分。如果 webview 始终可用,为什么支持的设备数量会下降? WebView 并不总是可用。 例如在WebView 更新安装期间 - 可能随时自动触发(如果在商店应用中设置了自动更新),即使在使用WebView 的其他应用运行期间也是如此。我读过一些从未使用过的 Android 版本(10?)正在通过在某些背景下安装(任何应用程序的)更新来解决这个问题,并且只有在不使用应用程序时才会将旧包替换为新包

以上是关于android – 如何检查 webview 是不是可用?的主要内容,如果未能解决你的问题,请参考以下文章

检查url是不是被缓存webview android

检查 Android WebView 是不是正在使用触摸事件

检查文件是不是已经存在于webview缓存android中

如何检查 webview YouTube 视频播放器是不是已启动

Android - 检查元素是不是存在于 WebView 中(在 DOM 中)

XCUITest - 如何检查 webview 是不是已更新其内容?