是否有办法检查设备上是否有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(很遗憾未回答)
5条答案
按热度按时间zaqlnxep1#
虽然@vsatkh指出,不一定需要按要求声明此功能,但可以按如下方式检查设备的功能兼容性:
此方法返回true或false。
有关Google Play过滤功能的其他信息:Google Play仅根据清单文件中声明的
<uses-feature>
元素过滤受支持的设备。<uses-permission>
元素不会影响Google Play的过滤功能,除非它们隐含了某项功能。android.permission.INTERNET
不隐含任何功能。隐含功能的权限如下所示:https://developer.android.com/guide/topics/manifest/uses-feature-element.html#permissionsgmxoilav2#
替代解决方案:
val hasWebView: Boolean = kotlin.runCatching { CookieManager.getInstance() }.isSuccess
它之所以有效,是因为如果WebView不可用,那么
CookieManager.getInstance()
将抛出AndroidRuntimeException
。getPackageManager().hasSystemFeature("android.software.webview")
不可靠。如果设备应该有webview,但在系统设置中禁用了它,则它将返回true。我在华为P20上测试了一下,设置-〉应用-〉安卓系统WebView-〉禁用
lf5gs5x23#
有一条路可以绕过去:Cookie管理器
AFAIK:没有专门的API可以提供这些信息,但是如果我告诉你有一个方法。
正如Torkel提到的,
getPackageManager().hasSystemFeature(..)
不能保证告诉Android系统WebView是启用还是禁用。即使用户在设置中禁用WebView,getPackageManager().hasSystemFeature(..)仍将返回true。
Cookie管理器
因此,另一种方法是使用
CookieManager
。应用程序WebView Cookie由
CookieManager
管理。如果在禁用WebView时尝试创建CookieManager示例,则会引发异常。在Kotlin中,你可以从块语句中得到结果,但在Java中这是不可能的。所以你可以在函数中使用异常处理逻辑来决定。
下面是一个例子
注:
目前的实现在将来可能会改变,或者他们可能会提出一个专用的API。我已经尝试在许多论坛上找到一个完美的解决方案,但这是我所达到的最接近。
此解决方案将防止您的应用崩溃,但您仍然会在日志中看到错误,因为CookieManager.getInstance会抛出一个Exception对象。
5ssjco0h4#
您可以在https://source.android.com/compatibility/android-cdd.pdf阅读更多详细信息。
根据WebView兼容性部分,android.software.webview功能是指设备或OEM必须提供android.webkit.WebView API的完整实现。因此播放存储上的设备数量下降,因为实际上,大多数设备没有完全实现webkit所需的所有API。
因此,如果您的网页内容需要某些html5功能,请检查这里http://mobilehtml5.org/如果您的应用程序目标kitkat或甚至棒棒糖+,那么你应该是安全的。
所以没有必要声明android.software.webview特性,除非你的网页内容确实需要webkit的所有API。
mzsu5hc05#
WebView已在Android API 1中提供,因此它始终可用什么不是它是互联网连接https://developer.android.com/reference/android/webkit/WebView.html在您的清单中,您需要互联网权限: