Android WebView使用及苏宁易付宝支付相关问题

最近项目中应用到苏宁易付宝支付方式  项目中遇到了一些问题总结如下:

易付宝使用处理的逻辑代码:

public class YiFuBaoWebView extends BaseActivity implements View.OnClickListener {
    /*post请求的参数*/
    private String mPostParam;
    /*加载的webview的布局*/
    private WebView mWebView;
    /*加载内容失败的布局*/
    private View mNetErrView;
    /*标题头*/
    private String mTitle;
    /*易付宝支付成功回调的页面的地址*/
    private String mSuningCallBackUrl;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_webview);
        initData();
        initView();
        setBackAction();
    }
    public void initData() {
        Intent intent = getIntent();
        /*请求的参数*/
        mPostParam = intent.getStringExtra(ExtraConstants.COMMWEBVIEW_URL);
        mTitle = intent.getStringExtra(ExtraConstants.COMMWEBVIEW_TITLE);
        mSuningCallBackUrl = intent.getStringExtra(ExtraConstants.SUNING_CALLBACK_URL);
    }

    public void initView() {
        mWebView = (WebView) findViewById(R.id.webView);
        mNetErrView = getNetErrView();
        mNetErrView.setOnClickListener(this);
        initWebview();
        showView();
    }

    private void initWebview() {
        WebSettings settings = mWebView.getSettings();
        settings.setUseWideViewPort(true);
        settings.setLoadWithOverviewMode(true);
        settings.setSupportZoom(true);
        settings.setSavePassword(true);
        settings.setSaveFormData(true);
        settings.setJavaScriptEnabled(true);
        mWebView.setBackgroundColor(getResources().getColor(R.color.setting_bg_gray));
        mWebView.postUrl(UrlConstants.SUNING_PAY_URL_01, EncodingUtils.getBytes(mPostParam, "UTF_8"));
        /*希望点击链接继续在当前browser中响应,必须覆盖 WebViewClient对象。*/
        mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }

            /*受到错误时触发,比如400错误,这些错误一般都是无法补救的,最多给出提示信息 */
            @Override
            public void onReceivedError(WebView view, int errorCode,
                                        String description, String failingUrl) {
                super.onReceivedError(view, errorCode, description, failingUrl);
                showNetErrView();
            }

            @Override
            public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {
                super.onReceivedHttpAuthRequest(view, handler, host, realm);
            }

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                System.out.print(url);
                /*这儿可以截获网页的URL,可以对URL进行分析.*/
                if (url.contains(mSuningCallBackUrl)) {
                    /*支付成功跳转回去*/
                    Intent intent = new Intent();
                    intent.putExtra("pay_result","success");
                    setResult(RESULT_OK, intent);
                    finish();
                }
            }
        });

        mWebView.setWebChromeClient(new MyWebChromeClient());
    }

    private class MyWebChromeClient extends WebChromeClient {
        /*进度条的改变*/
        @Override
        public void onProgressChanged(WebView view, int newProgress) {
            super.onProgressChanged(view, newProgress);
            if (newProgress == 100) {
                hideProgress();
            }
        }

        /*设置标题头*/
        @Override
        public void onReceivedTitle(WebView view, String title) {
            // TODO Auto-generated method stub
            super.onReceivedTitle(view, title);
            setTitleContent(title);
        }
    }
    /*浏览网页,点击系统“Back”键,整个Browser会调用finish()而结束自身,如果希望浏览的网 页回退而不是推出浏览器,需要在当前Activity中处理并消费掉该Back事件*/
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
            mWebView.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    private void showNetErrView() {
        mWebView.setVisibility(View.GONE);
        mNetErrView.setVisibility(View.VISIBLE);
    }

    private void showView() {
        showLoadingProgress();
        mWebView.setVisibility(View.VISIBLE);
        mNetErrView.setVisibility(View.GONE);
        if (!TextUtils.isEmpty(UrlConstants.SUNING_PAY_URL_01)) {
            mWebView.postUrl(UrlConstants.SUNING_PAY_URL_01, EncodingUtils.getBytes(mPostParam, "UTF_8"));
        }
    }

    @Override
    public void onClick(View v) {
        showView();
    }
}

主要知识点:

         1 . 加载网页

              网络用:webView.loadUrl("http://www.baidu.com");
              本地文件用:webView.loadUrl(file:///android_asset/XXX.html);这里的格式是固定的,文件位置 assets目录下

              webview.postUrl(String url, byte[] postData) 加载页面使用Post方式,postData为参数


         2. 使用loadData方法来加载html数据

              loadData()需要三个参数: HTML TAG ,MIME类型(text/html), 网页编码方式(utf-8).


          使用它时可能会发现有如下问题:

          I.  loadData不能加载图片内容,如果要加载图片内容或者获得更强大的Web支持请使用loadDataWithBaseURL。


          II .使用loadData方法显示乱码。那是因为编码器设置错误导致的。我们知道String类型的数据主要是unicode编码,而WebView一般为了节省资源使用的是UTF-8编码,所以我们在loadData的时候要告诉方法怎样转码。即要告诉它要将unicode编码的内容转成UTF-8编码的内容。有些朋友虽然在loadData的时候设置了编码方式,但是还是显示乱码,这是因为还需要为WebView的text编码指定编码方式.


[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. WebView wv = (WebView)findViewById(R.id.webview) ;  
  2.   
  3. String content = getUnicodeContent() ;  
  4.   
  5. wv.getSettings().setDefaultTextEncodingName(“UTF -8”) ;  
  6.   
  7. wv.loadData(content, “text/html”, “UTF-8”) ;  



          WebView默认是不支持JavaScript 、IFrame或者是任何的框架语法的。通过设webview.getSettings().setJavaScriptEnabled(true);  就可以打开JavaScript.  webView.requestFocus()如果不设置的话,会出现不能弹出软键盘等问题。


          3.   setScrollBarStyle 设置滚动条风格

          webview.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);在内容显示内部显示


          4.  ClearCache  清除缓存内容


          5.  goBcak canGoBack goForward canGoForward


          6.  webView.stopLoading()停止加载页面


          7.  WebViewClient 和 WebChromeClient 区别

         WebView主要负责解析渲染,WebViewClient 和WebChromeClient是用来辅助WebView。


         WebViewClient主要帮助WebView处理各种通知、请求事件的,比如:

         onLoadResource
         onPageStart
         onPageFinish
         onReceiveError

         onReceivedHttpAuthRequest

         WebChromeClient主要辅助WebView处理Javascript的对话框、网站图标、网站title、加载进度等比如

         onCloseWindow(关闭WebView)
         onCreateWindow()
         onJsAlert (WebView上alert,Prompt,Confirm无效,需要定制WebChromeClient处理弹出,从而获取网页中的JS,比如使用AlertDialog进行显示),参考 http://618119.com/archives/2010/12/20/199.html

         onJsPrompt
         onJsConfirm
         onProgressChanged
         onReceivedIcon
         onReceivedTitle
         看上去他们有很多不同,实际使用的话,如果你的WebView只是用来处理一些html的页面内容,只用WebViewClient就行了,如果需要更丰富的处理效果,比如JS、进度条等,就要用到WebChromeClient。更多的时候,你可以这样


          WebView webView;
          webView= (WebView) findViewById(R.id.webview);
          webView.setWebChromeClient(new WebChromeClient());
          webView.setWebViewClient(new WebViewClient());//.希望点击链接继续在当前browser中响应,必须覆盖 WebViewClient对象。
          webView.getSettings().setJavaScriptEnabled(true);
          webView.loadUrl(url);
          这样你的WebView理论上就能有大部分需要实现的特色了。

     

            8.   JS使用

          webview.addJavascriptInterface(new JavaScriptInterfaceDemo( this ), "JSInterfaceDemo");

          //JSInterfaceDemo其实就是JavaScriptInterfaceDemo的别名,供HTML调用时使用

         addJavascriptInterface(Object obj,String interfaceName)这个方法,该方法将一个java对象绑定到一个javascript对象中,javascript对象名就是 interfaceName,比如说JSInterfaceDemo,作用域是Global。这样初始化webview后,在webview加载的页面中就可以直接通过 javascript:window.JSInterfaceDemo访问到绑定的java对象了。在HTML中如何调用呢,"window.JSInterfaceDemo.getResposeCode() " 其中getResposeCode需要在JavaScriptInterfaceDemo中实现

         需要注意的是:addJavascriptInterface方法中要绑定的Java对象及方法要运行另外的线程中,不能运行在构造他的线程中,这也是使用 Handler的目的。


             调用地方

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. webview.addJavascriptInterface(new JavaScriptInterfaceDemo( this ), "JSInterfaceDemo");  
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值