搜索 | 会员  
JS唤醒AndroidAPP(包括在外部浏览器和WebView)
来源: CSDN博客   作者:网友  日期:2017-8-9  类别:前端  主题:综合  编辑:Belle
短信可以跳转,不是通过自定义WebView,无法使用js接口,而且是能通过第三方APP跳转,一定是通过安卓系统组件实现的跳转,不是直接跳转,说明只能拦截系统默认浏览器中的URL跳转操作才能实现跳A

点击在浏览器中打开,效果为弹窗显示所有的浏览器APP,提示选择一个浏览器。此时使用淘宝打开即跳转到APP


把链接内容作为短信发送给自己,点击短信中的链接,效果:

1.首先弹出安卓系统默认浏览器,展现出宝贝页面

2.马上跳转到淘宝APP内,并展示宝贝


差异:

1.微信使用内建浏览器打开;短信一般使用系统浏览器打开。

分析:微信的实现是使用自定义的WebView;系统的实现是指定意图,并显示打开指定的浏览器。

2.微信页面打开之后,需要选择打开的应用;短信打开的页面可以直接跳转。

分析:短信可以跳转,不是通过自定义WebView,无法使用js接口,而且是能通过第三方APP跳转,一定是通过安卓系统组件实现的跳转,不是直接跳转,说明只能拦截系统默认浏览器中的URL跳转操作才能实现跳APP;

微信无法跳转,猜测可能是对scheme特殊的URL进行了拦截。


查找了资料,可以通过修改manifest来实现一个Activity接收传递来的URL:


  1. <activity  

  2.     android:name=".activity.UrlJumpActivity">  

  3.     <intent-filter>  

  4.         <action android:name="android.intent.action.VIEW"/>  

  5.         <category android:name="android.intent.category.DEFAULT"/>  

  6.         <category android:name="android.intent.category.BROWSABLE"/>  

  7.         <data android:scheme="http"/>  

  8.     </intent-filter>  

  9. </activity>  


然后自己写Demo程序。


猜想如果点击web链接能够跳转到指定APP,则也能够实现像淘宝那样进入系统浏览器稍后跳转到APP。

使用WebView加载自定义的HTML文件:


  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  

  2. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-CN" dir="ltr">  

  3.     <head>  

  4.         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  

  5.         <script type="text/javascript">  

  6.             function showAndroidToast(toast) {  

  7.                 javascript:android.showToast(toast);  

  8.             }  

  9.         </script>  

  10.     </head>  

  11.     <body>  

  12.         <input type="button" value="Say hello"  

  13.             onClick="showAndroidToast('Hello Android!')" />  

  14.         <a href="http://www.baidu.com">open http link</a>  

  15.     </body>  

  16. </html>  

将HTML文件放到APP的asset目录下面,在启动后加载HTML:


几种方法都能够成功加载HTML文件并显示:



请忽略那个say hello按钮,点击open http link报错:

ERROR_UNKNOWN_URL_SCHEME


哪里有问题?对比淘宝,是用的系统浏览器,而我用的WebView,可能系统浏览器会额外做一些工作吧,于是使用系统浏览器加载这段HTML。

做了各种尝试:

  1. Intent intent=new Intent();  

  2. intent.setAction("android.intent.action.VIEW");  

  3. //Uri uri = Uri.parse("content://com.android.htmlfileprovider/sdcard/a.html");  

  4. //Uri uri = Uri.parse("file:///android_asset/a.html");  

  5. Uri uri = Uri.parse("file:///sdcard/a.html");  

  6. //Uri uri = Uri.parse("http://www.qq.com");  

  7. intent.setData(uri);  

  8. 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触发可以响应的安卓组件。


德仔网尊重行业规范,每篇文章都注明有明确的作者和来源;德仔网的原创文章,请转载时务必注明文章作者和来源:德仔网;
头条那些事
大家在关注
我们的推荐
也许感兴趣的
干货
了解一下吧