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 是不是可用?的主要内容,如果未能解决你的问题,请参考以下文章
检查 Android WebView 是不是正在使用触摸事件
如何检查 webview YouTube 视频播放器是不是已启动