Android webview Input type=file 文件上传 解决方法

来源:互联网 发布:人工智能主要研究方向 编辑:程序博客网 时间:2024/05/17 07:26

默认的情况下在HTML中 写

<input type=file />

的时候回弹出选择文件的窗口,但实际上在webview中默认的是不弹出窗口的

解决方法

在WebChromeClient中增加一些方法:

webView.setWebChromeClient(new WebChromeClient(){            //For Android 3.0+            public void openFileChooser(ValueCallback<Uri> uploadMsg){                mUM = uploadMsg;                Intent i = new Intent(Intent.ACTION_GET_CONTENT);                i.addCategory(Intent.CATEGORY_OPENABLE);                i.setType("*/*");                MainActivity.this.startActivityForResult(Intent.createChooser(i,"File Chooser"), FCR);            }            // For Android 3.0+, above method not supported in some android 3+ versions, in such case we use this            public void openFileChooser(ValueCallback uploadMsg, String acceptType){                mUM = uploadMsg;                Intent i = new Intent(Intent.ACTION_GET_CONTENT);                i.addCategory(Intent.CATEGORY_OPENABLE);                i.setType("*/*");                MainActivity.this.startActivityForResult(                        Intent.createChooser(i, "File Browser"),                        FCR);            }            //For Android 4.1+            public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture){                mUM = uploadMsg;                Intent i = new Intent(Intent.ACTION_GET_CONTENT);                i.addCategory(Intent.CATEGORY_OPENABLE);                i.setType("*/*");                MainActivity.this.startActivityForResult(Intent.createChooser(i, "File Chooser"), MainActivity.FCR);            }            //For Android 5.0+            public boolean onShowFileChooser(                    WebView webView, ValueCallback<Uri[]> filePathCallback,                    WebChromeClient.FileChooserParams fileChooserParams){                if(mUMA != null){                    mUMA.onReceiveValue(null);                }                mUMA = filePathCallback;                Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);                if(takePictureIntent.resolveActivity(MainActivity.this.getPackageManager()) != null){                    File photoFile = null;                    try{                        photoFile = createImageFile();                        takePictureIntent.putExtra("PhotoPath", mCM);                    }catch(IOException ex){                        Log.e(TAG, "Image file creation failed", ex);                    }                    if(photoFile != null){                        mCM = "file:" + photoFile.getAbsolutePath();                        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));                    }else{                        takePictureIntent = null;                    }                }                Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT);                contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE);                contentSelectionIntent.setType("*/*");                Intent[] intentArray;                if(takePictureIntent != null){                    intentArray = new Intent[]{takePictureIntent};                }else{                    intentArray = new Intent[0];                }                Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);                chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent);                chooserIntent.putExtra(Intent.EXTRA_TITLE, "Image Chooser");                chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray);                startActivityForResult(chooserIntent, FCR);                return true;            }        });

增加方法:

 // Create an image file    private File createImageFile() throws IOException{        @SuppressLint("SimpleDateFormat") String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());        String imageFileName = "img_"+timeStamp+"_";        File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);        return File.createTempFile(imageFileName,".jpg",storageDir);    }

重写方法:

@Override    protected void onActivityResult(int requestCode, int resultCode, Intent intent){        super.onActivityResult(requestCode, resultCode, intent);        if(Build.VERSION.SDK_INT >= 21){            Uri[] results = null;            //Check if response is positive            if(resultCode== Activity.RESULT_OK){                if(requestCode == FCR){                    if(null == mUMA){                        return;                    }                    if(intent == null){                        //Capture Photo if no image available                        if(mCM != null){                            results = new Uri[]{Uri.parse(mCM)};                        }                    }else{                        String dataString = intent.getDataString();                        if(dataString != null){                            results = new Uri[]{Uri.parse(dataString)};                        }                    }                }            }            mUMA.onReceiveValue(results);            mUMA = null;        }else{            if(requestCode == FCR){                if(null == mUM) return;                Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData();                mUM.onReceiveValue(result);                mUM = null;            }        }    }

有些变量事先声明:

  private static final String TAG = MainActivity.class.getSimpleName();    private String mCM;    private ValueCallback<Uri> mUM;    private ValueCallback<Uri[]> mUMA;    private final static int FCR=1;

测试

成功!!

0 0
原创粉丝点击