android通过webview调起支付宝app支付
webview在加载网页的时候会默认调起手机自带的浏览器加载网页,用户体验不好。但当用户设置浏览器客户端(setWebViewClient)设置这样的监听事件之后,当请求url的时候就不会打开手机自带的浏览器。

webview.setWebViewClient(new WebViewClient() {

        @Override        public void onPageStarted(WebView view, String url, Bitmap favicon) {            super.onPageStarted(view, url, favicon);        }        @Override        public void onPageFinished(WebView view, String url) {            super.onPageFinished(view, url);            LoadingDialog.closeDialog();        }    });

在此方法中可以监听浏览器开始加载网页和加载网页结束。

今天着重讲的并不是上边的两个方法而是下面的这位

putinmoney_webview.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {}
});

shouldOverrideUrlLoading并不是每次都在onPageStarted之前开始调用的,只有在调用webview.loadURL的时候才会调用。

webview.loadUrl(“https://qr.alipay.com/bax05351pgjhc4yegd2y2084“);
但发起请求的时候后,webview的连续动作是先后请求两个url

1.https://mobilecodec.alipay.com/client_download.htm?qrcode=bax05351pgjhc4yegd2y2084

2.https://ds.alipay.com/from=mobilecodec&scheme=alipayqr%3A%2F%2Fplatformapi%2Fstartapp%3FsaId%3D10000007%26clientVersion%3D3.7.0.0718%26qrcode%3Dhttps%253A%252F%252Fqr.alipay.com%252Fbax05351pgjhc4yegd2y2084%253F_s%253Dweb-other

之后返回一个意图,也是用这个意图来打开支付宝app

intent://platformapi/startapp?saId=10000007&clientVersion=3.7.0.0718&qrcode=https%3A%2F%2Fqr.alipay.com%2Fbax05351pgjhc4yegd2y2084%3F_s%3Dwebother&_t=1474448799004#Intent;scheme=alipayqr;package=com.eg.android.AlipayGphone;end

webview.setWebViewClient(new WebViewClient(){
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
// TODO Auto-generated method stub
super.onPageStarted(view, url, favicon);
}

        @Override        public void onPageFinished(WebView view, String url) {            // TODO Auto-generated method stub            super.onPageFinished(view, url);        }        @Override        public boolean shouldOverrideUrlLoading(WebView view, String url) {            Log.e(TAG, "访问的url地址:" + url);            if (parseScheme(url)) {                try {                    Uri uri = Uri.parse(url);                    Intent intent;                    intent = Intent.parseUri(url,                            Intent.URI_INTENT_SCHEME);                    intent.addCategory("android.intent.category.BROWSABLE");                    intent.setComponent(null);                    // intent.setSelector(null);                    startActivity(intent);                } catch (Exception e) {                }            } else {                view.loadUrl(url);            }            return true;        }    });

此外要对webview设置下:

WebSettings webSettings = webview.getSettings();
webSettings.setJavaScriptEnabled(true);
// 设置可以访问文件
webSettings.setAllowFileAccess(true);
// 设置支持缩放
webSettings.setBuiltInZoomControls(true);
webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
// webSettings.setDatabaseEnabled(true);

// 使用localStorage则必须打开
webSettings.setDomStorageEnabled(true);

webSettings.setGeolocationEnabled(true);

实例下载地址:https://github.com/reachchen/loadurltoali.git

在项目中发现的问题在此修正:

发现一些手机(例如一些升级了7.0的手机)在请求后并没有返回intent,所以就会出现调不起支付宝的情况。但是用浏览器直接打开是可以的

兼容的思路如下:

新建一个线程,在用户发出请求后,如果10秒的时间没有收到调起的intent,就用浏览器直接调起。

代码如下:

public boolean parseScheme(String url) {    if (url.contains("platformapi/startapp")){        return true;    } else if(url.contains("web-other")){        return false;    }else {        return false;    }}

更多相关文章

  1. 麦子学院android老师分享android实现listview异步加载图片的方法
  2. 携程Android App插件化和动态加载实践
  3. Android异步加载源码示例
  4. Android Glide加载图片,宽度占满屏幕高度自适应
  5. android异步加载图片显示,并且对图片进行缓存实例
  6. 今天开始写android的照片浏览器(一)至返回所有图片文件
  7. Android:浅谈app加载H5

随机推荐

  1. Linux驱动修炼之道-framebuffer(上)
  2. Linux 修改ip地址
  3. linux wget下载、断点续传
  4. 你如何在Windows上运行ShellScript?
  5. Linux 下 Sublime Text 3 安装 Godef 进
  6. Linux文件权限概念
  7. linux sar查看网络流量
  8. window与linux查看端口被占用
  9. linux -s和 -f,-e 的区别
  10. 定期清理服务器日志