700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Android webview Input type=file 文件上传 解决方法

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

时间:2022-06-21 10:36:11

相关推荐

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

默认的情况下在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 thispublic 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 fileprivate 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);}

重写方法:

@Overrideprotected 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 positiveif(resultCode== Activity.RESULT_OK){if(requestCode == FCR){if(null == mUMA){return;}if(intent == null){//Capture Photo if no image availableif(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;

测试

成功!!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。