android -如何检查webview是否可用?

fslejnso  于 2023-01-19  发布在  Android
关注(0)|答案(5)|浏览(343)

是否有办法检查设备上是否有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(很遗憾未回答)

zaqlnxep

zaqlnxep1#

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

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

此方法返回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#permissions

gmxoilav

gmxoilav2#

替代解决方案:
val hasWebView: Boolean = kotlin.runCatching { CookieManager.getInstance() }.isSuccess
它之所以有效,是因为如果WebView不可用,那么CookieManager.getInstance()将抛出AndroidRuntimeException
getPackageManager().hasSystemFeature("android.software.webview")不可靠。如果设备应该有webview,但在系统设置中禁用了它,则它将返回true。
我在华为P20上测试了一下,设置-〉应用-〉安卓系统WebView-〉禁用

lf5gs5x2

lf5gs5x23#

有一条路可以绕过去:Cookie管理器

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;

    }

}

注:

目前的实现在将来可能会改变,或者他们可能会提出一个专用的API。我已经尝试在许多论坛上找到一个完美的解决方案,但这是我所达到的最接近。
此解决方案将防止您的应用崩溃,但您仍然会在日志中看到错误,因为CookieManager.getInstance会抛出一个Exception对象。

5ssjco0h

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。

mzsu5hc0

mzsu5hc05#

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

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

相关问题