最近項目中應用到蘇寧易付寶支付方式 項目中遇到了一些問題總結如下:
易付寶使用處理的邏輯代碼:
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編碼指定編碼方式.
- WebView wv = (WebView)findViewById(R.id.webview) ;
- String content = getUnicodeContent() ;
- wv.getSettings().setDefaultTextEncodingName(“UTF -8”) ;
- 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的目的。
調用地方
- webview.addJavascriptInterface(new JavaScriptInterfaceDemo( this ), "JSInterfaceDemo");