Android java与html js交互 html视频播放没有画面 画面卡顿

一、         首先要了解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;
		}
	}

}








你可能感兴趣的:(Android,java与js交互的那些事。,webview加载视频,Android学习历程)