从浏览器检测是不是在 Android 中安装了特定应用程序

Posted

技术标签:

【中文标题】从浏览器检测是不是在 Android 中安装了特定应用程序【英文标题】:Detect from browser if a specific application is installed in Android从浏览器检测是否在 Android 中安装了特定应用程序 【发布时间】:2018-12-28 13:01:34 【问题描述】:

我正在寻找一种方法来确定是否从客户端 Web 浏览器安装了特定应用程序。平台是安卓。

例如,我编写自己的网站并编写自己的应用程序,现在我想当用户从 android 手机浏览器访问我自己的网站时。浏览器会查看手机上是否已经安装了应用程序,如果没有则建议安装应用程序。我可以这样做吗?

【问题讨论】:

firebase.google.com/docs/dynamic-links 【参考方案1】:

有办法实现这一点。

出于安全和隐私原因,您无法检测是否安装了特定应用程序。但是,如果它已安装,您可以打开应用程序;如果未安装,您可以打开其 Google Play 页面。

为此,您必须在应用的主要活动上创建一个意图过滤器,以便在调用给定 URL 时打开它。像这样:

    <activity android:name=".MainActivity >
        <intent-filter>
            <data
                android:host="www.myurl.com"
                android:pathPrefix="/openmyapp"
                android:scheme="http" >
            </data>

            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity> 

说明:当用户导航到http://www.myurl.com/openmyapp时,如果安装了应用,则会创建一个intent并显示Activity。

但是如果用户没有安装应用程序怎么办?然后你需要在你的http://www.myurl.com/openmyapp/index.html 上创建一个重定向页面。当用户到达这个地址时,你的服务器必须重定向到market://details?id=com.your.app.package

这样,当用户导航到http://www.myurl.com/openmyapp 后没有创建 Intent 时,网络服务器将调用另一个 URL。反过来,该 URL 将直接在应用页面上打开设备上的 Google Play。

希望对您有所帮助。

【讨论】:

这是一个非常有趣的想法,但是当点击意图的链接时,会向用户显示一个对话框以在浏览器和应用程序之间进行选择 - 有什么办法吗? 好电话。用户必须选择应用程序,然后选择“始终”以使意图过滤器首次工作。下一次,Android 不会再问了。这是 Android 的默认行为。例如,当您单击地图链接时,会发生完全相同的事情。不幸的是,我不知道有什么办法可以绕过它,而且我怀疑是否有…… @leocadiotine 我认为有一种方法可以绕过谷歌 Chrome 中的“选择应用程序”(developers.google.com/chrome/mobile/docs/intents)。总之,应该从浏览器 由 package_name 应用强制打开。包名为的应用被搜索并打开,否则转发到GooglePlay搜索结果。 它似乎也适用于 dolphin(它也使用 webkit 引擎,只是一个注释)。 Nezneika 提到的链接现在是 developer.chrome.com/multidevice/android/intents 这里是 url 的清理版本:锚文本 在我的测试中,这适用于 Chrome 和 Opera。【参考方案2】:

您是指在浏览器中运行的 javascript?我认为(希望)这是不可能的。我不希望任何随机网站都能够查看安装了哪些应用程序。

如果您希望用户安装特定应用,您可以在您的网站上提供市场链接:http://developer.android.com/guide/publishing/publishing.html#marketintent

编辑:在您在 cmets 中对我的回答进行澄清后,下面出现了一个更有用的答案,理所当然地得到了更多的支持。

【讨论】:

@Thomas 真的没有办法知道应用程序是否已安装?我写了自己的网站和自己的应用程序,现在我想当用户从 Android 手机浏览器访问我自己的网站时,浏览器查看手机上是否安装了应用程序,如果不建议安装应用程序。我可以这样做吗? 我将其编辑为主要问题,因为它非常重要。【参考方案3】:

我找到了一个更有用的解决方案。下面是安卓配置文件:

<activity android:name="me.test.html.MainActivity" >
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />

        <category android:name="android.intent.category.LAUNCHER" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />

        <data
            android:host="xxxxx"
            android:scheme="mm" />
    </intent-filter>
</activity>

下面是html代码:

<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>Insert title here</title>  
<script type="text/javascript">
function test2()
    var di = document.getElementById("di");
    di.innerHTML = "app have not installed";

function newOpen()//184 064 323 438
    var di = document.getElementById("di");
    di.innerHTML = "app have installed";
    var ifc = document.getElementById("ifc");
    ifc.innerHTML = "<iframe src='mm://xxxxx?a=b&c=d' onload='test2()'></iframe>";
    return false;

</script>
</head>  
<body>  
 <a href="#" onclick="return newOpen()">local3</a><br/> 
<div id="di"></div> 
 <div style="display:none;" id="ifc"></div>
</body>  
</html>

这样,当用户点击标签时,如果设备已经安装了应用程序,则不会显示对话框让用户选择,而是直接打开应用程序;如果app还没有安装,那么会调用js函数test2,所以我们知道app还没有安装,所以我们可以在test2中做任何事情!好处是我们不需要使用标准的 html 模式,它会显示一个选择对话框,如果我自己使用定义的模式,页面就不会被导航到错误的页面!我是中国人,英文不好,希望大家能理解我,让大家知道解决办法。

【讨论】:

如果未安装应用程序,则仍然安装的应用程序会显示在屏幕上,否则它可以正常工作.... 在实际未安装应用时获取“应用已安装”。 你能解决我的问题吗? @sharma.mahesh 这是我的链接:***.com/questions/51781079/…【参考方案4】:

您可以使用 Android Intent。您可以构建一个意图锚点来启动应用程序。如果未安装应用程序,则浏览器将搜索意图锚点中指定的包名称。我们也可以提供一个后备 URL。

示例:

<a href="intent://scan/#Intent;scheme=zxing package=com.google.zxing.client.android;end"> Take a QR code </a>

并非所有浏览器都支持此功能。 Chrome 和其他少数主流浏览器都支持它。查看此link 了解更多详情。

我知道这可能对某人有所帮助。

【讨论】:

【参考方案5】:

这可能很快就会公开。

Chrome 团队说:

在 Chrome 59 中,我们引入了一个名为 getInstalledRelatedApps() 的新 API。这个新 API 可让您确定您的本机应用程序是否安装在设备上。 (https://developers.google.com/web/updates/2017/04/getinstalledrelatedapps)

还是:

注意:此 API 在 Origin Trial 之后,这意味着我们处于实验模式并正在积极寻求反馈。 您必须选择您的网站加入此试用版 (https://github.com/jpchase/OriginTrials/blob/gh-pages/developer-guide.md) 因为它无法在网络上广泛使用。您现在可以注册试用 (https://docs.google.com/forms/d/e/1FAIpQLSfO0_ptFl8r8G0UFhT0xhV17eabG-erUWBDiKSRDTqEZ_9ULQ/viewform?entry.1999497328=getInstalledRelatedApps)。

此功能的当前平台状态: https://www.chromestatus.com/feature/5695378309513216

此功能的 bugtracker 中的问题:https://bugs.chromium.org/p/chromium/issues/detail?id=587623

/2018 年 2 月 15 日更新:

getInstalledRelatedApps() 的试用已经完成:https://github.com/GoogleChrome/OriginTrials/blob/gh-pages/completed-trials.md:First available in Chrome M59. Trial ends on January 30, 2018.,但尚未在稳定版 Chrome 中实现:Feature team currently considering the next steps for the feature.

【讨论】:

以上是关于从浏览器检测是不是在 Android 中安装了特定应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如果在 Internet Explorer 中安装了 Lync 插件,我如何检查 Javascript?

当系统中安装了多个 php 版本时,如何使用 pecl 为特定的 php 版本安装 php 扩展?

检查是不是在 iOS 6 中安装了 Google 地图应用

如何检查是不是在 C# 中安装了 Windows 服务

如何判断 Linux 机器上的目录是不是在 Java 中安装了外部文件系统?

我在Eclipse 中安装了Android Develop Tool Kit,可在preferences中看不到Andriod项?