34

I have Lollipop, and see that we have a separate app for "android system webview". Is there any way to get its version number from my own app that uses a WebView instance?

I'd like to report some stats on which version my users are using.

Thanks

user3203425
  • 2,919
  • 4
  • 29
  • 48
  • 3
    That's an interesting idea. I don't know of a way to get one from `WebView` itself, though there ideally would be an option for that. Worst-case, if you can figure out the application ID of that "android system webview" app, you can get a `versionCode` and `versionName` for it from `PackageManager`. – CommonsWare Mar 19 '15 at 13:33
  • The updateable `WebView` component is https://play.google.com/store/apps/details?id=com.google.android.webview and its `versionName` seems to roughly follow the Chrome version naming scheme. – Christopher Orr Mar 23 '15 at 19:30

3 Answers3

46

How about checking the user-agent string?

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

For me, this outputs:

User-agent string: Mozilla/5.0 (Linux; Android 5.0; Nexus 4 Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile Safari/537.36

More info: WebView on Android

In case you override UA string with your own:

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;
}
Vikram
  • 51,313
  • 11
  • 93
  • 122
  • 3
    Interesting. My original reaction was that the user agent must be different than the `WebView` version, as you're only reporting 37, but they just announced 40. But, I see that my Nexus 4 has version 37 of the Android System WebView app, suggesting that my user agent would also report 37. I'd prefer something more... definitive, but if the user agent tracks with the system app update, this is a bit easier than the `PackageManager` approach of examining the system app's version itself. – CommonsWare Mar 23 '15 at 19:48
  • 4
    Very cool! I'm going to leave the bounty open another couple of days, in case somebody has a better answer, but yours seems solid enough for production use, given the right regex. Of course, the OP can also chime in and accept answers as the OP sees fit. Thanks! – CommonsWare Mar 23 '15 at 20:16
  • Maybe pointing about the obvious, but this will not work if you override the user agent with your own custom user agent. – Randy Mar 24 '15 at 16:05
  • 1
    @Randy Since this is a logging aid, you can create a utility method that resets the UA string to default (by `setUserAgentString(null)`), retrieves the default UA string using `getUserAgentString()`, and finally - reverts back to the custom UA string using `setUserAgentString(customUAString)`. I have added this as an edit to my answer. – Vikram Mar 24 '15 at 16:47
27

UPDATE: Apparently this will not always accurately give the actual WebView client being used on the target device. As of Android 7.0 users can select preferred client (h/t @Greg Dan).


First, we get the package name from Google Play Store:

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

Then this

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");
}

gives

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

Hope this helps.

ozbek
  • 20,955
  • 5
  • 61
  • 84
  • 3
    Things changed in Android 7 and this method is no longer correct https://developer.android.com/about/versions/nougat/android-7.0.html#webview – Greg Dan Oct 31 '17 at 08:36
  • Thanks for the heads up @GregDan! Added an update above. – ozbek Oct 31 '17 at 11:05
  • 1
    however on Android 8 you can call the method getCurrentWebViewPackage to get the package, rather than hard-coding it – Adam Burley Sep 21 '21 at 14:20
  • On my Android 5 device, the package is called "com.android.webview" not "com.google.android.webview". Recommend to check both package names. – Adam Burley Sep 27 '21 at 08:14
5

In Android O and newer you can use WebView.getCurrentWebViewPackage();

import android.webkit.WebView;

...
...


if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    PackageInfo info = WebView.getCurrentWebViewPackage();
    return info.versionName;
}
jcesarmobile
  • 51,328
  • 11
  • 132
  • 176
  • 2
    This was backported in [Jetpack Webkit](https://developer.android.com/reference/androidx/webkit/package-summary), you can use it like this: `val webViewPackage: PackageInfo? = WebViewCompat.getCurrentWebViewPackage(this@MainActivity)` – bompf Jun 10 '21 at 16:20