Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android WebView File Upload

I am developing an Android app. Basically it is a WebView and a progressBar. Facebook's mobile site (m.facebook.com) is loaded into the WebView.

When I click on the Choose File button to upload an image, nothing happens. I have tried ALL of the solutions and none of them work. I am testing on a Galaxy Note (GT-N7000) running 4.0.3. My minimum SDK version is version 8.

My App
(source: istyla.com)

Here is my code for more info...

public class IStyla extends Activity {     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;          }     }     private class MyWebChromeClient extends WebChromeClient {         public void openFileChooser(ValueCallback<Uri> uploadMsg) {             mUploadMessage = uploadMsg;             Intent i = new Intent(Intent.ACTION_GET_CONTENT);             i.addCategory(Intent.CATEGORY_OPENABLE);             i.setType("image/*");             IStyla.this.startActivityForResult(Intent.createChooser(i, "Image Browser"), FILECHOOSER_RESULTCODE);         }              @Override         public boolean onJsAlert(WebView view, String url, String message,final JsResult result) {             //handle Alert event, here we are showing AlertDialog             new AlertDialog.Builder(IStyla.this)                 .setTitle("JavaScript Alert !")                 .setMessage(message)                 .setPositiveButton(android.R.string.ok,                     new AlertDialog.OnClickListener() {                         public void onClick(DialogInterface dialog, int which) {                             // do your stuff                             result.confirm();                         }                     }).setCancelable(false).create().show();             return true;         }     }          @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_istyla);         WebView webView = (WebView) findViewById(R.id.webView1);         WebSettings webSettings = webView.getSettings();         webSettings.setJavaScriptEnabled(true);         webView.setWebChromeClient(new MyWebChromeClient(){             public void onProgressChanged(WebView view, int progress) {                 // Activities and WebViews measure progress with different scales.                 // The progress meter will automatically disappear when we reach 100%                 ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar1);                 if(progress < 100 && progressBar.getVisibility() == ProgressBar.GONE){                     progressBar.setVisibility(ProgressBar.VISIBLE);                 }                 progressBar.setProgress(progress);                 if(progress == 100) {                     progressBar.setVisibility(ProgressBar.GONE);                 }             }             public void openFileChooser(ValueCallback<Uri> uploadMsg) {                 mUploadMessage = uploadMsg;                 Intent i = new Intent(Intent.ACTION_GET_CONTENT);                 i.addCategory(Intent.CATEGORY_OPENABLE);                 i.setType("image/*");                 IStyla.this.startActivityForResult(Intent.createChooser(i, "Image Browser"), FILECHOOSER_RESULTCODE);             }         });         webView.setWebViewClient(new WebViewClient() {             @Override             public boolean shouldOverrideUrlLoading(WebView view, String url) {                 view.loadUrl(url);                 ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar1);                 progressBar.setVisibility(ProgressBar.VISIBLE);                 return true;             }                      });         webView.loadUrl("https://m.facebook.com");      }          @Override     public boolean onKeyDown(int keyCode, KeyEvent event) {         if (keyCode == KeyEvent.KEYCODE_BACK){             if(((WebView)findViewById(R.id.webView1)).canGoBack()){                 ((WebView)findViewById(R.id.webView1)).goBack();                 return true;             }         }         return super.onKeyDown(keyCode, event);     }          @Override     public boolean onCreateOptionsMenu(Menu menu) {         getMenuInflater().inflate(R.menu.activity_istyla, menu);         return true;     }  } 

Thanks

like image 964
Jacques Blom Avatar asked Jul 30 '12 15:07

Jacques Blom


People also ask

How to enable file upload in WebView Android?

According to comment here, add android:usesCleartextTraffic="true" in application tag (manifest file) to make it work in Pie.

How do I upload files to Kotlin?

Independent Utility Class to Upload File to Server in Android Kotlin. Create a new file in your project with the name UploadUtility. kt and paste the following class code in it. In the above code, you will see one syntax Error at the line URIPathHelper().


2 Answers

This is how i am using in my app

 private class MyWebChromeClient extends 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 uploadMsg, String acceptType) {         mUploadMessage = uploadMsg;         Intent intent = new Intent(Intent.ACTION_GET_CONTENT);         intent.addCategory(Intent.CATEGORY_OPENABLE);         intent.setType("*/*");         startActivityForResult(Intent.createChooser(intent, "File Browser"), FILECHOOSER_RESULTCODE);     }      //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("*/*");         startActivityForResult(Intent.createChooser(intent, "File Browser"), FILECHOOSER_RESULTCODE);     }      protected void openFileChooser(ValueCallback<Uri> uploadMsg) {         mUploadMessage = uploadMsg;         Intent intent = new Intent(Intent.ACTION_GET_CONTENT);         intent.addCategory(Intent.CATEGORY_OPENABLE);         intent.setType("*/*");         startActivityForResult(Intent.createChooser(intent, "File Chooser"), 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 = null;         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {             intent = fileChooserParams.createIntent();         }         try {             startActivityForResult(intent, REQUEST_SELECT_FILE);         } catch (ActivityNotFoundException e) {             uploadMessage = null;             Toast.makeText(getApplicationContext(), "Cannot Open File Chooser", Toast.LENGTH_LONG).show();             return false;         }         return true;     } 
like image 67
Salman Nazir Avatar answered Oct 03 '22 09:10

Salman Nazir


Mike Olivier's reference shared by Fr33dan is important. I am sharing what worked for me under situation quite akin yours.

wv.setWebChromeClient(new WebChromeClient()  {  // For Android 3.0+ public void openFileChooser( ValueCallback<Uri> uploadMsg, String acceptType ) {   mUploadMessage = uploadMsg;   Intent i = new Intent(Intent.ACTION_GET_CONTENT);   i.addCategory(Intent.CATEGORY_OPENABLE);   i.setType("image/*");   MainActivity.this.startActivityForResult( Intent.createChooser( i, getString(R.string.fileselect) ), MainActivity.FILECHOOSER_RESULTCODE );  }  // For Android < 3.0 public void openFileChooser( ValueCallback<Uri> uploadMsg ) { openFileChooser( uploadMsg, "" ); }   // For Android > 4.1 public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture){ openFileChooser( uploadMsg, "" ); } }); 

NOTE: I found this somewhere in stack overflow and m0s' blog.

Also, Ignore lint warnings. This one works pretty well for API 8 and above.

like image 28
Chirag Avatar answered Oct 03 '22 08:10

Chirag