如何仅检测本机 Android 浏览器

Posted

技术标签:

【中文标题】如何仅检测本机 Android 浏览器【英文标题】:How to detect only the native Android browser 【发布时间】:2012-03-06 09:06:58 【问题描述】:

检测 android 设备很容易,但我无法仅检测 Android 本机浏览器。问题是海豚浏览器有一个几乎相同的用户代理字符串,我想知道他们是否使用本机浏览器..

这可能吗?

【问题讨论】:

Auto detect mobile browser (via user-agent?) 的可能重复项 我不这么认为?这是一般策略。这仅适用于 Android 2.X、3.X、4.X 上的本机浏览器 zytrax.com/tech/web/mobile_ids.html 您应该能够捕获用户代理,也许也可以捕获发行版。但与 Android 一样,这看起来很容易配置 感谢您的链接,这是一本有趣的书,但我认为它对我没有帮助。里面有关于 Dolphin 的内容,但不够准确,无法提供帮助。很遗憾,我认为没有用户代理方法可以识别 Android 2.x 上的 Dolphin 和 Android 2.x 本机。我现在能想到的唯一方法是,Dolphin 的头球实际上是当地人的两倍高,所以可以弄清楚。 您可以使用只有 android 支持的 target-dpi 媒体查询,但它们已被弃用,因此可能不是未来版本的最佳选择 【参考方案1】:

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

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

【讨论】:

即使对于 Android 中的 Chrome 浏览器,这也会返回 true? 好像不是这样的。我有一个运行 android 4.1.2 的三星 Galaxy S3,默认浏览器是 android 浏览器(不是 chrome)。 有时用户代理会返回 AppleWebkit(套件上的小写字母),但失败:ua.indexOf('AppleWebKit') > -1。可能最好做一个正则表达式而不是 indexOf。 这将适用于正则表达式 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 如何制作新行?两个空格不起作用:/ 这没有检测到三星 Galaxy S5 (4.4.2) 的默认安卓浏览器【参考方案2】:

我想你正在寻找这个:

Android 原生浏览器未更新至 534.30 以上版本,因此您可以过滤到该版本并 Android UA字符串组合(以上我们可以假设是Chrome浏览器)

这是我的示例 JavaScript 代码:

(如果您需要特定的样式,我会使用以下 JS sn-p 在正文中添加一个类)

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 设备报告“android”,这就是我们需要小写对话的原因)

【讨论】:

如果 Android GingerBread 中的版本是 533.1 怎么办?不过这会失败。 同时我发现了这个没有明确的答案 看看这个:slides.com/html5test/the-android-browser# @PeterM,感谢您提供这些幻灯片的链接,你毁了我的一天;)【参考方案3】:

在 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))

【讨论】:

YES - 这是唯一真正正确的答案。所有其他人都认为 UA 中没有提到 Chrome - 这不是真的。 不幸的是,它在三星 S5 Mini Android 4.4.2 上不起作用,因为使用 Android 默认浏览器时用户代理字符串中有“Chrome”... ...在三星 Galaxy Note S3 上没有“版本”字符串【参考方案4】:
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';

【讨论】:

这只是检测一般的 Android,而不是 Android 上可用的不同浏览器之间的差异(这是原始问题所要寻找的)。【参考方案5】:

您可以使用 javascript 和用户代理功能来做到这一点。你需要做的是发出 2 个 If-requests:

首先检测设备类型:

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

现在您可以根据需要进行 if-requests 或 case-request 来检测浏览器的类型

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

理论上就是这样:)

【讨论】:

以上是关于如何仅检测本机 Android 浏览器的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 上使用 Xamarin WebView 下载本机浏览器等文件?

设备检测是不是是android?

检测浏览器是不是本机支持将音频传递给输入标签

如何在android中检测webview或浏览器

如何检测flutter网站是不是在浏览器后台运行?

检测到浏览器没有鼠标且仅触摸