从浏览器中检测Android设备上是否安装了特定应用程序

46

我正在寻找一种方法,可以从客户端的Web浏览器中找出特定应用程序是否已安装。平台是Android。

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


https://firebase.google.com/docs/dynamic-links/ - ashishdhiman2007
5个回答

126

有一种方法可以实现这个功能。

由于安全和隐私原因,您无法检测特定应用程序是否已安装。但是,您可以通过一个技巧来打开已安装的应用程序或者打开它在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时,Web服务器将调用另一个URL。然后,该URL将直接打开设备上的Google Play,并转到应用程序的页面。


1
这是一个非常有趣的想法,但是当点击意图链接时,用户会看到一个对话框,让他们选择浏览器或应用程序 - 有什么解决办法吗? - Nick Andriopoulos
1
好的,用户必须选择应用程序,然后在第一次使用时选择“始终”才能使意图过滤器起作用。下一次,Android 将不再询问。这是 Android 的默认行为。例如,当您单击地图链接时,也会发生完全相同的事情。不幸的是,我不知道有任何方法可以绕过此问题,而且我怀疑是否存在这样的方法... - leocadiotine
13
@leocadiotine 我认为可以通过谷歌Chrome浏览器中的指南(https://developers.google.com/chrome/mobile/docs/intents)来绕过“选择应用程序”的方式。 简而言之,应从浏览器中调用具有以下格式的链接 **<a href="intent://<anything>/#Intent;scheme=<scheme_name>;package=<must.open.this.package>;end"> Force open by package_name app </a>**。 具有名称为<must.open.this.package>的包名的应用程序将被搜索并打开,否则它将被转发到GooglePlay搜索结果页面。 - Nezneika
1
它似乎也可以在海豚浏览器上运行(只是一句注释,因为它也使用 WebKit 引擎)。 - Igor Čordaš
7
Nezneika提到的链接现在是http://developer.chrome.com/multidevice/android/intents。以下是经过整理的URL: <a href="intent://<your-host>/<your-path>#Intent;scheme=<your-scheme>;package=<your-package>;end">Anchor text</a> 在我的测试中,它在Chrome和Opera上都有效。 - Jo Jo
显示剩余6条评论

19
你是指在浏览器中运行的JavaScript吗?我认为(希望)这是不可能的。我不想让任何随意的网站能够查看安装了哪些应用程序。
如果你想让用户安装特定的应用程序,可以在你的网站上提供一个市场链接:http://developer.android.com/guide/publishing/publishing.html#marketintent 编辑:在你对我回答的评论中澄清后,下面出现了一个更有用的答案,它得到了更多的赞同。

2
@Thomas,真的没有办法知道应用程序是否已安装吗?例如,我编写了自己的网站和应用程序,现在我想当用户从Android手机浏览器访问我的网站时,浏览器会查看手机上是否安装了应用程序,如果没有,则建议安装应用程序。我能做到吗? - Viktor Apoyan
我将其编辑到主要问题中,因为这非常重要。 - Thomas

17

我找到了一种更有用的解决方案。以下是Android配置文件:

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

这样,当用户点击该标签时,如果设备安装了应用程序,则不会显示对话框让用户选择,而是直接打开应用程序;如果应用程序尚未安装,则将调用js函数“test2”,因此我们知道应用程序尚未安装,因此可以在“test2”中执行任何操作!好处在于我们不需要使用标准的html模式,这将显示选择对话框,如果我自己使用定义的模式,则页面将不会导航到错误的页面!我是中国人,我的英语不太好,希望大家能理解我并让其他人知道解决方案。


1
如果应用程序未安装,则仍然在屏幕上显示已安装的应用程序,否则它正常工作... - sharma.mahesh369
当应用程序实际上未安装时,会收到“应用程序已安装”的消息。 - Dawn T Cherian
你能解决我的问题吗?@sharma.mahesh 这是我的链接:https://stackoverflow.com/questions/51781079/issue-in-openng-app-from-link-in-website - Abhishek Bardolia

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),因为它在 Web 上不是广泛可用的。您现在可以注册试用版(https://docs.google.com/forms/d/e/1FAIpQLSfO0_ptFl8r8G0UFhT0xhV17eabG-erUWBDiKSRDTqEZ_9ULQ/viewform?entry.1999497328=getInstalledRelatedApps)。

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

该功能在错误跟踪器中存在问题: 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首次在Chrome M59中提供。试用于2018年1月30日结束。,但尚未在稳定版Chrome中实现:功能团队目前正在考虑下一步操作。


5
您可以使用Android Intents。您可以构建一个意图锚点来启动应用程序。如果未安装该应用程序,则浏览器会搜索意图锚点中指定的软件包名称。我们还可以提供备用URL。
例如:
<a href="intent://scan/#Intent;scheme=zxing package=com.google.zxing.client.android;end"> Take a QR code </a>

不是所有浏览器都支持此功能,仅有 Chrome 和其他几个主流浏览器支持。请查看此链接了解更多详细信息。

我知道这可能有点晚了,但希望对某些人有所帮助。


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