美文网首页
WebView中调用系统文件选择器

WebView中调用系统文件选择器

作者: 离人歌 | 来源:发表于2017-06-09 10:24 被阅读233次

有时候用webview加载了一个页面,页面里有上传文件或者图片的按钮,点击要唤起本地文件选择器,可以借鉴以下代码:

   webview.setWebChromeClient(new FilePickWebChromeClient());//这个无需解释了 以下是FilePickWebChromeClient的具体代码
    
    //两个处理文件选择后回调给web的变量
    ValueCallback<Uri> mUploadMessage;
    ValueCallback<Uri[]> mFilePathCallback;

    //FilePickWebChromeClient
    private class FilePickWebChromeClient extends WebChromeClient {

        public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
            if (mFilePathCallback != null)
                return true;
            mFilePathCallback = filePathCallback;//一个回调的初始化
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                //如果选择的是拍照,这个值应该是类似这种image/jpeg,image/jpg,image/gif,image/png,image/bmp,所以我选择了判断包含
                if(fileChooserParams.getAcceptTypes()[0].contains("image")){
                    selectImage();//选择图片
                }else{
                    selectFile();//选择文件
                }
            }
            return true;
        }
        // For Android 3.0+
        public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
            //此处同以上
            if (mUploadMessage != null)
                return;
            mUploadMessage = uploadMsg;//另一个回调的初始化
            if(!StringUtil.isEmpty(acceptType) && acceptType.contains("image")){
                selectImage();
            }else {
                selectFile();
            }

        }
        // For Android < 3.0
        public void openFileChooser(ValueCallback<Uri> uploadMsg) {
            openFileChooser( uploadMsg, "" );
        }
        // For Android  > 4.1.1
        public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
            openFileChooser(uploadMsg, acceptType);
        }

    }
  //#################### 以上为FilePickWebChromeClient #########################
    public static final int REC_REQUESTCODE = 1;
  //选择文件 开始调用系统的文件选择器
    private void selectFile() {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("*/*");//这个是所有类型文件的筛选 如果只想要图片可以设置image/*   网上有各种文件类型的说明,可以根据自己的需要配置
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        startActivityForResult(intent,REC_REQUESTCODE);
    }

 //#################### 以上为调用系统文件选择器 #########################
    //选择文件后的回调
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        //判断事件完成,就是选择完图片
        try {
            if (requestCode == REC_REQUESTCODE && resultCode == Activity.RESULT_OK) {
                Uri uri = null;
                if (data != null) {
                    uri = data.getData();
                    //拿到Uri  web回调只需要uri 所以转成绝对地址什么的是没有意义的
                    if(mFilePathCallback != null){
                        Uri[] uris = new Uri[1];
                        uris[0] = uri;
                        mFilePathCallback.onReceiveValue(uris);//回调
                    }else {
                        mUploadMessage.onReceiveValue(uri);//或者另一种回调
                    }
                    mFilePathCallback = null;
                    mUploadMessage = null;
                }
            }
        } catch (Exception ex) {
           
        }finally {
            //重点来了 !!!一次按钮点击 唤起事件后 无论你是否选择了文件  最后结束操作都必须调用以下内容 否则按钮就会出现只能点一次的现象,点击第二次就会无反应,
            if(mFilePathCallback != null){
                Uri[] uris = new Uri[1];
                uris[0] = Uri.parse("");
                mFilePathCallback.onReceiveValue(uris);
                mFilePathCallback=null;
            }else if(mUploadMessage != null){
                mUploadMessage.onReceiveValue(Uri.parse(""));
                mUploadMessage=null;
            }

        }

    }
 //#################### 以上为回调 #########################



此代码测试机型为
Nexus6P 原生Android7.1.2
MotoX2代 原生Android5.1
小米6 MIUI8.2.25.0 Android7.1.1

相关文章

  • WebView中调用系统文件选择器

    有时候用webview加载了一个页面,页面里有上传文件或者图片的按钮,点击要唤起本地文件选择器,可以借鉴以下代码:...

  • Android WebView文件上传各版本区别

    android中处理webView文件上传需要处理的方法,5.0以前是调用系统的隐藏方法,5.0及以后sdk已经将...

  • 安卓导入web html 文件快速读写方法

    总所周知在安卓的资源文件中可以直接放入文件,webView 加载的时候可以直接调用(webview.loadUrl...

  • Linux系统编程之文件I/O (一)

    本文算是入门系统调用,以文件io为起点,研究系统调用的API,包括打开文件、关闭文件、从文件中读取数据和向文件中写...

  • Android中webview与js的交互(一)

    webview中调用js html中调用java android中配置 html中使用 总结 webview与js...

  • Android WebView

    使用流程 方式一 在Activity布局文件中添加控件 在代码中获取控件实例,调用loadUrl...

  • WebView

    布局中创建 WebView 控件: 使用 WebView 控件: 调用 WebView 的** getSettin...

  • 2020-07-08 CSS 笔记

    CSS选择器 标签选择器 类选择器 class在HTML中可多次调用 id选择器1 id在HTML中只能单次调用 ...

  • Android-加载webview

    1、在onCreate中创建webview 2、webview方法调用 3、webview的activity_we...

  • JS调用OC

    1 webView初始化 添加webViewDelegate 2 引入头文件 3 js调用按钮 4 在OC代码中关...

网友评论

      本文标题:WebView中调用系统文件选择器

      本文链接:https://www.haomeiwen.com/subject/jzpxqxtx.html