关于webview适配H5上传照片或者视频文件的方法


Posted in HTML / CSS onNovember 04, 2020

一、需要实现的功能:

用H5实现的App中需要在H5获取手机中的照片或者视频文件上传到服务器。

 关于webview适配H5上传照片或者视频文件的方法

二、分析实现方法:

由于不懂前端开发,不知道H5中有 input file之类的标签控件,可以用来选择文件,刚开始的思路还是想着native 端是否要通过提供inputstream流方式,将文件内容传递给JS。后来和前端沟通之后,H5在电脑端都是用input 设置type为 file 来实现文件选择功能,于是才开始搜索资料,发现时需要在webview中设置  setWebChromeClient ,其中有对input 的响应回调:

三、具体实现:

前端代码

<input type="file" accept="*/*" name="choose file">
<input type="file" accept="image/*" name="choose image">
<input type="file" accept="video/*" name="choose video">
<input type="file" accept="image/example" name="take photo and upload image">
<input type="file" accept="video/example" name="take video and upload video">

native端代码:

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean onShowFileChooser(WebView webView,
                                 ValueCallback<Uri[]> filePathCallback,
                                 WebChromeClient.FileChooserParams fileChooserParams) {
    mFilePathCallbacks = filePathCallback;
    // TODO: 根据标签中得接收类型,启动对应的文件类型选择器
    String[] acceptTypes = fileChooserParams.getAcceptTypes();
    for (String type : acceptTypes) {
        Log.d(TAG, "acceptTypes=" + type);
    }
    // 针对拍照后马上进入上传状态处理
    if ((acceptTypes.length > 0) && acceptTypes[0].equals("image/example")) {
        Log.d(TAG, "onShowFileChooser takePhoto");
        Intent it = CameraFunction.takePhoto(mContext);
        startActivityForResult(it, TAKE_PHOTO_AND_UPLOAD_REQUEST);
        return true;
    }

    // 针对录像后马上进入上传状态处理
    if ((acceptTypes.length > 0) && acceptTypes[0].equals("video/example")) {
        Log.d(TAG, "onShowFileChooser record video");
        Intent it = CameraFunction.recordVideo(mContext);
        startActivityForResult(it, RECORD_VIDEO_AND_UPLOAD_REQUEST);
        return true;
    }

    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    if (acceptTypes.length > 0) {
        if (acceptTypes[0].contains("image")) {
            intent.setType("image/*");
        } else if (acceptTypes[0].contains("video")) {
            intent.setType("video/*");
        } else {
            intent.setType("*/*");
        }
    } else {
        intent.setType("*/*");
    }

    WebViewActivity.this.startActivityForResult(Intent.createChooser(intent, "File Chooser"),
            REQUEST_FILE_PICKER);
    return true;
}

回调设置uri

/**
 * 设置input 标签出发的回调选择文件路径,优先使用path参数,
 * 其次使用uri参数
 * @param uriParam
 * @param pathParam
 */
private void setFilePathCallback(Uri uriParam, String pathParam) {
    //都为空,则设置null
    if (uriParam == null && pathParam == null) {
        if (mFilePathCallback != null) {
            mFilePathCallback.onReceiveValue(null);
        }
        if (mFilePathCallbacks != null) {
            mFilePathCallbacks.onReceiveValue(null);
        }
    } else if (null != pathParam) { // 优先使用path
        if (mFilePathCallback != null) {
            Uri uri = Uri.fromFile(new File(pathParam));
            mFilePathCallback.onReceiveValue(uri);
        }
        if (mFilePathCallbacks != null) {
            Uri uri = Uri.fromFile(new File(pathParam));
            mFilePathCallbacks.onReceiveValue(new Uri[] { uri });
        }
    } else if (null != uriParam) { //其次使用uri
        if (mFilePathCallback != null) {
            String path = UriUtils.getPath(getApplicationContext(), uriParam);
            Uri uri = Uri.fromFile(new File(path));
            mFilePathCallback.onReceiveValue(uri);
        }
        if (mFilePathCallbacks != null) {
            String path = UriUtils.getPath(getApplicationContext(), uriParam);
            Uri uri = Uri.fromFile(new File(path));
            mFilePathCallbacks.onReceiveValue(new Uri[] { uri });
        }
    }

    mFilePathCallback = null;
    mFilePathCallbacks = null;

}

针对各个请求场景进行处理:

public void onActivityResult(int requestCode, int resultCode, Intent intent) {

总结:既然用H5开发APP,就需要了解前端,不懂就要问了。查询方向要对,否则南辕北辙,方向有时候比努力重要!

到此这篇关于关于webview适配H5上传照片或者视频文件的方法的文章就介绍到这了,更多相关webview适配H5上传照片内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章,希望大家以后多多支持三水点靠木!

HTML / CSS 相关文章推荐
浅析两列自适应布局的3种思路
May 03 HTML / CSS
Web前端绘制0.5像素的几种方法
Aug 11 HTML / CSS
使用CSS3实现多列布局与多背景的技巧
Feb 29 HTML / CSS
利用css3画个同心圆示例代码
Jul 03 HTML / CSS
html5 touch事件实现触屏页面上下滑动(二)
Mar 10 HTML / CSS
html5自带表单验证体验优化及提示气泡修改功能
Sep 12 HTML / CSS
html5仿支付宝密码框的实现代码
Sep 06 HTML / CSS
html5桌面通知(Web Notifications)实例解析
Jul 07 HTML / CSS
移动HTML5前端框架—MUI的使用
Dec 18 HTML / CSS
HTML5调用手机发短信和打电话功能
Apr 29 HTML / CSS
h5封装下拉刷新
Aug 25 HTML / CSS
使用 CSS 轻松实现一些高频出现的奇形怪状按钮
Dec 06 HTML / CSS
浅析HTML5 meta viewport参数
Oct 28 #HTML / CSS
一个基于canvas的移动端图片编辑器的实现
Oct 28 #HTML / CSS
详解HTML5布局和HTML5标签
Oct 26 #HTML / CSS
HTML5实现移动端点击翻牌功能
Oct 23 #HTML / CSS
html5 拖拽及用 js 实现拖拽功能的示例代码
Oct 23 #HTML / CSS
html5小程序飞入购物车(抛物线绘制运动轨迹点)
Oct 19 #HTML / CSS
app内嵌H5 webview 本地缓存问题的解决
Oct 19 #HTML / CSS
You might like
PHP 简单日历实现代码
2009/10/28 PHP
基于PHP实现用户注册登录功能
2016/10/14 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
js实现的跟随鼠标移动的时钟效果(中英文日期显示)
2011/01/17 Javascript
jquery操作checked属性以及disabled属性的多种方法
2014/06/20 Javascript
javascript实现当前页导航激活的方法
2015/02/27 Javascript
js实现简单选项卡与自动切换效果的方法
2015/04/10 Javascript
在HTML中插入JavaScript代码的示例
2015/06/03 Javascript
Javascript验证Visa和MasterCard信用卡号的方法
2015/07/27 Javascript
JS组件Bootstrap Table使用实例分享
2016/05/30 Javascript
Node.js 实现简单小说爬虫实例
2016/11/18 Javascript
js实现横向拖拽导航条功能
2017/02/17 Javascript
详谈表单重复提交的三种情况及解决方法
2017/08/16 Javascript
BootstrapTable加载按钮功能实例代码详解
2017/09/22 Javascript
layui实现点击按钮给table添加一行
2018/08/10 Javascript
webpack打包非模块化js的方法
2018/10/24 Javascript
微信JS-SDK updateAppMessageShareData安卓不能自定义分享详解
2019/03/29 Javascript
vue项目中使用eslint+prettier规范与检查代码的方法
2020/01/16 Javascript
Python读写Excel文件的实例
2013/11/01 Python
python获取从命令行输入数字的方法
2015/04/29 Python
python实现人人自动回复、抢沙发功能
2018/06/08 Python
windows下cx_Freeze生成Python可执行程序的详细步骤
2018/10/09 Python
Python获取当前脚本文件夹(Script)的绝对路径方法代码
2019/08/27 Python
Python实现Restful API的例子
2019/08/31 Python
python的json中方法及jsonpath模块用法分析
2019/12/06 Python
一些常用的HTML5模式(pattern) 总结
2015/07/14 HTML / CSS
HTML5触摸事件实现移动端简易进度条的实现方法
2018/05/04 HTML / CSS
日本钓鱼渔具和户外用品网上商店:naturum
2016/08/07 全球购物
C#如何调用Word并打开一个Word文档
2013/05/08 面试题
党员公开承诺书
2014/03/25 职场文书
施工安全承诺书
2014/05/22 职场文书
销售求职信范文
2014/05/26 职场文书
公务员培的训心得体会
2014/09/01 职场文书
领导干部四风问题自我剖析材料
2014/09/25 职场文书
创先争优宣传标语
2014/10/08 职场文书
如何用PHP实现多线程编程
2021/05/26 PHP