有个需求,是点击短信中的(或者是其他地方的)URL,能够唤起APP。
思路,首先找个实现了的APP做测试。
选择手机淘宝做研究。
在淘宝中把宝贝链接分享到微信,结果如下:
直接点开,跳转到微信的内建浏览器,指示用户通过浏览器打开:
点击在浏览器中打开,效果为弹窗显示所有的浏览器APP,提示选择一个浏览器。此时使用淘宝打开即跳转到APP
把链接内容作为短信发送给自己,点击短信中的链接,效果:
1.首先弹出安卓系统默认浏览器,展现出宝贝页面
2.马上跳转到淘宝APP内,并展示宝贝
差异:
1.微信使用内建浏览器打开;短信一般使用系统浏览器打开。
分析:微信的实现是使用自定义的WebView;系统的实现是指定意图,并显示打开指定的浏览器。
2.微信页面打开之后,需要选择打开的应用;短信打开的页面可以直接跳转。
分析:短信可以跳转,不是通过自定义WebView,无法使用JS接口,而且是能通过第三方APP跳转,一定是通过安卓系统组件实现的跳转,不是直接跳转,说明只能拦截系统默认浏览器中的URL跳转操作才能实现跳APP;
微信无法跳转,猜测可能是对scheme特殊的URL进行了拦截。
查找了资料,可以通过修改manifest来实现一个Activity接收传递来的URL:
猜想如果点击web链接能够跳转到指定APP,则也能够实现像淘宝那样进入系统浏览器稍后跳转到APP。
使用WebView加载自定义的HTML文件:
open http link
将HTML文件放到APP的asset目录下面,在启动后加载HTML:
// 1.加载HTML文本
//String htmlText = AssetUtil.getFromAssets(this, "a.html");
//mWebView.loadData(htmlText, "text/html", "utf-8");
// 2.加载asset中的HTML文件
//mWebView.loadUrl("file:///android_asset/a.html");
// 3.加载外部HTML文件
mWebView.loadUrl("file:///sdcard/a.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");
第一种方式原因未知。
第二种使用asset,查找资料得知:要调起的APP是系统浏览器,而加载的文件却在我们自己的内部存储中,系统浏览器是无法读取文件的,囧。
第四种直接加URL显然可以,然并卵。
最后一行代码有可能无效,如果无效报manifest中未定义BrowserActivity的话则替换为下面代码:
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触发可以响应的安卓组件。