美文网首页U3D技术采集Android开发集锦
WebView控件之文件上传(打开图库和拍照)

WebView控件之文件上传(打开图库和拍照)

作者: 游戏开发小Y | 来源:发表于2017-04-21 18:51 被阅读53次

android webview在默认情况下是不支持网页中的文件上传功能的;

如果在网页中有<input type="file" />,在android webview中访问时也会出现浏览文件的按钮

但是点击按钮之后没有反应...

那么如何能够让android的webview能够响应,这个浏览按钮呢?

我们需要为webview设置WebChromeClient,在WebChromeClient的实现类中覆盖文件选择的方法:

      private ValueCallback<Uri> mUploadMessage;
    /**
     * 适配5.0系统
     */
    private ValueCallback<Uri[]> mUploadMessage5;
// 上传事件处理
        mWebView.setWebChromeClient(new WebChromeClient() {
            // Andorid 4.1+
            public void openFileChooser(ValueCallback<Uri> uploadFile,
                    String acceptType, String capture) {
                openFileChooser(uploadFile);
            }

            // Andorid 3.0 +
            public void openFileChooser(ValueCallback<Uri> uploadFile,
                    String acceptType) {
                openFileChooser(uploadFile);
            }

            // Android 3.0
            public void openFileChooser(ValueCallback<Uri> uploadFile) {
                mUploadMessage = uploadFile;
                OpenUpLoadFolder();
            }

            // 适配5.0系统
            @TargetApi(Build.VERSION_CODES.LOLLIPOP)
            public boolean onShowFileChooser(WebView webView,
                    ValueCallback<Uri[]> filePathCallback,
                    FileChooserParams fileChooserParams) {
                mUploadMessage5 = filePathCallback;
                OpenUpLoadFolder();
                return true;
            }
        });
/***  上傳文件對話框****/
    private void OpenUpLoadFolder() {
        final CharSequence[] items = { "拍照", "相册", "取消" };
        AlertDialog dlg = new AlertDialog.Builder(SencondActivity.this)
                .setTitle("选择图片").setCancelable(false)
                .setItems(items, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int item) {
                        // 这里item是根据选择的方式,
                        if (item == 0) {
                            startActivityForResult(Intent.createChooser(
                                    CameracaptuIntent(), "File Chooser"),
                                    FILECHOOSER_CameraCapture);
                        } else if (item == 1) {
                            startActivityForResult(Intent.createChooser(
                                    createCameraIntent(), "File Chooser"),
                                    FILECHOOSER_RESULTCODE);
                        } else if (item == 2) {
                            if (mUploadMessage5 != null) {
                                mUploadMessage5.onReceiveValue(null);
                                mUploadMessage5 = null;
                            }
                            if (mUploadMessage != null) {
                                mUploadMessage.onReceiveValue(null);
                                mUploadMessage = null;
                            }
                        }
                    }
                }).create();
        dlg.show();
    }
/***  选择图片文件 ****/
    private Intent createCameraIntent() {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        //intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("image/*");
        return intent;
    }
    Uri cameraUri=null;

    /*** 拍照 ****/
    private Intent CameracaptuIntent() {
        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// 拍照
        String sdStatus = Environment.getExternalStorageState();
        if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 检测sd是否可用
            // return;
        }
        File out = new File(
                Environment.getExternalStorageDirectory().getPath(), ImageName);
        if (!out.exists()) {
            out.mkdirs();
        }
        String Picname = new DateFormat().format("yyyyMMdd_hhmmss",
                Calendar.getInstance(Locale.CHINA))
                + ".jpg";
        out = new File(Environment.getExternalStorageDirectory().getPath(),
                ImageName + "/" + Picname);
        cameraUri = Uri.fromFile(out);
        cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, cameraUri);
        return cameraIntent;
    }
/*** 回調****/
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (requestCode == FILECHOOSER_CameraCapture) {
            if (null == mUploadMessage && null == mUploadMessage5) 
                return;
            Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();
            if (mUploadMessage5 != null) {  
                Uri[] results = null;
           if (resultCode == Activity.RESULT_OK) {
            if (data == null) {
                results = new Uri[]{cameraUri};
            } else {
                String dataString = data.getDataString();
                ClipData clipData = data.getClipData();

                if (clipData != null) {
                    results = new Uri[clipData.getItemCount()];
                    for (int i = 0; i < clipData.getItemCount(); i++) {
                        ClipData.Item item = clipData.getItemAt(i);
                        results[i] = item.getUri();
                    }
                }

                if (dataString != null)
                    results = new Uri[]{Uri.parse(dataString)};
            }
        }           mUploadMessage5.onReceiveValue(results);    
        mUploadMessage5= null;
        } else if (mUploadMessage != null) {  
            mUploadMessage.onReceiveValue(result);  
            mUploadMessage = null;}
        }
    
        
        if (requestCode == FILECHOOSER_RESULTCODE) {

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                if (null == mUploadMessage5) {
                    mUploadMessage5.onReceiveValue(null);  
                    mUploadMessage5=null;
                    return;
                }
                if (resultCode == RESULT_CANCELED) {
                    if (mUploadMessage5 != null) {
                        mUploadMessage5.onReceiveValue(null);  
                        mUploadMessage5=null;
                        return;
                    }
                }

            } else {
                if (null == mUploadMessage) {
                    mUploadMessage.onReceiveValue(null);
                    mUploadMessage = null;
                    return;
                }

                if (resultCode == RESULT_CANCELED) {
                    if (mUploadMessage != null) {
                        mUploadMessage.onReceiveValue(null);
                        mUploadMessage = null;
                        return;
                    }
                }
            }

            if (data == null)
                return;

            Uri result = data == null || resultCode != RESULT_OK ? null : data
                    .getData();
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                mUploadMessage5.onReceiveValue(new Uri[] { result });
                mUploadMessage5=null;
            } else {
                mUploadMessage.onReceiveValue(result);
                mUploadMessage=null;
            }
        } 
    }

相关文章

网友评论

    本文标题:WebView控件之文件上传(打开图库和拍照)

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