(转)WebView与JS交互和VedioView的简单使用

来源:互联网 发布:淘宝女装模特名字大全 编辑:程序博客网 时间:2024/05/20 23:04

一、WebView介绍转载自:http://www.2cto.com/kf/201608/536207.html

我们都知道我们的Native是可以和web页面中的JS进行交互的,而且方法都差不多,那我们就来看看他们的差别和使用场景吧

首先我们必须设置webView.getSettings().setJavaScriptEnabled(true);


1.Webview里面的界面调用Native Java代码(即调用本地代码)


首先我们需要定义一个类,在这个类中定义一些方法供我们的Js调用:
protected class AndroidJsInterface{        private Context context;        public AndroidJsInterface(Context context){            this.context = context;        }        @JavascriptInterface        public void showToast(String msg){            ToastUtil.showShort(context,msg);        }    }


值得注意的是,在Android4.2开始,我们必须田间@JavascriptInterface注解,我们的代码才能够被Js所调用。
然后我们就需要把这个接口类传递给Webview,然Js可以调用:webView.addJavascriptInterface(new AndroidJsInterface(this),"Android");

这个方法的第二个参数是任意一个String类型的值,这个字会关系到我们后面调用接口中的方法。
下面就是我在Html页面中定义了一个Button,让点击的时候调用Native的Toast,然后就是按钮,我们绑定了它的点击事件:
<!DOCTYPE html>   <html>     <head>          <script type="text/javascript">              function showToast(){                      Android.showToast("pupup window from HTML5!");                 }          </script>          <meta charset="utf-8">          <title>first html5 page</title>           <style type = "text/css">               p{font-size:150%;}           </style>     </head>     <body>       <header>          <h1>title</h1>       </header>       <section>          <button id ="test" onclick = "showToast()">click here show toast</button>          <article>              <p>this is a picture</p>          </article>          <figure class="marginRight"><img src ="http://avatar.csdn.net/D/1/F/1_qq_24956515.jpg" alt="Image"/></figure>        </section>     </body>  </html>

使用时代码里写上:

String myTest = "file:///android_asset/html_test22.html";        webView.loadUrl(myTest);
这里是使用本地的Html文件,如果有不懂请参考这篇文章:http://blog.csdn.net/u011150924/article/details/53079916

2.Native调用Webview中的Js


还记得我们前面讲过的WebViewClient吗?我们这里就需要先实现它,然后在它的onPagerFinish()回调函数中进行处理,这样是为了保证我们代码的正常运行,因为在以往的时候,当我们没有在这个回调当中执行操作,而是直接在LoadUrl()后就对页面进行操作,结果发现我们的代码没有起作用,最后发现是页面没有加载完成,而我们就去执行代码,所以造成了这种没必要的操作。
为了测试Native调用Js,我们现在Html页面中定义一个方法和一个Span标签:
这里写图片描述
在方法中我们让调用show()方法后,将Span标签里面的内容改为一个字符串,并弹出一个alert。
在Native中我们通过如下的LoadUrl()的方法调用这个函数:
这里写图片描述
就是这么简单,我们就实现了Native到Js的调用,但是我们用一个需求,我们向得到一个回调怎么办了?Google在Android4.4为我们新增加了一个新方法,这个方法比loadUrl方便,而且比loadUrl效率更高,因为每次load都会将页面刷新一次。

由于新增加的方法是4.4才引入的,所以我们使用的时候需要添加版本的判断:
这里写图片描述
如果是4.4之前的老版本,我们才用loadUrl的方式:
这里写图片描述

3.我们在开始的时候贴出了一个我们使用setJavaScriptEnable()的警告,那我们怎么来处理这个问题了,对于大多数的应用其实是不需要的,如果需要我们可以使用一种安全的方式,例如WebChromeClient中有一个onJsPrompt的回调方法,我们可以将我们需要传递的js命令转换为一种协议的模式,通过这个回调函数传递到我们的Native中,这样就避免了我们直接与代码交互,具体的过程在这里就不介绍了,下面提出一个该框架的github地址,大家需要的时候可以去下载:https://github.com/pedant/safe-java-js-webview-bridge


三、VedioView简单使用转载自:http://blog.csdn.net/chenzheng_java/article/details/6258456

  1. public class VideoActivity extends Activity {  
  2.   
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.video);  
  7.           
  8.         VideoView videoView = (VideoView)findViewById(R.id.videoView1);  
  9.         /*** 
  10.          * 将播放器关联上一个音频或者视频文件 
  11.          * videoView.setVideoURI(Uri uri) 
  12.          * videoView.setVideoPath(String path) 
  13.          * 以上两个方法都可以。 
  14.          */  
  15.         videoView.setVideoPath("data/yueding.mp3");  
  16.           
  17.         /** 
  18.          * w为其提供一个控制器,控制其暂停、播放……等功能 
  19.          */  
  20.         videoView.setMediaController(new MediaController(this));  
  21.           
  22.         /** 
  23.          * 视频或者音频到结尾时触发的方法 
  24.          */  
  25.         videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {  
  26.             @Override  
  27.             public void onCompletion(MediaPlayer mp) {  
  28.                 Log.i("通知""完成");  
  29.             }  
  30.         });  
  31.           
  32.         videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {  
  33.               
  34.             @Override  
  35.             public boolean onError(MediaPlayer mp, int what, int extra) {  
  36.                 Log.i("通知""播放中出现错误");  
  37.                 return false;  
  38.             }  
  39.         });  
  40.           
  41.     }  
  42. }  

video.xml

[xhtml] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent" android:layout_height="match_parent"  
  4.     android:orientation="horizontal">  
  5.     <VideoView android:layout_height="match_parent" android:id="@+id/videoView1"  
  6.         android:layout_width="wrap_content"></VideoView>  
  7. </LinearLayout>  
0 0