前面的博文《Android开发笔记(一百五十二)H5通过WebView上传图片》介绍了如何拍照上传给网页,不料客户又要求再加个摄像上传给网页。既然如此,那么再探讨一下如何实现这个摄像上传的功能。
与拍照上传一样,摄像上传也要重写WebChromeClient的openFileChooser/onShowFileChooser方法,在这两个方法内部跳转到系统的摄像机页面,示例代码如下:
上面代码应该是完成摄像上传了,但是要怎样验证是否上传成功呢?当然是在当前网页直接观看网页已上传的视频,如果网页都能正常播放视频,说明这个摄像视频的的确确是成功上传了。让WebView支持观看网页视频的话,得进行以下的WebSettings设置操作,相关的设置代码如下所示:
最后通过演示界面截图,观察一下摄像上传的完整流程。一开始打开WebView所在的页面,此时显示初始网页如下图所示:

点击红色按钮,跳到系统的摄像机页面,摄像结束后返回当前页面,此时网页下方出现了一个视频占位图标,如下图所示:

点击占位图标上的三角符号,则网页开始播放已上传的摄像视频,下面的图片正是播放过程中的截图:

点此查看Android开发笔记的完整目录
与拍照上传一样,摄像上传也要重写WebChromeClient的openFileChooser/onShowFileChooser方法,在这两个方法内部跳转到系统的摄像机页面,示例代码如下:
-
private static ValueCallback<Uri> mUploadMessage;
-
private static ValueCallback<Uri[]> mUploadMessageLollipop;
-
-
private class MyWebChromeClient extends WebChromeClient {
-
-
// Android 4.*
-
public void openFileChooser(ValueCallback<Uri> uploadMsg,
-
String acceptType, String capture) {
-
Log.d(TAG, "openFileChooser 4.1");
-
mUploadMessage = uploadMsg;
-
recordVideo();
-
}
-
-
// Android 5.0+
-
@Override
-
public boolean onShowFileChooser(WebView webView,
-
ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
-
Log.d(TAG, "openFileChooser 5.0+");
-
mUploadMessageLollipop = filePathCallback;
-
recordVideo();
-
return true;
-
}
-
}
-
-
private final static int VIDEO_REQUEST = 120;
-
private void recordVideo() {
-
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
-
//设置视频质量
-
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
-
//设置视频时长
-
intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 10);
-
//开启摄像机
-
startActivityForResult(intent, VIDEO_REQUEST);
-
}
在摄像机页面录像结束,返回到上一页时回调onActivityResult方法,所以需要重写上个页面的onActivityResult方法,在该方法中把摄像结果传给h5网页。下面是回传视频的处理代码:
-
@Override
-
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
-
super.onActivityResult(requestCode, resultCode, data);
-
Log.d(TAG, "onActivityResult requestCode="+requestCode);
-
if (requestCode == VIDEO_REQUEST) {
-
if (null == mUploadMessage && null == mUploadMessageLollipop) {
-
return;
-
}
-
Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();
-
Log.d(TAG, "onActivityResult path="+result.getPath());
-
if (mUploadMessageLollipop != null) {
-
if (resultCode == RESULT_OK) {
-
mUploadMessageLollipop.onReceiveValue(new Uri[]{result});
-
mUploadMessageLollipop = null;
-
} else {
-
mUploadMessageLollipop.onReceiveValue(new Uri[]{});
-
mUploadMessageLollipop = null;
-
}
-
} else if (mUploadMessage != null) {
-
if (resultCode == RESULT_OK) {
-
mUploadMessage.onReceiveValue(result);
-
mUploadMessage = null;
-
} else {
-
mUploadMessage.onReceiveValue(Uri.EMPTY);
-
mUploadMessage = null;
-
}
-
}
-
}
-
}
上面代码应该是完成摄像上传了,但是要怎样验证是否上传成功呢?当然是在当前网页直接观看网页已上传的视频,如果网页都能正常播放视频,说明这个摄像视频的的确确是成功上传了。让WebView支持观看网页视频的话,得进行以下的WebSettings设置操作,相关的设置代码如下所示:
-
private void initSetting() {
-
WebSettings webSettings = webView.getSettings();
-
webSettings.setJavaScriptEnabled(true);
-
webSettings.setPluginState(WebSettings.PluginState.ON);
-
webSettings.setUseWideViewPort(true); // 支持HTML的“viewport”标签或者使用wide viewport
-
webSettings.setAllowFileAccess(true); // 允许访问文件
-
webSettings.setSupportZoom(true); // 支持缩放
-
webSettings.setLoadWithOverviewMode(true);
-
webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); // 不加载缓存内容
-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
-
}
-
webSettings.setDomStorageEnabled(true);
-
}
最后通过演示界面截图,观察一下摄像上传的完整流程。一开始打开WebView所在的页面,此时显示初始网页如下图所示:
点击红色按钮,跳到系统的摄像机页面,摄像结束后返回当前页面,此时网页下方出现了一个视频占位图标,如下图所示:
点击占位图标上的三角符号,则网页开始播放已上传的摄像视频,下面的图片正是播放过程中的截图:
点此查看Android开发笔记的完整目录
转自:https://blog.csdn.net/aqi00/article/details/79635133