How to enable Upload button to Upload files in Android WebView
How to enable Upload button to Upload files in Android WebView
In this post, we will enable the upload button in Android WebView to upload files to a Website.
Some Websites, like a video/mp3 converter, educational website. You have to upload something to proceed to the next step and in our Android WebView, we have to enable that upload button programmatically so that you can upload your needed documents to a website.
For that do some code in your Browser activity.
BrowserActivity.java before onCreate
private final static int FCR = 1;
private String mCM;
private ValueCallback<Uri> mUM;
private ValueCallback<Uri[]> mUMA;
@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;
}
}
}
In OnCreate in BrowserActivity.java
When you finished initializing your WebView.
When you finished initializing your WebView.
if (Build.VERSION.SDK_INT >= 21) {
webSettings.setMixedContentMode(0);
wv.setLayerType(View.LAYER_TYPE_HARDWARE, null);
} else if (Build.VERSION.SDK_INT >= 19) {
wv.setLayerType(View.LAYER_TYPE_HARDWARE, null);
} else if (Build.VERSION.SDK_INT < 19) {
wv.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
wv.setWebViewClient(new Callback());
wv.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("*/*");
Refresh.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("*/*");
Refresh.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("*/*");
Refresh.this.startActivityForResult(Intent.createChooser(i, "File Chooser"), Refresh.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(Refresh.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, "Choose an Action");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray);
startActivityForResult(chooserIntent, FCR);
return true;
}
});
And Three methods after OnCreate finished in BrowserActivity.java
Now, You can successfully upload files to a WebSite with Android WebView.
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
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
public class Callback extends WebViewClient {
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
Toast.makeText(getApplicationContext(), "Failed loading app!", Toast.LENGTH_SHORT).show();
}
}
Now, You can successfully upload files to a WebSite with Android WebView.
Subscribe to Harpreet studio on Youtube
Like Harpreet Studio on Facebook
Follow me on Instagram
How to make Website like you make a playlist on it with voice on YouTube Give Value to others
ReplyDeleteSend the full source code
ReplyDeleteIn the time of advanced mobile phones and tablets, Android controlled gadgets have effectively figured out how to cut an extraordinary personality for them. Brighter Guide
ReplyDeleteRefresh is not defined
ReplyDeleteIN MENFIST ALSO NEED TO GIVE PERMITION?
ReplyDeletehello guys the code looks great but it seems you forgot to define the refresh method. If you can upload the revised code sample that would be perfect!
ReplyDeleteToo late reply, but in video errors are resolved, and you can also delete that refresh.this or replace with your activity name
DeleteThere is an expanding necessity of sending enormous files to a far off area. transfer files
ReplyDeleteAny news about Refresh method?
ReplyDeleteMin 3:12 i realized that Refresh method is the MainActivity class
DeleteToo late reply, but yes you are right, in video errors are resolved, and you can also delete that refresh.this or replace with your activity name
DeleteHi, am new to Kotlin Android Studio. Where do I find Browserctivity.java. How do I use this on a new project.
ReplyDeleteBrowser activity is just your activity name, replace it with your activity name..
DeletePlease give me a full source code.
ReplyDeleteYou there, this is really good post here. Thanks for taking the time to post such valuable information. Quality content is what always gets the visitors coming. file upload
ReplyDeletehie guys any new on refresh
ReplyDeleteIn video errors are resolved, and you can also delete that refresh.this or replace with your activity name
Deleteits worked! Thank you very much!
ReplyDelete