File Upload in WebView

后端 未结 19 1891
旧巷少年郎
旧巷少年郎 2020-11-22 00:28

I have been struggling to upload files from WebView since last few days and there is no progress. I googled and implemented all suggested solutions but none works, like: sol

19条回答
  •  旧巷少年郎
    2020-11-22 01:08

    Webview - Single & Multiple files choose

    you needs two minutes to implement this code:

    build.gradle

    implementation 'com.github.angads25:filepicker:1.1.1'
    

    java code:

    import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.graphics.Bitmap;
    import android.net.Uri;
    import android.os.Build;
    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.util.Log;
    import android.view.KeyEvent;
    import android.view.View;
    import android.webkit.ValueCallback;
    import android.webkit.WebChromeClient;
    import android.webkit.WebSettings;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    import android.widget.ProgressBar;
    import android.widget.Toast;
    
    import com.bivoiclient.utils.Constants;
    import com.github.angads25.filepicker.controller.DialogSelectionListener;
    import com.github.angads25.filepicker.model.DialogConfigs;
    import com.github.angads25.filepicker.model.DialogProperties;
    import com.github.angads25.filepicker.view.FilePickerDialog;
    
    import java.io.File;
    
    public class WebBrowserScreen extends Activity {
    
        private WebView webView;
        private ValueCallback mUploadMessage;
        private FilePickerDialog dialog;
        private String LOG_TAG = "DREG";
        private Uri[] results;
    
        @SuppressLint("SetJavaScriptEnabled")
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_complain);
    
            webView = findViewById(R.id.webview);
            WebSettings webSettings = webView.getSettings();
            webSettings.setAppCacheEnabled(true);
            webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
            webSettings.setJavaScriptEnabled(true);
            webSettings.setLoadWithOverviewMode(true);
            webSettings.setAllowFileAccess(true);
            webView.setWebViewClient(new PQClient());
            webView.setWebChromeClient(new PQChromeClient());
            if (Build.VERSION.SDK_INT >= 19) {
                webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
            } else {
                webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
            }
    
            webView.loadUrl(Constants.COMPLAIN_URL);
    
        }
    
        private void openFileSelectionDialog() {
    
            if (null != dialog && dialog.isShowing()) {
                dialog.dismiss();
            }
    
            //Create a DialogProperties object.
            final DialogProperties properties = new DialogProperties();
    
            //Instantiate FilePickerDialog with Context and DialogProperties.
            dialog = new FilePickerDialog(WebBrowserScreen.this, properties);
            dialog.setTitle("Select a File");
            dialog.setPositiveBtnName("Select");
            dialog.setNegativeBtnName("Cancel");
            properties.selection_mode = DialogConfigs.MULTI_MODE; // for multiple files
    //        properties.selection_mode = DialogConfigs.SINGLE_MODE; // for single file
            properties.selection_type = DialogConfigs.FILE_SELECT;
    
            //Method handle selected files.
            dialog.setDialogSelectionListener(new DialogSelectionListener() {
                @Override
                public void onSelectedFilePaths(String[] files) {
                    results = new Uri[files.length];
                    for (int i = 0; i < files.length; i++) {
                        String filePath = new File(files[i]).getAbsolutePath();
                        if (!filePath.startsWith("file://")) {
                            filePath = "file://" + filePath;
                        }
                        results[i] = Uri.parse(filePath);
                        Log.d(LOG_TAG, "file path: " + filePath);
                        Log.d(LOG_TAG, "file uri: " + String.valueOf(results[i]));
                    }
                    mUploadMessage.onReceiveValue(results);
                    mUploadMessage = null;
                }
            });
            dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
                @Override
                public void onCancel(DialogInterface dialogInterface) {
                    if (null != mUploadMessage) {
                        if (null != results && results.length >= 1) {
                            mUploadMessage.onReceiveValue(results);
                        } else {
                            mUploadMessage.onReceiveValue(null);
                        }
                    }
                    mUploadMessage = null;
                }
            });
            dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
                @Override
                public void onDismiss(DialogInterface dialogInterface) {
                    if (null != mUploadMessage) {
                        if (null != results && results.length >= 1) {
                            mUploadMessage.onReceiveValue(results);
                        } else {
                            mUploadMessage.onReceiveValue(null);
                        }
                    }
                    mUploadMessage = null;
                }
            });
    
            dialog.show();
    
        }
    
        public class PQChromeClient extends WebChromeClient {
    
            @Override
            public boolean onShowFileChooser(WebView webView, ValueCallback filePathCallback, FileChooserParams fileChooserParams) {
                // Double check that we don't have any existing callbacks
                if (mUploadMessage != null) {
                    mUploadMessage.onReceiveValue(null);
                }
                mUploadMessage = filePathCallback;
    
                openFileSelectionDialog();
    
                return true;
            }
    
        }
    
        //Add this method to show Dialog when the required permission has been granted to the app.
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
            switch (requestCode) {
                case FilePickerDialog.EXTERNAL_READ_PERMISSION_GRANT: {
                    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        if (dialog != null) {
                            openFileSelectionDialog();
                        }
                    } else {
                        //Permission has not been granted. Notify the user.
                        Toast.makeText(WebBrowserScreen.this, "Permission is Required for getting list of files", Toast.LENGTH_SHORT).show();
                    }
                }
            }
        }
    
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            // Check if the key event was the Back button and if there's history
            if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {
                webView.goBack();
                return true;
            }
            // If it wasn't the Back key or there's no web page history, bubble up to the default
            // system behavior (probably exit the activity)
    
            return super.onKeyDown(keyCode, event);
        }
    
    
        public class PQClient extends WebViewClient {
            ProgressBar progressDialog;
    
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
    
                // If url contains mailto link then open Mail Intent
                if (url.contains("mailto:")) {
    
                    // Could be cleverer and use a regex
                    //Open links in new browser
                    view.getContext().startActivity(
                            new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
    
                    // Here we can open new activity
    
                    return true;
    
                } else {
                    // Stay within this webview and load url
                    view.loadUrl(url);
                    return true;
                }
            }
    
            // Show loader on url load
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                // Then show progress  Dialog
                // in standard case YourActivity.this
                if (progressDialog == null) {
                    progressDialog = findViewById(R.id.progressBar);
                    progressDialog.setVisibility(View.VISIBLE);
                }
            }
    
            // Called when all page resources loaded
            public void onPageFinished(WebView view, String url) {
                webView.loadUrl("javascript:(function(){ " +
                        "document.getElementById('android-app').style.display='none';})()");
    
                try {
                    // Close progressDialog
                    progressDialog.setVisibility(View.GONE);
                } catch (Exception exception) {
                    exception.printStackTrace();
                }
            }
        }
    
    }
    

提交回复
热议问题