一、 首先要了解android和js的代码交互问题。
需要加入
webview.getSettings().setJavaScriptEnabled(true);//支持js
webview.getSettings().setPluginsEnabled(true);//设置webview支持插件
至于js与android交互的话会有安全性问题,只需将需要传过的对象封装成相应的接口形式即可,
webview.getSettings().setJavaScriptEnabled(true);//支持js
webview.getSettings().setPluginsEnabled(true);//设置webview支持插件
webView.loadUrl(videoUrl);
webView.addJavascriptInterface(obj,"myObj");
obj可以是对象也可以是相应的实体类(接口类均可)
这样往往会出现加载html中的视频时会没有画面,同时要在Manifest配置文件的application中加入 android:hardwareAccelerated="true" 硬件加速,这样才能够播放视频。
二、 具体步骤如下:
有很多设备开发时只有声音,没有画面,这个时候在androidmanifest.xml中添加应用程序application中设置硬件渲染为true,在Oncreate函数中启用硬件渲染即可。具体步骤如下:
1、androidmanifest.xml文件设置如下属性:
android:hardwareAccelerated="true"
2、OnCreate中添加:
getWindow().addFlags(
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
做网页视频只有声音没画面,一般这样可以解决。并不是所有机型都可以,也有特例,比较少。
三、 WebView硬件加速导致页面渲染闪烁
4.0以上的系统我们开启硬件加速后,WebView渲染页面更加快速,拖动也更加顺滑。但有个副作用就是,当WebView视图被整体遮住一块,然后突然恢复时(比如使用SlideMenu将WebView从侧边滑出来时),这个过渡期会出现白块同时界面闪烁。解决这个问题的方法是在过渡期前将WebView的硬件加速临时关闭,过渡期后再开启,代码如下:
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
最后附上一个完整的webview加载html页面的代码:
package *
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.webkit.JavascriptInterface;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebSettings.LayoutAlgorithm;
import android.webkit.WebView;
import android.widget.ImageView;
import android.widget.RelativeLayout;
@SuppressLint("SetJavaScriptEnabled") public class VideoWebViewActivity extends Activity{
private WebView webView;
private RelativeLayout rel_top;
private ImageView img_back;
Intent intent=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 去除标题栏
getWindow().addFlags(
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.nms_producturl_webview);
AndroidApplication.getInstance().addActivity(this);
setupView();
intent=getIntent();
// initText();
}
@SuppressWarnings("deprecation")
private void setupView() {
webView=(WebView)findViewById(R.id.productUrl_webview);
WebSettings webSettings=webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webSettings.setLayoutAlgorithm(LayoutAlgorithm. NORMAL );
webView.setVerticalScrollBarEnabled( false );
webView.requestFocusFromTouch();
webSettings.setBuiltInZoomControls(true);
webSettings.setSupportZoom(true);
webSettings.setPluginsEnabled(true); //支持插件
webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小
webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小
rel_top=(RelativeLayout)findViewById(R.id.rel_top);
rel_top.setVisibility(View.GONE);
// img_back=(ImageView)findViewById(R.id.web_back);
// img_back.setOnClickListener(new OnClickListener() {
// @Override
// public void onClick(View v) {
// // TODO Auto-generated method stub
// VideoWebViewActivity.this.finish();
// }
// });
Intent intent=getIntent();
String videoUrl=intent.getStringExtra("videoUrl");
// String keyFrameUrl=intent.getStringExtra("keyFrameUrl");
// String videoUrl="http://link.hhtjim.com/yyt/2711420.mp4";
String keyFrameUrl="http://img.qhdxw.com/all/uploads/allimg/20161210/170.jpg";
webView.setWebChromeClient( new MyWebChromeClient());
//从本地android向html传递的对象
MyObject obj=new MyObject(videoUrl, keyFrameUrl);
if(videoUrl!=null)
{
// webView.loadUrl("file:///android_asset/jQuery-video5.10.8/index.html");
webView.loadUrl(videoUrl);
}
webView.addJavascriptInterface(obj,"myObj");
//这里的myObj是javaScript对象,直接调用getTime()方法,即 myObj.getTime();
}
public class MyObject {
private Context mContext;
private String videoUrl;
private String keyFrameUrl;
public MyObject(Context c,String videoUrl,String keyFrameUrl){
this.videoUrl = videoUrl;
this.keyFrameUrl = keyFrameUrl;
mContext = c;
}
public MyObject(String videoUrl,String keyFrameUrl){
this.videoUrl = videoUrl;
this.keyFrameUrl = keyFrameUrl;
}
/**
* 获取videoUrl数据
* @return
*/
@JavascriptInterface
public String getVideoUrl(){
Logger.i("测试从android传入html页面的数据::=="+videoUrl);
return videoUrl;
}
/**
* 获取关键帧数据url
* @return
*/
@JavascriptInterface
public String getKeyFrameUrl(){
Logger.i("测试从android传入html页面的数据::=="+keyFrameUrl);
return keyFrameUrl;
}
}
/**
* 防止从html页面返回之后直接退出了主页面,实际上返回应该回到原声的app页面
* @author A_huan
* 2017-3-5
*/
final class MyWebChromeClient extends WebChromeClient {
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
// Log.d(LOG_TAG, message);
result.confirm();
view.loadUrl(url);
return true;
}
}
}