前面的博文《Android开发笔记(一百五十二)H5通过WebView上传图片》介绍了如何拍照上传给网页,不料客户又要求再加个摄像上传给网页。既然如此,那么再探讨一下如何实现这个摄像上传的功能。

与拍照上传一样,摄像上传也要重写WebChromeClient的openFileChooser/onShowFileChooser方法,在这两个方法内部跳转到系统的摄像机页面,示例代码如下:
  1.     private static ValueCallback<Uri> mUploadMessage;
  2.     private static ValueCallback<Uri[]> mUploadMessageLollipop;
  3.     
  4.     private class MyWebChromeClient extends WebChromeClient {
  5.         // Android 4.*
  6.         public void openFileChooser(ValueCallback<Uri> uploadMsg,
  7.                 String acceptType, String capture) {
  8.             Log.d(TAG, "openFileChooser 4.1");
  9.             mUploadMessage = uploadMsg;
  10.             recordVideo();
  11.         }
  12.         // Android 5.0+
  13.         @Override
  14.         public boolean onShowFileChooser(WebView webView,
  15.                 ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
  16.             Log.d(TAG, "openFileChooser 5.0+");
  17.             mUploadMessageLollipop = filePathCallback;
  18.             recordVideo();
  19.             return true;
  20.         }
  21.     }
  22.     private final static int VIDEO_REQUEST = 120;
  23.     private void recordVideo() {
  24.         Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
  25.         //设置视频质量
  26.         intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
  27.         //设置视频时长
  28.         intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 10);
  29.         //开启摄像机
  30.         startActivityForResult(intent, VIDEO_REQUEST);
  31.     }
在摄像机页面录像结束,返回到上一页时回调onActivityResult方法,所以需要重写上个页面的onActivityResult方法,在该方法中把摄像结果传给h5网页。下面是回传视频的处理代码:
  1.     @Override
  2.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  3.         super.onActivityResult(requestCode, resultCode, data);
  4.         Log.d(TAG, "onActivityResult requestCode="+requestCode);
  5.         if (requestCode == VIDEO_REQUEST) {
  6.             if (null == mUploadMessage && null == mUploadMessageLollipop) {
  7.                 return;
  8.             }
  9.             Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();
  10.             Log.d(TAG, "onActivityResult path="+result.getPath());
  11.             if (mUploadMessageLollipop != null) {
  12.                 if (resultCode == RESULT_OK) {
  13.                     mUploadMessageLollipop.onReceiveValue(new Uri[]{result});
  14.                     mUploadMessageLollipop = null;
  15.                 } else {
  16.                     mUploadMessageLollipop.onReceiveValue(new Uri[]{});
  17.                     mUploadMessageLollipop = null;
  18.                 }
  19.             } else if (mUploadMessage != null) {
  20.                 if (resultCode == RESULT_OK) {
  21.                     mUploadMessage.onReceiveValue(result);
  22.                     mUploadMessage = null;
  23.                 } else {
  24.                     mUploadMessage.onReceiveValue(Uri.EMPTY);
  25.                     mUploadMessage = null;
  26.                 }
  27.             }
  28.         }
  29.     }

上面代码应该是完成摄像上传了,但是要怎样验证是否上传成功呢?当然是在当前网页直接观看网页已上传的视频,如果网页都能正常播放视频,说明这个摄像视频的的确确是成功上传了。让WebView支持观看网页视频的话,得进行以下的WebSettings设置操作,相关的设置代码如下所示:
  1.     private void initSetting() {
  2.         WebSettings webSettings = webView.getSettings();
  3.         webSettings.setJavaScriptEnabled(true);
  4.         webSettings.setPluginState(WebSettings.PluginState.ON);
  5.         webSettings.setUseWideViewPort(true); // 支持HTML的“viewport”标签或者使用wide viewport
  6.         webSettings.setAllowFileAccess(true); // 允许访问文件
  7.         webSettings.setSupportZoom(true); // 支持缩放
  8.         webSettings.setLoadWithOverviewMode(true);
  9.         webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); // 不加载缓存内容
  10.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  11.             webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
  12.         }
  13.         webSettings.setDomStorageEnabled(true);
  14.     }

最后通过演示界面截图,观察一下摄像上传的完整流程。一开始打开WebView所在的页面,此时显示初始网页如下图所示:
Android开发笔记(一百六十六)H5通过WebView录像上传

点击红色按钮,跳到系统的摄像机页面,摄像结束后返回当前页面,此时网页下方出现了一个视频占位图标,如下图所示:
Android开发笔记(一百六十六)H5通过WebView录像上传

点击占位图标上的三角符号,则网页开始播放已上传的摄像视频,下面的图片正是播放过程中的截图:
Android开发笔记(一百六十六)H5通过WebView录像上传


点此查看Android开发笔记的完整目录

转自:https://blog.csdn.net/aqi00/article/details/79635133

相关文章: