点击在浏览器中打开,效果为弹窗显示所有的浏览器APP,提示选择一个浏览器。此时使用淘宝打开即跳转到APP
把链接内容作为短信发送给自己,点击短信中的链接,效果:
1.首先弹出安卓系统默认浏览器,展现出宝贝页面
2.马上跳转到淘宝APP内,并展示宝贝
差异:
1.微信使用内建浏览器打开;短信一般使用系统浏览器打开。
分析:微信的实现是使用自定义的WebView;系统的实现是指定意图,并显示打开指定的浏览器。
2.微信页面打开之后,需要选择打开的应用;短信打开的页面可以直接跳转。
分析:短信可以跳转,不是通过自定义WebView,无法使用js接口,而且是能通过第三方APP跳转,一定是通过安卓系统组件实现的跳转,不是直接跳转,说明只能拦截系统默认浏览器中的URL跳转操作才能实现跳APP;
微信无法跳转,猜测可能是对scheme特殊的URL进行了拦截。
查找了资料,可以通过修改manifest来实现一个Activity接收传递来的URL:
<activity
android:name=".activity.UrlJumpActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="http"/>
</intent-filter>
</activity>
然后自己写Demo程序。
猜想如果点击web链接能够跳转到指定APP,则也能够实现像淘宝那样进入系统浏览器稍后跳转到APP。
使用WebView加载自定义的HTML文件:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-CN" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script type="text/javascript">
function showAndroidToast(toast) {
javascript:android.showToast(toast);
}
</script>
</head>
<body>
<input type="button" value="Say hello"
onClick="showAndroidToast('Hello Android!')" />
<a href="http://www.baidu.com">open http link</a>
</body>
</html>
将HTML文件放到APP的asset目录下面,在启动后加载HTML:
几种方法都能够成功加载HTML文件并显示:
请忽略那个say hello按钮,点击open http link报错:
ERROR_UNKNOWN_URL_SCHEME
哪里有问题?对比淘宝,是用的系统浏览器,而我用的WebView,可能系统浏览器会额外做一些工作吧,于是使用系统浏览器加载这段HTML。
做了各种尝试:
Intent intent=new Intent();
intent.setAction("android.intent.action.VIEW");
//Uri uri = Uri.parse("content://com.android.htmlfileprovider/sdcard/a.html");
//Uri uri = Uri.parse("file:///android_asset/a.html");
Uri uri = Uri.parse("file:///sdcard/a.html");
//Uri uri = Uri.parse("http://www.qq.com");
intent.setData(uri);
intent.setClassName("com.android.browser", "com.android.browser.BrowserActivity");
其中,第三种方法是可行的:把HTML文件拷贝到外部存储,并使用外部存储文件的URL传递给浏览器。
第一种方式原因未知。
第二种使用asset,查找资料得知:要调起的APP是系统浏览器,而加载的文件却在我们自己的内部存储中,系统浏览器是无法读取文件的,囧。
第四种直接加URL显然可以,然并卵。
最后一行代码有可能无效,如果无效报manifest中未定义BrowserActivity的话则替换为下面代码:
[java] view plain copy
intent.setComponent(new ComponentName("com.android.browser", "com.android.browser.BrowserActivity"));
使用系统浏览器打开外部存储的HTML文件后,效果与自定义WebView的显示效果相同,并且点击链接后,能够跳转到我们想要的Activity。
当然,如果我们的H5界面上线了,就不用加载我们自己的HTML文件了。
总结:
点击外部URL跳转到自己的APP界面是可行的。
需要在manifest文件中对目标Activity添加拦截指定的scheme的配置。
web端要做的:与APP定跳转Activity的私有协议,在页面中直接触发此条私有协议,来达到淘宝的效果。
APP端需要做的工作还有:接收web端传来的参数进行处理。
系统默认浏览器无法加载APP内部HTML文件。
自定义WebView和系统浏览器还是有区别的,系统浏览器会根据scheme触发可以响应的安卓组件。
本文作者:网友 来源:CSDN博客
CIO之家 www.ciozj.com 微信公众号:imciow