admin管理员组文章数量:1606462
最近在混合开发中遇到一个问题,这里将问题及解决方案记录如下:
问题:
现在有这么个需求,webview中加载了一个H5界面(第三方应用提供的界面,如嵌入一个淘宝商品界面),在界面中有个按钮,点击时需要跳转到第三方APP中的相关界面,假如本地未安装则跳转去下载(可以自行设计下载方式,如直接跳转浏览器,或者自定义下载界面)。因为是第三方提供的H5界面链接,所以我们未知其实现逻辑,在接入的过程中发现点击按钮没有任何反应,既不会跳转去下载,也不会唤起对应的第三方APP应用。。。
解决方案:
经一番sou sou 搜,发现Android的WebView自身是支持网页唤起第三方App的,但是如果为WebView设置了自定义的WebViewClient,这个功能就失效了,另外我们没有做特别处理的话,webview不会直接下载对应的apk,所以需要我们对这种场景做处理。
(1)首先我们在WebViewClient的shouldOverrideUrlLoading(WebView view, String url) 方法中搞事情。
@Override public boolean shouldOverrideUrlLoading(WebView view, String url) {
Logs.d(TAG, "shouldOverrideUrlLoading----url=" + url);
,
if (!url.startsWith("http")) {
try {
// 以下固定写法,表示跳转到第三方应用
final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
context.startActivity(intent);
isDownload = false; //该字段是用于判断是否需要跳转浏览器下载
} catch (Exception e) {
// 防止没有安装的情况
e.printStackTrace();
}
return true;
}
return false;
}
上面代码也很简单,就是对自定义的scheme做拦截直接跳转唤起第三方APP,假如本地没有安装则会抛如下异常
System.err: android.content.ActivityNotFoundException:
No Activity found to handle Intent { act=android.intent.action.VIEW ....},我们try-catch就可以了,这是标识字段isDownload仍然是初始值true,这样就可以继续搞事情了。
(2)然后我们又可以通过webview的setDownloadListener(DownloadListener listener)方法搞事情。
//链接中有需要跳转下载的链接时跳转浏览器下载
webView.setDownloadListener(new DownloadListener() {
@Override public void onDownloadStart(String url, String userAgent, String contentDisposition,
String mimetype, long contentLength) {
Logs.d(TAG, "DownloadListener-->url=" + url);
Logs.d(TAG, "isDownload-->" + isDownload);
if (isDownload) {
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.parse(url);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.setData(uri);
context.startActivity(intent);
}
isDownload = true;//重置为初始状态
}
});
以上代码通过判断isDownload字段是否为true来跳转浏览器进行下载操作。
那可能有人会问为什么要设置isDownload字段呢?为什么在shouldOverrideUrlLoading做设置,在setDownloadListener中做判断管用呢?这个问题看一下如下的日志就知道了。
图中:1 后面对应的链接为待唤起APP对应的url; 2 处是调用webview的setDownloadListener方法。
由图我们可以看出来setDownloadListener方法在最后才会执行,所以这就是上面问题中为什么在shouldOverrideUrlLoading做设置,在setDownloadListener中做判断管用的原因。至于isDownload字段的作用是为了防止本地已经安装了待唤起的第三方APP,程序在执行时仍会走setDownloadListener监听,又一次跳转浏览器提醒用户下载,通过这么控制提升用户体验。
总结一下,开篇说到的问题解决方案我们可以归结两点:
(1)在WebViewClient的shouldOverrideUrlLoading中拦截url唤起第三方APP,假如本地未安装时try-catch异常,
(2)同时通过webview的setDownloadListener设置下载监听,并设置下载标识,只有链接是下载链接时才会走回调,我们可以在回调中进行下载操作。
版权声明:本文标题:Android Webview通过链接跳转第三方APP或者跳转下载第三方APK@Override public boolean shouldOverrideUrlLoading(WebView vie 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1728501217a1161194.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论