【问题标题】:Get WebView version number for lollipop?获取棒棒糖的 WebView 版本号?
【发布时间】:2015-03-19 13:27:25
【问题描述】:

我有 Lollipop,并且看到我们有一个单独的应用程序用于“android 系统 webview”。有什么方法可以从我自己的使用 WebView 实例的应用程序中获取其版本号?

我想报告一些关于我的用户正在使用哪个版本的统计数据。

谢谢

【问题讨论】:

  • 这是一个有趣的想法。我不知道有一种方法可以从WebView 本身获得一个,尽管理想情况下会有一个选择。最坏的情况,如果你能找出那个“android system webview”应用的应用ID,你可以从PackageManager得到一个versionCodeversionName
  • 可更新的WebView组件是play.google.com/store/apps/…,它的versionName似乎大致遵循Chrome版本命名方案。

标签: android


【解决方案1】:

检查用户代理字符串怎么样?

Log.i("WebViewActivity", "UA: " + mWebView.getSettings().getUserAgentString());

对我来说,这个输出:

用户代理字符串:Mozilla/5.0(Linux;Android 5.0;Nexus 4 Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) 版本/4.0 Chrome/37.0.0.0 移动版 Safari/537.36

更多信息:WebView on Android

如果你用自己的覆盖 UA 字符串:

String getWebviewVersionInfo() {
    // Overridden UA string
    String alreadySetUA = mWebView.getSettings().getUserAgentString();

    // Next call to getUserAgentString() will get us the default
    mWebView.getSettings().setUserAgentString(null);

    // Devise a method for parsing the UA string
    String webViewVersion = 
           parseUAForVersion(mWebView.getSettings().getUserAgentString());

    // Revert to overriden UA string
    mWebView.getSettings().setUserAgentString(alreadySetUA);

    return webViewVersion;
}

【讨论】:

  • 有趣。我最初的反应是用户代理必须不同于WebView 版本,因为你只报告了 37,但他们刚刚宣布了 40。但是,我看到我的 Nexus 4 有 Android System WebView 应用程序的 37 版本,建议我的用户代理也将报告 37。我更喜欢更...确定的东西,但如果用户代理跟踪系统应用程序更新,这比检查系统应用程序版本的PackageManager 方法容易一些本身。
  • 非常酷!如果有人有更好的答案,我将再开放几天,但如果使用正确的正则表达式,你的答案似乎足够可靠,可以用于生产。当然,OP 也可以插话并接受 OP 认为合适的答案。谢谢!
  • 也许是显而易见的,但如果你用自己的自定义用户代理覆盖用户代理,这将不起作用。
  • @Randy 由于这是一个记录辅助,您可以创建一个实用方法,将 UA 字符串重置为默认值(通过 setUserAgentString(null)),使用 getUserAgentString() 检索默认 UA 字符串,最后 -使用 setUserAgentString(customUAString) 恢复为自定义 UA 字符串。我已将此作为编辑添加到我的答案中。
【解决方案2】:

更新: 显然,这并不总是准确地给出目标设备上正在使用的实际WebView 客户端。从 Android 7.0 开始,用户可以select preferred client (h/t @Greg Dan)。


首先,我们从 Google Play 商店获取包名:

https://play.google.com/store/apps/details?id=com.google.android.webview

那么这个

PackageManager pm = getPackageManager();
try {
    PackageInfo pi = pm.getPackageInfo("com.google.android.webview", 0);
    Log.d(TAG, "version name: " + pi.versionName);
    Log.d(TAG, "version code: " + pi.versionCode);
} catch (PackageManager.NameNotFoundException e) {
    Log.e(TAG, "Android System WebView is not found");
}

给了

D/WebViewDetails﹕ version name: 39 (1743759-arm)
D/WebViewDetails﹕ version code: 320201

希望这会有所帮助。

【讨论】:

  • Android 7 发生了一些变化,这种方法不再正确developer.android.com/about/versions/nougat/…
  • 感谢@GregDan 的提醒!在上面添加了更新。
  • 但是在 Android 8 上,您可以调用方法 getCurrentWebViewPackage 来获取包,而不是对其进行硬编码
  • 在我的 Android 5 设备上,该包被称为“com.android.webview”而不是“com.google.android.webview”。建议检查两个包名称。
【解决方案3】:

在 Android O 及更高版本中,您可以使用 WebView.getCurrentWebViewPackage();

import android.webkit.WebView;

...
...


if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    PackageInfo info = WebView.getCurrentWebViewPackage();
    return info.versionName;
}

【讨论】:

  • 这是在Jetpack Webkit 中反向移植的,您可以像这样使用它:val webViewPackage: PackageInfo? = WebViewCompat.getCurrentWebViewPackage(this@MainActivity)
猜你喜欢
  • 2020-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
相关资源
最近更新 更多