File Upload in WebView File Upload in WebView android android

File Upload in WebView


This is a full solution for all android versions, I had a hard time with this too.

public class MyWb extends Activity {/** Called when the activity is first created. */WebView web;ProgressBar progressBar;private ValueCallback<Uri> mUploadMessage;   private final static int FILECHOOSER_RESULTCODE=1;   @Override   protected void onActivityResult(int requestCode, int resultCode,                                      Intent intent) {    if(requestCode==FILECHOOSER_RESULTCODE)    {     if (null == mUploadMessage) return;              Uri result = intent == null || resultCode != RESULT_OK ? null                      : intent.getData();              mUploadMessage.onReceiveValue(result);              mUploadMessage = null;    }  }  @Overridepublic void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.main);    web = (WebView) findViewById(R.id.webview01);    progressBar = (ProgressBar) findViewById(R.id.progressBar1);    web = new WebView(this);      web.getSettings().setJavaScriptEnabled(true);    web.loadUrl("http://www.script-tutorials.com/demos/199/index.html");    web.setWebViewClient(new myWebClient());    web.setWebChromeClient(new WebChromeClient()      {             //The undocumented magic method override             //Eclipse will swear at you if you try to put @Override here          // For Android 3.0+        public void openFileChooser(ValueCallback<Uri> uploadMsg) {              mUploadMessage = uploadMsg;              Intent i = new Intent(Intent.ACTION_GET_CONTENT);              i.addCategory(Intent.CATEGORY_OPENABLE);              i.setType("image/*");              MyWb.this.startActivityForResult(Intent.createChooser(i,"File Chooser"), FILECHOOSER_RESULTCODE);             }        // For Android 3.0+           public void openFileChooser( ValueCallback uploadMsg, String acceptType ) {           mUploadMessage = uploadMsg;           Intent i = new Intent(Intent.ACTION_GET_CONTENT);           i.addCategory(Intent.CATEGORY_OPENABLE);           i.setType("*/*");           MyWb.this.startActivityForResult(           Intent.createChooser(i, "File Browser"),           FILECHOOSER_RESULTCODE);           }        //For Android 4.1           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("image/*");                 MyWb.this.startActivityForResult( Intent.createChooser( i, "File Chooser" ), MyWb.FILECHOOSER_RESULTCODE );           }    });      setContentView(web);  }public class myWebClient extends WebViewClient{    @Override    public void onPageStarted(WebView view, String url, Bitmap favicon) {        // TODO Auto-generated method stub        super.onPageStarted(view, url, favicon);    }    @Override    public boolean shouldOverrideUrlLoading(WebView view, String url) {        // TODO Auto-generated method stub        view.loadUrl(url);        return true;    }    @Override    public void onPageFinished(WebView view, String url) {        // TODO Auto-generated method stub        super.onPageFinished(view, url);        progressBar.setVisibility(View.GONE);    }}//flipscreen not loading again@Overridepublic void onConfigurationChanged(Configuration newConfig){            super.onConfigurationChanged(newConfig);}// To handle "Back" key press event for WebView to go back to previous screen./*@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {    if ((keyCode == KeyEvent.KEYCODE_BACK) && web.canGoBack()) {        web.goBack();        return true;    }    return super.onKeyDown(keyCode, event);}*/}

Also I want to add that the "upload page" like the one in this example, wont work on < 4 versions, since it has an image preview feature, if you want to make it work use a simple php upload without preview.

Update:

Please find the solution for lollipop devices here and thanks for gauntface

Update 2:

Complete solution for all android devices till oreo here and this is more advanced version, you should look into it, maybe it can help.


Working Method from HONEYCOMB (API 11) to Android 11

As updated by swati vishnoi, this works on Pie and above too

static WebView mWebView;private ValueCallback<Uri> mUploadMessage;public ValueCallback<Uri[]> uploadMessage;public static final int REQUEST_SELECT_FILE = 100;private final static int FILECHOOSER_RESULTCODE = 1;

Modified onActivityResult()

@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent intent){    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)    {        if (requestCode == REQUEST_SELECT_FILE)        {            if (uploadMessage == null)                return;            uploadMessage.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, intent));            uploadMessage = null;        }    }    else if (requestCode == FILECHOOSER_RESULTCODE)    {        if (null == mUploadMessage)            return;    // Use MainActivity.RESULT_OK if you're implementing WebView inside Fragment    // Use RESULT_OK only if you're implementing WebView inside an Activity        Uri result = intent == null || resultCode != MainActivity.RESULT_OK ? null : intent.getData();        mUploadMessage.onReceiveValue(result);        mUploadMessage = null;    }    else        Toast.makeText(getActivity().getApplicationContext(), "Failed to Upload Image", Toast.LENGTH_LONG).show();}

Now in onCreate() or onCreateView() paste the following code

    WebSettings mWebSettings = mWebView.getSettings();    mWebSettings.setJavaScriptEnabled(true);    mWebSettings.setSupportZoom(false);    mWebSettings.setAllowFileAccess(true);    mWebSettings.setAllowContentAccess(true);mWebView.setWebChromeClient(new WebChromeClient(){    // For 3.0+ Devices (Start)    // onActivityResult attached before constructor    protected 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    public boolean onShowFileChooser(WebView mWebView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams)    {        if (uploadMessage != null) {            uploadMessage.onReceiveValue(null);            uploadMessage = null;        }        uploadMessage = filePathCallback;        Intent intent = fileChooserParams.createIntent();        try        {            startActivityForResult(intent, REQUEST_SELECT_FILE);        } catch (ActivityNotFoundException e)        {            uploadMessage = null;            Toast.makeText(getActivity().getApplicationContext(), "Cannot Open File Chooser", Toast.LENGTH_LONG).show();            return false;        }        return true;    }        //For Android 4.1 only    protected 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);    }});


this is the only solution that i found that works!

WebView webview;private ValueCallback<Uri> mUploadMessage;private final static int FILECHOOSER_RESULTCODE = 1;@Overrideprotected void onActivityResult(int requestCode, int resultCode,        Intent intent) {    if (requestCode == FILECHOOSER_RESULTCODE) {        if (null == mUploadMessage)            return;        Uri result = intent == null || resultCode != RESULT_OK ? null                : intent.getData();        mUploadMessage.onReceiveValue(result);        mUploadMessage = null;    }}// Next part class MyWebChromeClient extends WebChromeClient {    // The undocumented magic method override    // Eclipse will swear at you if you try to put @Override here    public void openFileChooser(ValueCallback<Uri> uploadMsg) {        mUploadMessage = uploadMsg;        Intent i = new Intent(Intent.ACTION_GET_CONTENT);        i.addCategory(Intent.CATEGORY_OPENABLE);        i.setType("image/*");        Cv5appActivity.this.startActivityForResult(                Intent.createChooser(i, "Image Browser"),                FILECHOOSER_RESULTCODE);    }}