从Android浏览器(并不是Appliaction里面的webkit)打开应用程序/应用商店
来源:互联网 发布:linux libevent 安装 编辑:程序博客网 时间:2024/05/01 01:56
转自:http://www.cnblogs.com/chorrysky/archive/2012/05/16/2503961.html
刚才为了测试在android浏览器中一个应用程序,走了一点弯路,在这里记录下来
androidManifest.xml
- <activity android:name=".UploadActivity" android:screenOrientation="portrait">
- <intent-filter>
- <strong><span style="color:#ff0000;"><data android:scheme="mtcmtc"/></span></strong>
- <action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.BROWSABLE" />
- </intent-filter>
- </activity>
浏览器中的超链接 <a href="mtcmtc://aaaaa/aaa">点击打开程序</a>
从浏览器中直接打开Android Market Place,这个market schema 是Google已经配置好了的,可以直接使用。
<a href="market://search?q=pname:com.nytimes.android">点击打开商店</a>
点击打开程序
点击打开Market
==========================================================================================
android/iPhone:如何从browser直接打开应用程序或者打开应用商店(如果没有应用程序)- </pre>最近在做一个项目,该项目的前身是为mobile browser量身打造的一个网站。现在有这样一个需求:<p></p><p>当用户在用mobile browser浏览该网站的时候会点击一个按钮/超链接,通过这个按钮的点击事情需要打开安装在本机的应用程序,或者如果本机没有安装该应用程序则打开应用商店并打开该程序在商店中的搜索结果页面。</p><p></p><p>刚开始的时候iPhone team的人给出一个solution,下面是实施跳转的HTML + javascript源代码。</p><p></p><pre name="code" class="html"><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>
- <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">
- <span style="white-space:pre"> </span>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应用商店并根据参数进入搜索页面并显示结果。
- 从Android浏览器(并不是Appliaction里面的webkit)打开应用程序/应用商店
- 从Android浏览器(并不是Appliaction里面的webkit)打开应用程序/应用商店
- 从Android浏览器(并不是Appliaction里面的webkit)打开应用程序/应用商店
- android/iPhone:如何从browser直接打开应用程序或者打开应用商店(如果没有应用程序)
- android/iPhone:如何从browser直接打开应用程序或者打开应用商店(如果没有应用程序)
- android/iPhone:如何从browser直接打开应用程序或者打开应用商店(如果没有应用程序)
- android/iPhone:如何从browser直接打开应用程序或者打开应用商店(如果没有应用程序)
- android/iPhone:如何从browser直接打开应用程序或者打开应用商店(如果没有应用程序)
- android/iPhone:如何从browser直接打开应用程序或者打开应用商店(如果没有应用程序)
- 从浏览器中打开我们的应用
- 微软应用商店将是购买Metro应用程序的唯一途径
- Android 应用商店的思考
- 判断是否是从微信中打开的浏览器
- Android从桌面打开图标,发现是之前未返回的应用的解决方法
- 从浏览器打开一个本地应用的回退栈问题
- [2月15日的脚本] 从Windows 8桌面或者任务栏打开Windows 应用商店应用 (PowerShell)
- [3月4日的脚本] 在Windows 8中从桌面或者任务栏打开Windows应用商店应用 (VBScript)
- 从应用商店被移除的Android应用为37%,苹果为24%
- 如何搜索csdn博客
- android--笔记--向电话簿插入名片
- virtio驱动如何同设备交互
- poj 2418 Hardwood Species(数据结构:trie+dfs)
- 手机屏幕图片自适应
- 从Android浏览器(并不是Appliaction里面的webkit)打开应用程序/应用商店
- CSS设置超链接A标签宽度和高度
- 浅淡奥氏体不锈钢的发展及应用
- Struts2 下 基于Freemarker模板技术的分页组件设计
- 干粉搅拌机哪家好?
- commons-logging 和 log4j 之间的关系
- 关联v4源代码
- http://www.allaboutcookies.org/
- 脏读、不可重复读、幻读