Navigating to http://whatsmyuseragent.com/ shows me my stock Android browser on my Galaxy Nexus running 4.2.1 has the user agent
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.34 Safari/534.24
There is nothing in this user agent that allows me to uniquely detect that it is a stock Android browser. The Chrome for Android app at least has android
in the UA. Is there any way for me to detect the stock Android app?
var navU = navigator.userAgent;
// Android Mobile
var isAndroidMobile = navU.indexOf('Android') > -1 && navU.indexOf('Mozilla/5.0') > -1 && navU.indexOf('AppleWebKit') > -1;
// Apple webkit
var regExAppleWebKit = new RegExp(/AppleWebKit\/([\d.]+)/);
var resultAppleWebKitRegEx = regExAppleWebKit.exec(navU);
var appleWebKitVersion = (resultAppleWebKitRegEx === null ? null : parseFloat(regExAppleWebKit.exec(navU)[1]));
// Chrome
var regExChrome = new RegExp(/Chrome\/([\d.]+)/);
var resultChromeRegEx = regExChrome.exec(navU);
var chromeVersion = (resultChromeRegEx === null ? null : parseFloat(regExChrome.exec(navU)[1]));
// Native Android Browser
var isAndroidBrowser = isAndroidMobile && (appleWebKitVersion !== null && appleWebKitVersion < 537) || (chromeVersion !== null && chromeVersion < 37);
"Android Browser" is the name of a browser. Confusing perhaps, but with a question like this, it shouldn't be. It's the browser that comes with the vast majority of Android devices, and he's obviously not talking about Chrome.
According to http://www.useragentstring.com/ this is the full list of Android Stock Browser strings. I am currently unsure whether there is a better way to select all of them at once, since some will continue to be added, and also which would not accidentally target Chrome on Android. Hopefully someone gives you a better answer as I am curious myself of the best way to go about this.
Mozilla/5.0 (Linux; U; Android 4.0.3; ko-kr; LG-L160L Build/IML74K) AppleWebkit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
Mozilla/5.0 (Linux; U; Android 4.0.3; de-ch; HTC Sensation Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
Mozilla/5.0 (Linux; U; Android 2.3; en-us) AppleWebKit/999+ (KHTML, like Gecko) Safari/999.9
Mozilla/5.0 (Linux; U; Android 2.3.5; zh-cn; HTC_IncredibleS_S710e Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
Mozilla/5.0 (Linux; U; Android 2.3.5; en-us; HTC Vision Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
Mozilla/5.0 (Linux; U; Android 2.3.4; fr-fr; HTC Desire Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; T-Mobile myTouch 3G Slide Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
Mozilla/5.0 (Linux; U; Android 2.3.3; zh-tw; HTC_Pyramid Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
Mozilla/5.0 (Linux; U; Android 2.3.3; zh-tw; HTC_Pyramid Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari
Mozilla/5.0 (Linux; U; Android 2.3.3; zh-tw; HTC Pyramid Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
Mozilla/5.0 (Linux; U; Android 2.3.3; ko-kr; LG-LU3000 Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
Mozilla/5.0 (Linux; U; Android 2.3.3; en-us; HTC_DesireS_S510e Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
Mozilla/5.0 (Linux; U; Android 2.3.3; en-us; HTC_DesireS_S510e Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile
Mozilla/5.0 (Linux; U; Android 2.3.3; de-de; HTC Desire Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
Mozilla/5.0 (Linux; U; Android 2.3.3; de-ch; HTC Desire Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
Mozilla/5.0 (Linux; U; Android 2.2; fr-lu; HTC Legend Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
Mozilla/5.0 (Linux; U; Android 2.2; en-sa; HTC_DesireHD_A9191 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
Mozilla/5.0 (Linux; U; Android 2.2.1; fr-fr; HTC_DesireZ_A7272 Build/FRG83D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
Mozilla/5.0 (Linux; U; Android 2.2.1; en-gb; HTC_DesireZ_A7272 Build/FRG83D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
Mozilla/5.0 (Linux; U; Android 2.2.1; en-ca; LG-P505R Build/FRG83) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
Mozilla/5.0 (Linux; U; Android 2.2.1; de-de; HTC_Wildfire_A3333 Build/FRG83D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
Mozilla/5.0 (Linux; U; Android 2.1-update1; es-mx; SonyEricssonE10a Build/2.0.A.0.504) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17
Mozilla/5.0 (Linux; U; Android 1.6; ar-us; SonyEricssonX10i Build/R2BA026) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1
You can tell the difference between the stock browser and the Chrome browser by looking for "Android" in the useragent, and checking the AppleWebKit/### version number.
The stock Android browser never went above 534, and Chrome is 537 or higher.
var maybeAndroid = navigator.userAgent.indexOf('Android') >= 0;
var webkitVer = parseInt(/WebKit\/([0-9]+)|$/.exec(navigator.appVersion)[1], 10); // also matches AppleWebKit
var isAOSP = maybeAndroid && webkitVer <= 534 && navigator.vendor.indexOf('Google') == 0;
This is 99% reliable, and very useful for an app on Android 4.x using a WebView.
==details (if you want to go into depth!)==
Edit 7: 'AudioNode' in window
is probably a safe sniff for AOSP (or old Chrome) versus modern Chrome versions. Try it here. window.AudioNode was introduced as part of WebAudio support in Chrome 29 (and unlikely to be back-ported by manufacturers). Our 4.0.3 phone has Chrome 41 on it, and 'AudioNode' in window
returns true
for Chrome and false
for AOSP. You could also sniff for other features introduced after AOSP finished development -- see this link for other potential features to sniff. Choose a feature introduced before Chrome 42 because Android 4.0 users can't upgrade past that version. As usual with Android, there are sure to be strange edge cases, but that sniff is likely about as good as you can get (especially if combined with checking that WebKit version < 537).
Edit 8:
==WebView on Android==
Checking for <= 534 is a perfect test when using a WebView within an app. The compatibility definition for Android 4.3 (the last Android version to use AOSP for WebView), says the WebView user agent MUST be: "Mozilla/5.0 (Linux; U; Android $(VERSION); $(LOCALE); $(MODEL) Build/$(BUILD)) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
".
The compatibility definition for Android 4.4 (the first Android version to use Chromium for WebView ), says the WebView user agent MUST be: "Mozilla/5.0 (Linux; Android $(VERSION); $(MODEL) Build/$(BUILD); wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 $(CHROMIUM_VER) Mobile Safari/537.36
".
Less than Android 4.3 is very similar to the 4.3 definition (always AOSP). Greater than 4.4 is very similar to the 4.4 definition (always Chromium).
==AOSP on Android==
For the browser on the device (not WebView), the user agent is not proscribed by the Compatibility Definition. The actual browser version used varies a lot as documented on quirksmode and as documented for the Samsung browser version.
Edit 4: The recommended solution is to look for Android without Chrome in the user agent as per: https://developer.chrome.com/multidevice/user-agent#webview_user_agent however it may also be necessary to ensure the absence of /Windows Phone/ because Mobile-IE11-8.1-Update also has Android in the UA "Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 520) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537
". Edit 5: https://msdn.microsoft.com/en-us/library/hh869301(v=vs.85).aspx shows that IE12 on Windows Phone will still have Android in the user agent.
Edit 3: As commenters have stated, there are devices out there with AOSP and >= 535, but this is the most reliable test I have found (I would love to see something better). You can but try to make sure your code is still functional if the sniff fails, and accept that Android fragmentation means that there will be odd devices that fail. Caveat Emptor. Edit 6: Looking at some data for a specific site about 1% of what look to be AOSP logins have WebKit 537, so although it seems fairly reliable, it definitely isn't 100% reliable.
Edit 2: If you are using a WebView in an App, this detection is useful for Android >= 4.0 && Android < 4.4.4, because WebView component uses AOSP even if Chrome is installed on the device.
Edit 1: Since native android is now "obsolete" it is reasonable to test for it (and use the flag to work around differences that can't be detected using feature detection).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With