最近项目中应用到苏宁易付宝支付方式 项目中遇到了一些问题总结如下:
易付宝使用处理的逻辑代码:
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");