Android(安卓)java与html js交互 html视频播放没有画面 画面卡顿
一、 首先要了解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;}}}
更多相关文章
- Android实现页面跳转的几种方式(转贴)
- 安装busybox到Android设备
- Android(安卓)国际化(多语言)兼容8.0
- h5页面与Android原生页面交互
- Android(安卓)NDK会带来什么,除去你对NDK的一些误解
- Android应用程序请求SurfaceFlinger服务渲染Surface的过程分析
- Android(安卓)Studio项目中使用 AndroidX支持库的相关配置说明
- Android调用OpenGL绘制曲线入门手册
- Android中的图形图像