【问题标题】: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 (很遗憾没有回答)

【问题讨论】:

    标签: android webview


    【解决方案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?)正在通过在某些背景下安装(任何应用程序的)更新来解决这个问题,并且只有在不使用应用程序时才会将旧包替换为新包
        猜你喜欢
        • 1970-01-01
        • 2016-05-04
        • 1970-01-01
        • 2015-12-14
        • 1970-01-01
        • 1970-01-01
        • 2018-06-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多