一、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/530799162.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
public class VideoActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.video); VideoView videoView = (VideoView)findViewById(R.id.videoView1); /*** * 将播放器关联上一个音频或者视频文件 * videoView.setVideoURI(Uri uri) * videoView.setVideoPath(String path) * 以上两个方法都可以。 */ videoView.setVideoPath("data/yueding.mp3"); /** * w为其提供一个控制器,控制其暂停、播放……等功能 */ videoView.setMediaController(new MediaController(this)); /** * 视频或者音频到结尾时触发的方法 */ videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { Log.i("通知", "完成"); } }); videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { Log.i("通知", "播放中出现错误"); return false; } }); } }
video.xml
[xhtml] view plain copy <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <VideoView android:layout_height="match_parent" android:id="@+id/videoView1" android:layout_width="wrap_content"></VideoView> </LinearLayout>