webview自总结

 

 

 

2,webview ---- 运行时不调用系统自带浏览器

1,安卓webview post传值问题

11,WebView基本功能(html5、文件下载和远程URL)

10,webview--网络超时

======= 

2,webview ---- 运行时不调用系统自带浏览器

http://download.csdn.net/detail/menglele1314/9213035

http://download.csdn.net/detail/foxhole123/4320194

http://download.csdn.net/detail/xlnlht/5976245

mobView.loadUrl("http://www.csdn.net");

WebSettings wSet = mobView.getSettings();    
wSet.setJavaScriptEnabled(true);
mobView.setWebViewClient(new WebViewClient() {
        public boolean shouldOverrideUrlLoading(WebView view, String url)
                               { //  重写此方法表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边
                                       view.loadUrl(url);
                                       return true;
                               }

        });

最后记得把权限加上:<uses-permission android:name="android.permission.INTERNET" />

1,安卓webview post传值问题

比如要传过去的键值对分别为 user_name = abc, password = 123456;

String postdata = "user_name=abc&password =123456";

mWebView.postUrl(url,EncodingUtils.getBytes(postData, "BASE64"));

如果把键值对存在了一个map里面,那么就用以下正则表达式,转化成一个字符串,

String postData = map.toString().replaceAll("[{}]", "").replace(",", "&");

mWebView.postUrl(url,EncodingUtils.getBytes(postData, "BASE64"));

这样就可以把这个值post过去了。

方法3:

1、把你要传的参数添加到集合中</span>

TreeMap<String, String> params = geturl(countApi);
// UtilsTools.Log_e(TAG, "要传的map里的数据" + params.toString());
2、遍历集合把集合的数据就 key=value+& 的形式拼成字符串
Set<String> keySet = params.keySet();
Iterator<String> iter = keySet.iterator();
while (iter.hasNext()) {
String key = iter.next();
key_sort_url = key_sort_url + key + "=" + params.get(key) + "&"; substring_url = key_sort_url.substring(0, key_sort_url.length() - 1);
}
3、Post请求
webView.postUrl(传要访问的地址, EncodingUtils.getBytes(参数拼接字符串, "BASE64"));

----

11,WebView基本功能(html5、文件下载和远程URL)

在Android中有WebView ,它内置了WebKit引擎,同时,WebKit也是Mac OS X的Safari网页浏览器的基础。
WebKit是一个开源的浏览器引擎,Chrome浏览器也是基于它的。所以很多表现WebView和Chrome是一样的。
在使用WebView之前,要在AndroidManifest.xml中添加 如下权限:,否则会出Web page not available错误。
1 . 加载网页:
网络用:webView.loadUrl("http://www.baidu.com");
本地文件用:webView.loadUrl(file:///android_asset/XXX.html);这里的格式是固定的,文件位置 assets目录下

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编码指定编码方式.

String content = getUnicodeContent() ;
wv.getSettings().setDefaultTextEncodingName(“UTF -8”) ;
wv.loadData(content, “text/html”, “UTF-8”) ;

WebView默认是不支持JavaScript 、IFrame或者是任何的框架语法的。
通过设置webview.getSettings().setJavaScriptEnabled(true);

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无效,需要定制WebChromeClient处理弹出)
onJsPrompt
onJsConfirm
onProgressChanged
onReceivedIcon
onReceivedTitle
看上去他们有很多不同,实际使用的话,如果你的WebView只是用来处理一些html的页面内容,只用WebViewClient就行了,如果需要更丰富的处理效果,比如JS、进度条等,就要用到WebChromeClient。更多的时候,你可以这样

webView.setWebChromeClient(new WebChromeClient());
webView.setWebViewClient(new WebViewClient());//希望点击链接继续在当前browser中响应,必须覆盖 WebViewClient对象。
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl(url);这样你的WebView理论上就能有大部分需要实现的特色了。

webview.setWebChromeClient(new MyWebChromeClient());
webview.setWebViewClient(new WebViewClient()
{
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// return super.shouldOverrideUrlLoading(view, url);
view.loadUrl(url);
return true;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
mProgressDialog.show();
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
mProgressDialog.hide();
}
});


private class MyWebChromeClient extends WebChromeClient
{
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
textview.setText(title);
}
}

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的目的。

public class JavaScriptInterfaceDemo
{
public void getResposeCode(final String msg)
{
mHandler.post(new Runnable()
{
@Override
public void run() { }
}
}

调用的地方
webview.addJavascriptInterface(new JavaScriptInterfaceDemo( this ), "JSInterfaceDemo");

播放和停止播放:

1.如何播放:
近来工作要用Android的webview播放HTML5 video标签。做了下试验,用Android自带的Browser可以装载含有video标签的HTML5页面,而且能正常播放,但同样的网页用webview来加载就没法播放HTML5中的video。

在网上查了许多资料,所查的资料可以参考我转载那些文章,经过无数次测试,终于成功了,
做法如下:
第一步当然是要先有个Webivew对象,是写在main.xml也好,或者动态创建也罢,总之有了一个Webview对象即可,假设其名为m_webview,然后设置一些属性:
m_webview.getSettings().setJavaScriptEnabled(true);
m_webview.setWebChromeClient(m_chromeClient);
本来以为要设置m_webview.getSettings().setPluginsEnabled(true);但后来发现去掉后也不影响效果。
上面主要的是setWebChromeClient这个,要设置一个WebChromeClient对象给webview:

private WebChromeClient m_chromeClient = new WebChromeClient(){
@Override
public void onShowCustomView(View view, CustomViewCallback callback) {

}
};
onShowCustomView函数中什么也不用写,有篇文章http://blog.csdn.net/wolfman79/article/details/7868975还在那个函数里进行了实现,调用了video.start()之类的东西,但我测试了一下,发现那个函数根本就没有被调用,所以那个函数里的实现就都去掉了。

2.如何在activity结束时停止播放:
能够播放视频了,但发现当activity结束时,视频在后边还在播放,实在令人烦恼,又查了一通资料,终于找到解决方法,非常简单,就是在activity的onPause函数中调用webview的onPause函数即可。
以上是Android 4.0.3中实现的,在Android2.2,2.3这些版本没有试过,未必起作用

12,webiew的下载功能:
在做美图欣赏Android应用的时候,其中有涉及到Android应用下载的功能,就是通过WebView控制调用相应的WEB页面进行展示。刚开始以为和普通的文件下载实现,只需要一个链接,然后点击就可以实现下载了,可是放到手机上试的时候,点击下载链接一点反应都没有,在普通页面里面点击是好的,且点击其它的普通链接是可以正常工作的。
原来是因为WebView默认没有开启文件下载的功能,如果要实现文件下载的功能,需要设置WebView的DownloadListener,通过实现自己的DownloadListener来实现文件的下载。具体操作如下:

1、设置WebView的DownloadListener:

webView.setDownloadListener(new MyWebViewDownLoadListener());

2、实现MyWebViewDownLoadListener这个类

private class MyWebViewDownLoadListener implements DownloadListener {

@Override
public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}

}
这只是调用系统中已经内置的浏览器进行下载,还没有WebView本身进行的文件下载,不过,这也基本上满足我们的应用场景了。

 ------------

10,webview--网络超时

public class TestJsActivity extends Activity {
private long timeout = 5000;
private WebView mWebView;

private Handler mHandler = new Handler();

private Timer timer;

@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
mWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setAllowFileAccess(true);
mWebView.setWebViewClient(new WebViewClient() {
/*
* onPageStarted中启动一个计时器,到达设置时间后利用handle发送消息给activity执行超时后的动作.
*/
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
Log.d("testTimeout", "onPageStarted...........");
super.onPageStarted(view, url, favicon);
timer = new Timer();
TimerTask tt = new TimerTask() {
@Override
public void run() {
/*
* 超时后,首先判断页面加载进度,超时并且进度小于100,就执行超时后的动作
*/
if (TestJsActivity.this.mWebView.getProgress() < 100) {
Log.d("testTimeout", "timeout...........");
Message msg = new Message();
msg.what = 1;
mHandler.sendMessage(msg);
timer.cancel();
timer.purge();
}
}
};
timer.schedule(tt, timeout, 1);
}

/**
* onPageFinished指页面加载完成,完成后取消计时器
*/
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
Log.d("testTimeout", "onPageFinished+++++++++++");
Log.d("testTimeout", "+++++++++++" + TestJsActivity.this.mWebView.getProgress());
timer.cancel();
timer.purge();
}
});
mWebView.loadUrl("http://image.baidu.com/i?ct=201326592&cl=2&nc=1&lm=-1&st=-1&tn=baiduimage&istype=2&fm=index&pv=&z=0&word=%D7%C0%C3%E6&s=0");
}
}
其中要注意的是onPageFinished的两点,第一点,官方是这样解释的:
Notify the host application that a page has finished loading. This method is called only for main frame. When onPageFinished() is called, the rendering picture may not be updated yet. To get the notification for the new Picture, use onNewPicture(WebView, Picture).

也就是说,程序只认为DOM加载完成就完成了,正在加载的图片不在这个范围之内。

第二点是,如果在JS文件中又动态去加载另一JS,onPageFinished方法会在所有的JS全部加载完毕后才调用。

 

原文地址:https://www.cnblogs.com/awkflf11/p/7003237.html