刚才为了测试在android浏览器中一个应用程序,走了一点弯路,在这里记录下来


androidManifest.xml

view plain
  1. <activityandroid:name=".UploadActivity"android:screenOrientation="portrait">
  2. <intent-filter>
  3. <strong><spanstyle="color:#ff0000;"><dataandroid:scheme="mtcmtc"/></span></strong>
  4. <actionandroid:name="android.intent.action.VIEW"/>
  5. <categoryandroid:name="android.intent.category.DEFAULT"/>
  6. <categoryandroid:name="android.intent.category.BROWSABLE"/>
  7. </intent-filter>
  8. </activity>

浏览器中的超链接 <a href="mtcmtc://aaaaa/aaa">点击打开程序</a>


从浏览器中直接打开Android Market Place,这个marketschema 是Google已经配置好了的,可以直接使用。

<a href="market://search?q=pname:com.nytimes.android">点击打开商店</a>


点击打开程序

点击打开Market

==========================================================================================

android/iPhone:如何从browser直接打开应用程序或者打开应用商店(如果没有应用程序) view plain
  1. </pre>最近在做一个项目,该项目的前身是为mobilebrowser量身打造的一个网站。现在有这样一个需求:<p></p><p>当用户在用mobilebrowser浏览该网站的时候会点击一个按钮/超链接,通过这个按钮的点击事情需要打开安装在本机的应用程序,或者如果本机没有安装该应用程序则打开应用商店并打开该程序在商店中的搜索结果页面。</p><p></p><p>刚开始的时候iPhoneteam的人给出一个solution,下面是实施跳转的HTML+javascript源代码。</p><p></p><prename="code"class="html"><html>
  2. <head>
  3. <metaname="viewport"content="width=device-width"/>
  4. </head>
  5. <body>
  6. <h2><aid="applink1"href="mtcmtc://profile/116201417">Openscheme(mtcmtc)definediniPhonewithparameters</a></h2>
  7. <h2><aid="applink2"href="unknown://nowhere">openunknownwithfallbacktoappstore</a></h2>
  8. <p><i>OnlyworksoniPhone!</i></p>
  9. <scripttype="text/javascript">
  10. //Toavoidthe"protocolnotsupported"alert,failmustopenanotherapp.
  11. varappstore="itms://itunes.apple.com/us/app/facebook/id284882215?mt=8&uo=6";
  12. functionapplink(fail){
  13. returnfunction(){
  14. varclickedAt=+newDate;
  15. //Duringtestson3g/3gsthistimeoutfiresimmediatelyiflessthan500ms.
  16. setTimeout(function(){
  17. //ToavoidfailingonreturntoMobileSafari,ensurefreshness!
  18. if(+newDate-clickedAt<2000){
  19. window.location=fail;
  20. }
  21. },500);
  22. };
  23. }
  24. document.getElementById("applink1").onclick=applink(appstore);
  25. document.getElementById("applink2").onclick=applink(appstore);
  26. </script>
  27. </body>
  28. </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

view plain
  1. <activityandroid:name=".ui.UploadActivity"android:screenOrientation="portrait">
  2. <intent-filter>
  3. <dataandroid:scheme="http"android:host="192.168.167.33"android:port="8088"android:path="/mi-tracker-web/download.html"/>
  4. <actionandroid:name="android.intent.action.VIEW"/>
  5. <categoryandroid:name="android.intent.category.DEFAULT"/>
  6. <categoryandroid:name="android.intent.category.BROWSABLE"/>
  7. </intent-filter>
  8. </activity>


HTML页面中指向该应用程序的hyperlink
view plain
  1. <aid="applink1"href="http://192.168.167.33:8088/mi-tracker-web/download.html">
  2. OpenApplication</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的东西。

view plain
  1. <%@pagelanguage="java"contentType="text/html;charset=ISO-8859-1"
  2. pageEncoding="ISO-8859-1"%>
  3. <!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <metahttp-equiv="Content-Type"content="text/html;charset=ISO-8859-1">
  7. <title>Inserttitlehere</title>
  8. </head>
  9. <body>
  10. <scripttype="text/javascript">
  11. <spanstyle="white-space:pre"></span>window.location="market://search?q=com.singtel.travelbuddy.android";</script>
view plain
  1. </body>
  2. </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系统“应用程序信息(Application Info)”界面
  • 引用 ApiDemo的第一个应用:CustomDialog
  • Android选项卡(TabWidget)应用
  • Android Market 链接的生成与分享
  • Android核心模块及相关技术
  • Android开发网上的一些重要知识点 [2]
  • Android---浮动搜索框(SearchManager)
  • android intent和intent action大全
  • 【引用】Android那些事儿(二)安卓手机交互特性
  • Android开发之ListView页眉页脚效果VS android背景渐变
  • android:webView
  • 简单介绍Android中各种JAVA包的功能描述

更多相关文章

  1. 如何发布你的Android应用程序
  2. 享受Android应用程序的Java技术盛宴
  3. Android应用程序开发实用案例50则
  4. Android 应用程序基础
  5. 设置Android应用程序横竖屏显示
  6. Android Firebase Dynamic Links 动态链接使用心得
  7. 用Eclipse开发Android应用程序(2): 开发环境搭建
  8. Android深入四大组件(一)应用程序启动过程

随机推荐

  1. Android监听按键返回键
  2. Android启动流程分析(九) 解析init.rc的s
  3. Android:应用程序转移到USB存储器(SD卡)
  4. Android Studio 调用百度地图
  5. android中的layout_weight的含义
  6. Android P第三方apk系统签名问题
  7. Android中Widget的使用示例
  8. FFmpeg+OpenSL+OpenGL+Mediacodec 的视频
  9. [记录]我的Android工程——SelectToDo
  10. 【Android Developers Training】 66. 添