1. 创建和设置WebViewClient
子类。当一些可以影响渲染内容是它会被调用,例如,表单提交错误提示。也可以通过shouldOverrideUrlLoading
()
拦截URL的加载()。
2. addJavascriptInterface(Object obj, String interfaceName)使用这个方法绑定到JavaScript,使JavaScript可以调用此方法。
重要事项:
使用addJavascriptInterface()允许JavaScript来控制您的应用程序。这可以是一个非常有用的功能或一个危险的安全问题。当不可信(例如,部分或全部的HTML是由某些人或过程提供)的WebView的HTML时,攻击者可以注入的HTML,将执行你的代码和可能的攻击者选择的任何代码。
不要使用addJavascriptInterface(除非在此的WebView的HTML),是由你写成的。
在另一个线程,而不是在线程绑定的Java对象运行,它被修建英寸
参数
OBJ | 类的实例绑定到JavaScript,空实例被忽略。 |
InterfaceName中 | 该名称用于暴露在JavaScript中的实例。 |
3. loadUrl(Stringurl, Map<String, String> additionalHttpHeaders)使用这个方法可以在加载网页时带HttpHeaders。
4. postUrl(Stringurl, byte[] postData)请求网页时带有post数据。
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.webkit.JsPromptResult;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
;
/**
* @author
*
*/
public class RegisterActivity extends Activity {
private final static String tag = "RegisterActivity";
WebView mWebView;
Activity mActivity;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_PROGRESS);
setContentView(R.layout.register);
mActivity = this;
mWebView = (WebView) findViewById(R.id.register_webview);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setBuiltInZoomControls(true);
mWebView.getSettings().setDefaultTextEncodingName("UTF-8");
mWebView.setWebChromeClient(mWebChromeClient);
mWebView.setWebViewClient(mWebViewClient);
mWebView.addJavascriptInterface(obj, "customFuction");
mWebView.loadUrl(QingUtil.URL_REGISTER);
// mWebView.loadUrl("file:///android_asset/test.html");
// mWebView.loadUrl("http://www.baidu.com");
}
Object obj = new Object() {
public void getMessage(String str) {
Toast.makeText(getBaseContext(), "Application-getMessage:" + str,
3000).show();
}
};
WebChromeClient mWebChromeClient = new WebChromeClient() {
@Override
public boolean onJsAlert(WebView view, String url, String message,
JsResult result) {
Toast.makeText(getBaseContext(),
"onJsAlert - url:" + url + " message:" + message, 3000)
.show();
return super.onJsAlert(view, url, message, result);
}
@Override
public boolean onJsConfirm(WebView view, String url, String message,
JsResult result) {
Toast.makeText(getBaseContext(),
"onJsConfirm - url:" + url + " message:" + message, 3000)
.show();
return super.onJsConfirm(view, url, message, result);
}
@Override
public boolean onJsPrompt(WebView view, String url, String message,
String defaultValue, JsPromptResult result) {
// TODO Auto-generated method stub
return super.onJsPrompt(view, url, message, defaultValue, result);
}
@Override
public void onProgressChanged(WebView view, int newProgress) {
mActivity.setProgress(newProgress);
Log.d("Test", "newProgress = " + newProgress);
super.onProgressChanged(view, newProgress);
}
};
WebViewClient mWebViewClient = new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.d(tag, "shouldOverrideUrlLoading - " + url);
if (url.startsWith("sms:")) {
Intent sendIntent = new Intent(Intent.ACTION_VIEW);
sendIntent.putExtra("address", url.replace("sms:", ""));
sendIntent.setType("vnd.android-dir/mms-sms");
startActivity(sendIntent);
return true;
}
return super.shouldOverrideUrlLoading(view, url);
}
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
Toast.makeText(mActivity, "Oh no! " + description,
Toast.LENGTH_SHORT).show();
super.onReceivedError(view, errorCode, description, failingUrl);
}
};
test.html文件
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type=text/JavaScript>
function alertFuction(){
var a=1;
var b=2;
alert(a+b);
}
function confirmFuction(){
confirm("你确定要删除吗?");
}
function setText(){
alert("js中的方法");
}
</script>
<input οnclick=alertFuction() type=button value=alertFuction>
<input οnclick=confirmFuction() type=button value=confirmFuction>
<input οnclick="javascript:window.customFuction.getMessage('js中的字符串')" type=button value=customFuction>