如何仅检测原生Android浏览器

23

检测Android设备很容易,但我遇到了检测仅限Android本地浏览器的问题。问题在于Dolphin浏览器有几乎相同的用户代理字符串,我希望有一种方法可以知道他们是否正在使用本地浏览器。

这种可能吗?


可能是自动检测移动浏览器(通过用户代理?)的重复问题。 - Phill Pafford
5
我不这么认为?那是一种通用策略。只针对Android 2.X、3.X、4.X上的原生浏览器。 - williamsandonz
你为什么要尝试查看他们是否在使用特定的浏览器?这是你可以进行功能测试的吗? - Jeremy J Starcher
请参阅https://dev59.com/5WYq5IYBdhLWcg3wixFr。 - That Brazilian Guy
顺便提一下,Dolphin浏览器是股票/本地浏览器的Webview。 - Bnaya
显示剩余3条评论
5个回答

19

你只需要测试用户代理字符串的几个部分,以确保你拥有默认的安卓浏览器:

var nua = navigator.userAgent;
var is_android = (nua.indexOf('Mozilla/5.0') > -1 && nua.indexOf('Android ') > -1 && nua.indexOf('AppleWebKit') > -1);

您可以使用以下内容来确保在Android上不匹配Chrome,尽管现在许多设备默认使用Chrome作为浏览器。

var nua = navigator.userAgent;
var is_android = ((nua.indexOf('Mozilla/5.0') > -1 && nua.indexOf('Android ') > -1 && nua.indexOf('AppleWebKit') > -1) && !(nua.indexOf('Chrome') > -1));

编辑: 如果您想保护大小写敏感性,可以使用以下方法:

var nua = navigator.userAgent.toLowerCase();
var is_android = ((nua.indexOf('mozilla/5.0') > -1 && nua.indexOf('android ') > -1 && nua.indexOf('applewebkit') > -1) && !(nua.indexOf('chrome') > -1));

5
这是否适用于安卓上的Chrome浏览器,返回真值? - HashCoder
1
似乎不是这样。我有一部运行Android 4.1.2的三星Galaxy S3,其默认浏览器是Android浏览器(而不是Chrome)。 - Ali Gangji
1
有时候 useragent 返回的是 AppleWebkit(小写的 kit),这会导致失败:ua.indexOf('AppleWebKit') > -1。最好使用正则表达式而不是 indexOf。 - ds111
1
这将与正则表达式一起使用 var nua = navigator.userAgent; var is_android = ((nua.match(/Mozilla\/5\.0/gi) !== null && nua.match(/Android/gi) !== null && nua.match(/AppleWebKit/gi) !== null) && (nua.match(/Chrome/gi) !== null)); PS 如何换行?两个空格不起作用 :/ - Arek - Krakiewicz.pl
1
这个没有检测到三星Galaxy S5(4.4.2)的默认安卓浏览器。 - Dayne Mentier
显示剩余2条评论

2
我想你正在寻找以下内容:

Android原生浏览器未更新到534.30以上版本,因此您可以根据版本和Android UA字符串组合进行过滤(我们可以假设它是Chrome浏览器)。

这是我的示例JavaScript代码:

(如果您需要特定的样式,我会使用以下JS片段将类添加到主体中)

var defectAndroid = $window.navigator && $window.navigator.userAgent.indexOf('534.30') > 0 && $window.navigator.userAgent.toLowerCase().match(/android/);

if (defectAndroid) {
   // sample code specific for your Android Stock browser
}

(一些安卓设备报告“android”,因此我们需要进行小写转换)


如果版本是533.1,就像在Android GingerBread中一样,那会失败的。 - ayjay
1
同时我发现这个——没有明确的答案。看看这个链接: http://slides.com/html5test/the-android-browser#/ - Peter MK
1
@PeterM,感谢你提供那些幻灯片的链接,你刚刚毁了我的一天 ;) - Sam Hasler

2

在一台Galaxy S3手机上,我发现Chrome和原生浏览器都有'AppleWebkit',因此我将该条件语句中的这一部分删除了。我还添加了版本号,因为它似乎只出现在原生浏览器中。对我而言,它能够正常工作。

var ua = navigator.userAgent;
var isAndroidNative = ((ua.indexOf('Mozilla/5.0') > -1) && (ua.indexOf('Android') > -1) && !(ua.indexOf('Chrome') > -1) && (ua.indexOf('Version') > -1))

1
是的 - 这是唯一正确的答案。其他所有答案都假设UA中没有提到Chrome - 这是不正确的。 - itamar
很不幸,在使用Android默认浏览器时,由于用户代理字符串中存在“Chrome”,因此它无法在三星S5 Mini Android 4.4.2上运行。 - user2718671
在三星Galaxy Note S3上没有“版本”字符串。 - user2718671

-7
var ua = navigator.userAgent.toLowerCase();
var isAndroid = ua.indexOf("android") > -1; //&& ua.indexOf("mobile");
if(isAndroid) {
    // Do something!
    // Redirect to Android-site?
    window.location = 'http://android.davidwalsh.name';
}

1
这仅仅是通常检测Android系统,不能区分在Android上可用的不同浏览器之间的差异(这也是原始问题所寻找的)。 - Scott

-11

你可以使用JavaScript和用户代理特性来完成这个目标。你需要做的是两个if请求:

第一步,检测设备类型:

If android, ios, mobile, ipad, iphone 
   Take this setting

现在,您可以使用if请求或case请求来检测浏览器类型,以满足您的需求。

If chrome, firefox, safari and so on
   Take this setting

这就是理论上的全部内容 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接