Make Android WebView Support File Upload

How to make android webview support image or files upload

The WebView of android can be configured to support file upload, the code below can make the webview support file upload.

The code is a bit long, so you need carefully implement it to your webview activity, remember to place the code below the setWebviewClient method


Advertisements


For reference, i will upload the full code file here in the end of this post, you can use it for reference.

The code for enabling file upload in webview

First, add these code above the oncreate method

    private static final int REQUEST_STORAGE = 1;
    private static final int REQUEST_LOCATION = 2;
    public ValueCallback<Uri> mUploadMessage;
    public static final int FILECHOOSER_RESULTCODE = 5173;

Then add this code below webviewclient

public void openFileChooser(ValueCallback<Uri> uploadMsg) {
this.openFileChooser(uploadMsg, "*/*");
}

public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
this.openFileChooser(uploadMsg, acceptType, null);
}

public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
mUploadMessage = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("*/*");
WebActivityDark.this.startActivityForResult(Intent.createChooser(i, "File Browser"),
FILECHOOSER_RESULTCODE);
}

public boolean onShowFileChooser(

WebView webView, ValueCallback<Uri[]> filePathCallback,
FileChooserParams fileChooserParams) {
if (mUMA != null) {
mUMA.onReceiveValue(null);
}
mUMA = filePathCallback;
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(WebActivityDark.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;
}
});
}

@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 class Callback extends WebViewClient {
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
Toast.makeText(getApplicationContext(), "Failed loading! try reloading", Toast.LENGTH_SHORT).show();
webl.loadUrl("file:///android_asset/help.html");
}
}

// 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);

}

For your reference, the full java code is here WebActivity


If you want me fix your webview file

Update: I see many people are having trouble to implement this code in their Android project, this is because the code is a bit long and can be complex if you are new to development.

So if you really can’t put this code in your app to enable webview file upload, i can do it for you for a small fee of US $2 (120 Rupees).

Just Email me your webview activity file and i will fix your webview errors. You can pay me using paypal, direct account transfer, phonepe,UPI etc or any other payment method that your country supports

I will make sure your app supports webview file upload, it is guaranteed. For more details, contact me at [email protected].


WebView Prebuilt App Projects

If you want a webview app project that already has codes for webview upload and other features such as progressbar, whatsapp facebook share, custom error pages etc, see this page

See a list of other services i offer in this page Services

, ,

Post navigation

21 thoughts on “Make Android WebView Support File Upload

  1. Can you please provide the entire ( all files )soure code for WebView which supports file upload ??

  2. Hi Admin, This code didn’t work for me,
    My website is a WordPress website (Hope that’s not a criteria for it not to work.)
    Can you please help me out?

  3. Hi Admin, thanks for your feedback.

    I don’t really know how to import parameters (I’m new to Android Studio).

    I just copied the code below the existing code on “MainActivity”

  4. Hi, looking for a simple example to only use with android file upload.
    Open website with loadUrl() and click there “Choose file….”, but can not get it to work
    with webView :-/

    Can you help and provide very basic working example project for this?

  5. This guy really helped me out. You guys better ask him
    he had good logical thinking and a problem solver for sure

Comments

This site uses Akismet to reduce spam. Learn how your comment data is processed.