0

In my app Webview webpage file upload not working.but in mobile chrome browser it working. what will I need to do for file upload selector working

I have given all permission.

<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" />

showing permissions also in play store enter image description here

My main activity code

package one.posone.posoneestimatesrj;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MainActivity extends AppCompatActivity {

    /**
     * WebViewClient subclass loads all hyperlinks in the existing WebView
     */
    public class GeoWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            // When user clicks a hyperlink, load in the existing WebView
            view.loadUrl(url);
            return true;
        }
    }
 


    private WebView webView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        webView = (WebView) findViewById(R.id.webview);
        webView.setWebViewClient(new WebViewClient());

       
        webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
       
        webView.setWebViewClient(new GeoWebViewClient());
       
        webView.getSettings().setJavaScriptEnabled(true);
        webView.loadUrl("https://srje.posone.one/");

        webView.setWebViewClient(new WebViewClient(){

            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {

                webView.loadUrl("file:///android_asset/error.html");
            }

        });
    }

    @Override
    public void onBackPressed() {
        if(webView.canGoBack()){
            webView.goBack();
        }else {
            super.onBackPressed();
        }
    }
}

Published in play store also

https://play.google.com/store/apps/details?id=one.posone.posoneestimatesrj

I refered so many topics from stack overflow But I didn't under how I will implement in my case.

1 Answers1

2

Image/File picker in WebView does not work directly you have to manage it when browse file button clicked, you have to provide WebChromeClient() to the WebView object like below

private ValueCallback<Uri[]> mFilePathCallback;

@Override
protected void onCreate(Bundle savedInstanceState) {
    .
    .
    .

    webView.setWebChromeClient(new WebChromeClient(){
        @Override
        public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
            mFilePathCallback = filePathCallback;

            ImagePicker.with(MainActivity.this)
                    .crop()
                    .compress(1024)
                    .maxResultSize(1080, 1080)
                    .start();

            return true;
        }
    });

}



@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK && data.getData()!=null) {
        Uri uri = data.getData();

        Uri[] mFileUri = new Uri[1];
        mFileUri[0] = uri;

        mFilePathCallback.onReceiveValue(mFileUri);
    }
}

For Image Picker I'm using implementation 'com.github.dhaval2404:imagepicker:2.1' from Here

Edited Code

I've edited your code and put that code accordingly. below is your Main activity code including above code

package one.posone.posoneestimatesrj;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MainActivity extends AppCompatActivity {

private ValueCallback<Uri[]> mFilePathCallback;
/**
 * WebViewClient subclass loads all hyperlinks in the existing WebView
 */
public class GeoWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        // When user clicks a hyperlink, load in the existing WebView
        view.loadUrl(url);
        return true;
    }
}



private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    webView = (WebView) findViewById(R.id.webview);
    webView.setWebViewClient(new WebViewClient());

   
    webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
   
    webView.setWebViewClient(new GeoWebViewClient());
   
    webView.getSettings().setJavaScriptEnabled(true);
    webView.loadUrl("https://srje.posone.one/");

    webView.setWebChromeClient(new WebChromeClient(){
    @Override
    public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
        mFilePathCallback = filePathCallback;

        ImagePicker.with(MainActivity.this)
                .crop()
                .compress(1024)
                .maxResultSize(1080, 1080)
                .start();

        return true;
     }
    });

    webView.setWebViewClient(new WebViewClient(){

        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {

            webView.loadUrl("file:///android_asset/error.html");
        }

    });
}

@Override
protected void onActivityResult(int requestCode, int resultCode, 
@Nullable Intent data) {
   super.onActivityResult(requestCode, resultCode, data);
   if (resultCode == Activity.RESULT_OK && data.getData()!=null) {
    Uri uri = data.getData();

    Uri[] mFileUri = new Uri[1];
    mFileUri[0] = uri;

    mFilePathCallback.onReceiveValue(mFileUri);
}
}

@Override
public void onBackPressed() {
    if(webView.canGoBack()){
        webView.goBack();
    }else {
        super.onBackPressed();
    }
}
}

And put the below line inside your App/Module level build.gradle file inside dependencies block like

dependencies {
   //other dependencies
   .
   .
   .
   implementation 'com.github.dhaval2404:imagepicker:2.1'

}
Rahul Mishra
  • 1,122
  • 1
  • 10
  • 25