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

来源:互联网 发布:软件危机的例子 编辑:程序博客网 时间:2024/05/02 12:06

一、         首先要了解android和js的代码交互问题。

   需要加入

webview.getSettings().setJavaScriptEnabled(true);//支持js

webview.getSettings().setPluginsEnabled(true);//设置webview支持插件

至于js与android交互的话会有安全性问题,只需将需要传过的对象封装成相应的接口形式即可,

webview.getSettings().setJavaScriptEnabled(true);//支持jswebview.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;@Overridepublic 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 */@JavascriptInterfacepublic String getVideoUrl(){Logger.i("测试从android传入html页面的数据::=="+videoUrl);return videoUrl;}/** * 获取关键帧数据url * @return */@JavascriptInterfacepublic String getKeyFrameUrl(){Logger.i("测试从android传入html页面的数据::=="+keyFrameUrl);return keyFrameUrl;}}/** * 防止从html页面返回之后直接退出了主页面,实际上返回应该回到原声的app页面 * @author A_huan * 2017-3-5 */final class MyWebChromeClient extends WebChromeClient {@Overridepublic boolean onJsAlert(WebView view, String url, String message, JsResult result) {// Log.d(LOG_TAG, message);result.confirm();view.loadUrl(url);return true;}}}








1 0