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 onclick=alertFuction() type=button value=alertFuction> <input onclick=confirmFuction() type=button value=confirmFuction> <input onclick="javascript:window.customFuction.getMessage('js中的字符串')" type=button value=customFuction>