1、定义
private ValueCallback<Uri> mUploadMessage;public ValueCallback<Uri[]> uploadMessage;private Uri imageUri;
2、webview 设置
webView.setWebChromeClient(new WebChromeClient(){// For 3.0+ Devices (Start)// onActivityResult attached before constructorprotected void openFileChooser(ValueCallback uploadMsg, String acceptType){mUploadMessage = uploadMsg;Intent i = new Intent(Intent.ACTION_GET_CONTENT);i.addCategory(Intent.CATEGORY_OPENABLE);i.setType("image/*");startActivityForResult(Intent.createChooser(i, "File Browser"), FILECHOOSER_RESULTCODE);}// For Lollipop 5.0+ Devices@TargetApi(Build.VERSION_CODES.LOLLIPOP)public boolean onShowFileChooser(WebView mWebView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams){if (uploadMessage != null) {
// uploadMessage.onReceiveValue(null);uploadMessage = null;}uploadMessage = filePathCallback;try{takePhoto();} catch (ActivityNotFoundException e){uploadMessage = null;Toast.makeText(getBaseContext(), "Cannot Open File Chooser", Toast.LENGTH_LONG).show();return false;}return true;}//For Android 4.1 onlyprotected void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture){mUploadMessage = uploadMsg;Intent intent = new Intent(Intent.ACTION_GET_CONTENT);intent.addCategory(Intent.CATEGORY_OPENABLE);intent.setType("image/*");startActivityForResult(Intent.createChooser(intent, "File Browser"), FILECHOOSER_RESULTCODE);}protected void openFileChooser(ValueCallback<Uri> uploadMsg){mUploadMessage = uploadMsg;Intent i = new Intent(Intent.ACTION_GET_CONTENT);i.addCategory(Intent.CATEGORY_OPENABLE);i.setType("image/*");startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);}});
3、调用摄像机
@NonNullprivate File createTakePhotoFile(){File imagePath = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES),"zzwlnet_driver");if (!imagePath.exists()){imagePath.mkdir();}File file = new File(imagePath,SystemClock.currentThreadTimeMillis() + ".jpg");return file;}public void takePhoto(){//调用系统相册
// Intent intentPhoto = new Intent(Intent.ACTION_PICK);Intent intentPhoto = new Intent(Intent.ACTION_GET_CONTENT);intentPhoto.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");//Environment.getExternalStorageDirectory().getPath()//调用系统相机File fileUri = createTakePhotoFile();imageUri = Uri.fromFile(fileUri);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){Log.d("********name*****",getPackageName());imageUri = FileProvider.getUriForFile(this,getPackageName() + ".fileprovider",fileUri);}Intent intentCamera = new Intent();if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){intentCamera.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);}intentCamera.setAction(MediaStore.ACTION_IMAGE_CAPTURE);intentCamera.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);Intent chooser = new Intent(Intent.ACTION_CHOOSER);chooser.putExtra(Intent.EXTRA_TITLE,"上传照片");chooser.putExtra(Intent.EXTRA_INTENT,intentPhoto);chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS,new Intent[]{intentCamera});startActivityForResult(chooser,REQUEST_SELECT_FILE);}
4、回调方法
@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent intent){Log.d("********resultCode*****", String.valueOf(resultCode));Log.d("*******requestCode*****", String.valueOf(requestCode));if (intent != null){Log.d("*******intent*****", String.valueOf(intent.getData()));}Log.d("*******SDK_INT*****", String.valueOf(Build.VERSION.SDK_INT));Log.d("*******LOLLIPOP*****", String.valueOf( Build.VERSION_CODES.LOLLIPOP));if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {Toast.makeText(getBaseContext(), "Failed to Upload Image", Toast.LENGTH_LONG).show();return;}if (requestCode != REQUEST_SELECT_FILE) {return;}if (uploadMessage == null){return;}if (intent != null){uploadMessage.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, intent));uploadMessage = null;return;}Uri[] results = new Uri[]{imageUri};uploadMessage.onReceiveValue(results);uploadMessage = null;}