android/iPhone:如何从browser直接打开应用程序或者打开应用商店(如果没有应用程序)

原创 2011年07月21日 17:17:46

最近在做一个项目,该项目的前身是为mobile browser量身打造的一个网站。现在有这样一个需求:

当用户在用mobile browser浏览该网站的时候会点击一个按钮/超链接,通过这个按钮的点击事情需要打开安装在本机的应用程序,或者如果本机没有安装该应用程序则打开应用商店并打开该程序在商店中的搜索结果页面。

刚开始的时候iPhone team的人给出一个solution,下面是实施跳转的HTML + javascript源代码。

<html> 
	<head> 
        <meta name="viewport" content="width=device-width" /> 
	</head> 
	<body> 
        <h2><a id="applink1" href="mtcmtc://profile/116201417">Open scheme(mtcmtc) defined in iPhone with parameters </a></h2> 
        <h2><a id="applink2" href="unknown://nowhere">open unknown with fallback to appstore</a></h2> 
        <p><i>Only works on iPhone!</i></p>    
		
		<script type="text/javascript"> 
			// To avoid the "protocol not supported" alert, fail must open another app.
			var appstore = "itms://itunes.apple.com/us/app/facebook/id284882215?mt=8&uo=6";
			function applink(fail){
				return function(){
					var clickedAt = +new Date;
					// During tests on 3g/3gs this timeout fires immediately if less than 500ms.
					setTimeout(function(){
							  // To avoid failing on return to MobileSafari, ensure freshness!
							  if (+new Date - clickedAt < 2000){
							  window.location = fail;
							  }
							  }, 500);    
				};
			}
			document.getElementById("applink1").onclick = applink(appstore);
			document.getElementById("applink2").onclick = applink(appstore);
			</script> 
    </body> 
</html>

其原理就是为HTML页面中的超链接点击事件增加一个setTimeout方法.

如果在iPhone上面500ms内,本机有应用程序能解析这个协议并打开程序,则这个回调方法失效;如果本机没有应用程序能解析该协议或者500ms内没有打开个程序,则执行setTimeout里面的function,就是跳转到apple的itunes。


我用同样的原理来处理android的javascript跳转,发现如果本机没有程序注册intent-filter for 这个协议,那么android内置的browser就会处理这个协议并且立即给出反应(404,你懂的),不会像iPhone一样去执行setTimeout里面的function,即便你把500ms改成0ms也不管用。

我就开始了我的Google search之旅,最终在stackoverflow一个不起眼的地方找到solution。

不解释,先给出源代码

android里面androidManifest.xml文件对activity的配置,如何配置就不表述了,表达能力有限,请参考developer.android.com

<activity android:name=".ui.UploadActivity" android:screenOrientation="portrait">
            <intent-filter>
        		<data android:scheme="http" android:host="192.168.167.33" android:port="8088" android:path="/mi-tracker-web/download.html"/>
			    <action android:name="android.intent.action.VIEW" />
			    <category android:name="android.intent.category.DEFAULT" />
			    <category android:name="android.intent.category.BROWSABLE" />
        	</intent-filter>
        </activity>


HTML页面中指向该应用程序的hyperlink
<a id="applink1" href="http://192.168.167.33:8088/mi-tracker-web/download.html">
			Open Application</a>

不难发现,在androidManifest.xml中配置的filter中data的属性表述,在下面的HTML.href中全部看到了。请注意,这两个路径要全部一致,不能有差别,否则android系统就不会拦截这个hyperlink。

好了,为什么我说这个solution能解决我们当初提出来的需求呢,答案在这里:

如果说本机安装了这个应用程序

在android browser中点击HTML中的applink1,browser会重定向到指定的链接,但是由于我们的应用程序在android OS中配置了一个intent-filter,也是针对这个制定的链接。就是说现在android系统有两个程序能处理这个链接:一个是系统的browser,一个是配置了intent-filter的activity。现在点击这个链接,系统就会弹出一个选择:是用browser还是你指定的activity打开。如果你选择你的activity,系统就会打开你的应用程序,如果你继续选择用browser,就没有然后了。


如果说本机木有安装这个应用程序

那么这个HTML里面的这个超链接就起很重要的左右了,这个download.html里面可以forward到android的应用商店

download.jsp源代码如下。具体为什么请求的是download.html这个地址却访问到了download.jsp,就不解释了,struts2的东西。

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
	<script type="text/javascript">
	window.location="market://search?q=com.singtel.travelbuddy.android";</script>
</body>
</html>

唉,文笔不行,估计我写出来自己都不怎么看得懂。就再把跳转的关键点说一下:

在androidManifest.xml中定义intent-filter的时候定义的scheme,host,port,path拼凑起来是一个有用的HTTP路径,这样就算本机没有activity定义了intent-filter来捕获这个链接,那这个链接也会重定向到打开android market place的页面,继而打开应用商店。因为每个android手机都会捕获到market这个协议(如果android手机里面没有market商店,不怪我哈),系统就会自动打开market place应用商店并根据参数进入搜索页面并显示结果。


如果有什么写得不好的地方或者有更好的方法,希望大家拿出来分享。For you, for me, for everybody.

Android应用打开另一个应用程序

在程序开发过程当中,常遇到需要启动另一个应用程序的情况,比如在点击软件的一个按钮可以打开地图软件。 如果既有包名又有主类的名字,那就好 办了, 直接像下面就行: Intent inten...
  • zml_2015
  • zml_2015
  • 2015年12月27日 19:20
  • 5749

(备忘)Android app中调用启动其他应用(系统应用和第三方应用)

博主:十橙(原文链接) 一、打开第三方应用 方法一 Intent intent=new Intent(); //包名 包名+类名(全路径) int...
  • mlj1668956679
  • mlj1668956679
  • 2016年07月21日 15:25
  • 1783

android 获取应用列表 点击打开应用

android 获取应用列表 点击打开应用 main.xml源码:用gridview控件显示每个应用图标及名称 ...
  • u011403718
  • u011403718
  • 2015年07月12日 10:17
  • 1255

Android在一个APP中通过包名或类名启动另一个APP

开发有时需要在一个应用中启动另一个应用,比如Launcher加载所有的已安装的程序的列表,当点击图标时可以启动另一个应用。一般我们知道了另一个应用的包名和MainActivity的名字之后便可以直接通...
  • mad1989
  • mad1989
  • 2014年07月24日 19:05
  • 95359

Android跳转到应用商店详情页面

最近有一个需求,产品经理按照IOS发布新版后在appstore评论或者评分功能设计的,让Android跳转到本机应用商店中本应用的详情页。 上网查了一些资料,实现步骤如下:弹出对话框: /** ...
  • qby_nianjun
  • qby_nianjun
  • 2017年11月27日 14:55
  • 608

Android 跳转到应用市场详细信息页面

Android 跳转到应用市场详细信息页面 要实现的功能很简单,用户点击“给应用评分”按钮,就会跳转到应用商店的详细信息页面。 或者点击“更多应用”按钮跳转到商店搜索页面搜索开发者的相关应...
  • a457886115
  • a457886115
  • 2016年12月29日 13:33
  • 1437

android/iPhone:如何从browser直接打开应用程序或者打开应用商店(如果没有应用程序)

最近在做一个项目,该项目的前身是为mobile browser量身打造的一个网站。现在有这样一个需求: 当用户在用mobile browser浏览该网站的时候会点击一个按钮/超链接,通过...
  • zeng1990java
  • zeng1990java
  • 2013年09月11日 18:03
  • 404

从Installer直接打开应用程序会出现Android系统bug

问题现象: 用Android系统自带的Installer安装完应用后,会有以下两个不同表现: 1,用户直接在installer界面打开应用。然后按home键后台运行,此时如果再点击该应用的launch...
  • CPPAlien
  • CPPAlien
  • 2014年12月16日 12:45
  • 1209

Android开发把项目打包成apk,安卓到手机上,或者提交到app应用商店

#1.用Eclipse的话导出app其实还是很容易的。大家看我的步骤。有图有真相哦 选择一个项目 创建一个新的,位置随便,下面是密码 ...
  • ibey0nd
  • ibey0nd
  • 2014年08月02日 20:56
  • 2843

Android跳转到应用商店的APP详情页面,以及 Google GMS 各个apk的包

如果本文帮助到你,本人不胜荣幸,如果浪费了你的时间,本人深感抱歉。 希望用最简单的大白话来帮助那些像我一样的人。如果有什么错误,请一定指出,以免误导大家、也误导我。 本文来自:http://www.j...
  • wuming0108
  • wuming0108
  • 2017年07月04日 19:34
  • 591
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android/iPhone:如何从browser直接打开应用程序或者打开应用商店(如果没有应用程序)
举报原因:
原因补充:

(最多只允许输入30个字)