您的位置:首页 > 移动开发

Android Application 和Webview 之间的交互

2012-02-17 09:41 405 查看
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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: