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 plaincopy在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 plaincopy在CODE上查看代碼片派生到我的代碼片
  1. webview.addJavascriptInterface(new JavaScriptInterfaceDemo( this ), "JSInterfaceDemo");  
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章