When clicking an Input File button on webview,
we want to take a picture from camera and place the image to that input.
1. Declare instance variables
private final static int CAPTURE_RESULTCODE = 1;
private ValueCallback<Uri> mUploadMessage;
private String filePath;
2. Set custom webChromeClient to WebView
myWebView.setWebChromeClient(new WebChromeClient() {
@SuppressWarnings("unused")
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
openFileChooser(uploadMsg);
}
@SuppressWarnings("unused")
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
openFileChooser(uploadMsg);
}
public void openFileChooser(ValueCallback<Uri> uploadMsg) {
this.mUploadMessage = uploadMsg;
File imageStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "appName");
this.filePath = imageStorageDir + File.separator + "IMG_" + String.valueOf(System.currentTimeMillis()) + ".jpg";
File file = new File(this.filePath);
Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
MainActivity.this.startActivityForResult(captureIntent, CAPTURE_RESULTCODE);
}
});
3. Apply onActivityResult to handle the picture after capture
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == CAPTURE_RESULTCODE) {
if (null == this.mUploadMessage || (resultCode != RESULT_OK && !new File(filePath).exists())) {
this.mUploadMessage.onReceiveValue(null);
} else {
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DATA, this.filePath);
this.mUploadMessage.onReceiveValue(this.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values));
}
this.mUploadMessage = null;
}
}