• 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;
    
                }
                
            });
    关于"android.intent.category.BROWSABLE"参考:

    http://blog.csdn.net/gf771115/article/details/7827833

    此外要对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")){
                myHandler.removeCallbacks(runable);
                return true;
            } else if(url.contains("web-other")){
                
                myHandler.postDelayed(runable, 10000);
                return false;
            }else {
                return false;
            }
        }

    新建的线程

        myHandler = new Handler();
            
            runable = new Runnable() {
                
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    LoadingDialog.closeDialog();
                    webview_another.loadUrl(myaliWebUrl.get("code_url"));
                }
            };
        }
  • 相关阅读:
    修改文件小练习
    登录、注册、删除小练习
    自动生成用户名和密码
    自动生成密码文件
    监控日志被攻击情况-小练习
    随机函数_手机自动生成小练习
    as与c++的反射机制对比
    as中的陷阱
    关于as中的事件与回调函数
    身份证号码验证
  • 原文地址:https://www.cnblogs.com/ruichenblogs/p/5893589.html
Copyright © 2020-2023  润新知