Android Web Search Type Input File

I am trying to create a web project using android from webview. I have a file input box of type <input type="file" > so that the user can upload files to the server, but it doesn't seem to work in the Android web browser, when I click the browse button, nothing happens.

Comp.java

 package com.gururaju.bbmp; import android.app.Activity; import android.os.Bundle; import android.webkit.WebView; import android.webkit.WebViewClient; import android.webkit.WebChromeClient; public class Comp extends Activity { WebView comp; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_comp); WebView myWebView = (WebView) findViewById(R.id.comp); myWebView.setWebChromeClient(new WebChromeClient()); myWebView.loadUrl("file:///android_asset/comp.html"); } } 

activity_comp.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <WebView android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/comp" > </WebView> </LinearLayout> 

comp.html (in the resource folder)

 <!DOCTYPE html> <html lang="en"> <head> <link rel="stylesheet" type="text/css" href="comp.css"> <meta charset="UTF-8"> <title></title> </head> <body> <h2 align="center">Post your Complaints here</h2> <form enctype="multipart/form-data" action="" name="complaints" method="POST"> <input class="title" type="text" name="title" placeholder="Enter the Complaint Title" /><br /> <div class="spacer-welcome"></div> <textarea name="desc" class="desc" placeholder="Your complaint description here..."></textarea><br /> <div class="spacer-welcome1"></div> <input id="center" type="file" name="image" ><br /> <input class="upload" type="submit" name="submit" value="Submit" > </form> </body> </html> 

Any help would be greatly appreciated.

+5
source share
3 answers

Riad's answer points in the right direction, but this single callback is not enough to implement.

There are four hidden API methods that you must implement in total. Their use depends on the version of Android. These methods:

 public void openFileChooser(ValueCallback<Uri> uploadMsg) public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) 

You can use the following library that does all this for you:

https://github.com/delight-im/Android-AdvancedWebView

Alternatively, you can look at the source code to find out how this is done:

https://github.com/delight-im/Android-AdvancedWebView/blob/master/Source/src/im/delight/android/webview/AdvancedWebView.java

+2
source

Only the Webview class does not support uploading files to facebook. You need to use the web chrome client and the webview client to handle file downloads in your Android application, as shown below. View more details and a working demo

 package com.whatsonline.androidphotouploadonfacebook; import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.Intent; import android.content.res.Configuration; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.view.ViewGroup; import android.webkit.ValueCallback; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.LinearLayout; /** * Created by sada on 6/17/2016. */ public class upload extends Activity { WebView web; private ValueCallback<Uri> mUploadMessage; private final static int FILECHOOSER_RESULTCODE=1; LinearLayout ln1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.upload); web = new WebView(this); web.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); ln1=(LinearLayout) findViewById(R.id.ln1); WebSettings settings=web.getSettings(); settings.setJavaScriptEnabled(true); web.loadUrl("http://www.facebook.com"); 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/*"); upload.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("*/*"); upload.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/*"); upload.this.startActivityForResult(Intent.createChooser(i, "File Chooser"), upload.FILECHOOSER_RESULTCODE); } }); ln1.addView(web); } public class myWebClient extends WebViewClient { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); } } //flipscreen not loading again @Override public void onConfigurationChanged(Configuration newConfig){ super.onConfigurationChanged(newConfig); } @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; } } } 
+1
source

Try implementing a file Chooser method similar to this, as indicated in the article link at the end:

 webView.setWebChromeClient(new WebChromeClient() { // openFileChooser for Android 3.0+ public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType){ // Update message mUploadMessage = uploadMsg; try{ // do work.... }catch(Exception e){ Toast.makeText(getBaseContext(), "Exception:"+e, Toast.LENGTH_LONG).show(); } } 

View details here

0
source

Source: https://habr.com/ru/post/1211871/


All Articles