Android - Choose File button in WebView

后端 未结 3 1560
醉梦人生
醉梦人生 2020-11-30 11:46

I\'m having a problem where I\'ve got a page loaded in WebView - I\'m not going to post code for the entire application, because my problem is very specific: the \"Choose Fi

相关标签:
3条回答
  • 2020-11-30 12:08

    The Accepted Answers is not working for me. I found new answer from Google Chromium Samples.

    public class WebViewActivity extends AppCompatActivity {
    
        ActivityWebviewBinding binding;
    
        public static final int INPUT_FILE_REQUEST_CODE = 1;
        private ProgressDialog progressDialog;
        private ValueCallback<Uri[]> mFilePathCallback;
        private String mCameraPhotoPath;
    
        @SuppressLint("SetJavaScriptEnabled")
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            binding = DataBindingUtil.setContentView(this, R.layout.activity_webview);
    
            setSupportActionBar(binding.toolbar);
    
            if (getSupportActionBar() != null) {
                getSupportActionBar().setDisplayHomeAsUpEnabled(true);
                getSupportActionBar().setTitle(getString(R.string.button_register_now));
            }
    
            progressDialog = new ProgressDialog(WebViewActivity.this);
            progressDialog.setMessage("Loading...");
            progressDialog.show();
    
            WebSettings webSettings = binding.webView.getSettings();
            webSettings.setJavaScriptEnabled(true);
            webSettings.setSupportZoom(true);
            webSettings.setBuiltInZoomControls(true);
            webSettings.setDisplayZoomControls(false);
            webSettings.setAllowFileAccess(true);
            webSettings.setLoadWithOverviewMode(true);
            webSettings.setUseWideViewPort(true);
    
            binding.webView.setWebViewClient(new WebViewClient() {
    
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    final Uri uri = Uri.parse(url);
                    return handleUri(uri);
                }
    
                @TargetApi(Build.VERSION_CODES.N)
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                    final Uri uri = request.getUrl();
                    return handleUri(uri);
                }
    
                private boolean handleUri(final Uri uri) {
    
                    if (uri != null) {
    
                        Log.i("TAG", "Uri =" + uri);
    
                        // Based on some condition you need to determine if you are going to load the url
                        // in your web view itself or in a browser.
                        // You can use `host` or `scheme` or any part of the `uri` to decide.
                        if (uri.getLastPathSegment() != null) {
                            if (uri.getLastPathSegment().contains("p1_business_part1.php")) {
                                finish();
                                startActivity(new Intent(WebViewActivity.this, LoginActivity.class));
                                return false;
                            }
                        } else {
                            binding.webView.loadUrl(uri.toString());
                            return true;
                        }
                    }
    
                    return false;
                }
    
                @Override
                public void onPageFinished(WebView view, String url) {
                    if (progressDialog.isShowing()) {
                        progressDialog.dismiss();
                    }
                }
    
                @Override
                public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                    Toast.makeText(WebViewActivity.this, "Error:" + description, Toast.LENGTH_SHORT).show();
                    view.loadUrl("about:blank");
                }
            });
            binding.webView.setWebChromeClient(new WebChromeClient() {
    
                public boolean onShowFileChooser(
                        WebView webView, ValueCallback<Uri[]> filePathCallback,
                        WebChromeClient.FileChooserParams fileChooserParams) {
                    if (mFilePathCallback != null) {
                        mFilePathCallback.onReceiveValue(null);
                    }
                    mFilePathCallback = filePathCallback;
    
                    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
                        // Create the File where the photo should go
                        File photoFile = null;
                        try {
                            photoFile = createImageFile();
                            takePictureIntent.putExtra("PhotoPath", mCameraPhotoPath);
                        } catch (IOException ex) {
                            // Error occurred while creating the File
                            Log.e("TAG", "Unable to create Image File", ex);
                        }
    
                        // Continue only if the File was successfully created
                        if (photoFile != null) {
                            mCameraPhotoPath = "file:" + photoFile.getAbsolutePath();
                            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                                    Uri.fromFile(photoFile));
                        } else {
                            takePictureIntent = null;
                        }
                    }
    
                    Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT);
                    contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE);
                    contentSelectionIntent.setType("image/*");
    
                    Intent[] intentArray;
                    if (takePictureIntent != null) {
                        intentArray = new Intent[]{takePictureIntent};
                    } else {
                        intentArray = new Intent[0];
                    }
    
                    Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);
                    chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent);
                    chooserIntent.putExtra(Intent.EXTRA_TITLE, "Image Chooser");
                    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray);
    
                    startActivityForResult(chooserIntent, INPUT_FILE_REQUEST_CODE);
    
                    return true;
                }
            });
    
            binding.webView.loadUrl("your_url");
        }
    
        /**
         * More info this method can be found at
         * http://developer.android.com/training/camera/photobasics.html
         *
         * @return
         * @throws IOException
         */
        private File createImageFile() throws IOException {
            // Create an image file name
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
            String imageFileName = "JPEG_" + timeStamp + "_";
            File storageDir = Environment.getExternalStoragePublicDirectory(
                    Environment.DIRECTORY_PICTURES);
            return File.createTempFile(
                    imageFileName,  /* prefix */
                    ".jpg",         /* suffix */
                    storageDir      /* directory */
            );
        }
    
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode != INPUT_FILE_REQUEST_CODE || mFilePathCallback == null) {
                super.onActivityResult(requestCode, resultCode, data);
                return;
            }
    
            Uri[] results = null;
    
            // Check that the response is a good one
            if (resultCode == Activity.RESULT_OK) {
                if (data == null) {
                    // If there is not data, then we may have taken a photo
                    if (mCameraPhotoPath != null) {
                        results = new Uri[]{Uri.parse(mCameraPhotoPath)};
                    }
                } else {
                    String dataString = data.getDataString();
                    if (dataString != null) {
                        results = new Uri[]{Uri.parse(dataString)};
                    }
                }
            }
    
            mFilePathCallback.onReceiveValue(results);
            mFilePathCallback = null;
        }
    
        @Override
        public void onBackPressed() {
            // TODO Auto-generated method stub
    
            if (binding.webView.canGoBack()) {
                binding.webView.goBack();
            } else {
                super.onBackPressed();
            }
        }
    
        @Override
        public boolean onOptionsItemSelected(@NonNull MenuItem item) {
            finish();
            return super.onOptionsItemSelected(item);
        }
    }
    

    Hope it will helps others.

    Thank you.

    0 讨论(0)
  • 2020-11-30 12:22

    Webview - Single & Multiple files Select

    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<Uri[]> 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(YOUR_WEBVIEW_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<Uri[]> 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();
                }
            }
        }
    
    }
    
    0 讨论(0)
  • 2020-11-30 12:29

    set WebChromeClient for Choose File

    CODE

    import android.app.AlertDialog;
    import android.content.Context;
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Bundle;
    import android.view.View;
    import android.webkit.JavascriptInterface;
    import android.webkit.ValueCallback;
    import android.webkit.WebChromeClient;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    import android.widget.ProgressBar;
    import android.widget.Toast;
    import org.apache.http.util.EncodingUtils;
    
    public class BrowserScreen extends Activity {
    
        private WebView webView;
        private String url = "url";       
    
        private ValueCallback<Uri> mUploadMessage;
        private final static int FILECHOOSER_RESULTCODE = 1;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.browser_activity);
            initFields();
            setListeners();        
        }               
    
        public void initFields() {
            // TODO Auto-generated method stub
    
            webView = (WebView) findViewById(R.id.webView1);
            webView.getSettings().setJavaScriptEnabled(true);
            webView.getSettings().setBuiltInZoomControls(true);
            webView.getSettings().setAllowFileAccess(true);
        }    
    
        public void setListeners() {
            // TODO Auto-generated method stub
    
            webView.setWebViewClient(new WebViewClient() {
                public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
    
                    webView.loadUrl("about:blank");
    
                    view.clearHistory();
                }        
            });
    
            webView.setWebChromeClient(new WebChromeClient() {
                public void onProgressChanged(WebView view, int progress) {
    
                }
    
                //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/*");
                    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("*/*");
                    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/*");
                    startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);
    
                }    
            });
    
                webView.loadUrl(url);    
    
            final MyJavaScriptInterface myJavaScriptInterface
                    = new MyJavaScriptInterface(this);
            webView.addJavascriptInterface(myJavaScriptInterface, "AndroidFunction");
        }
    
        @Override
        public void onBackPressed() {
            // TODO Auto-generated method stub
    
            if (webView.canGoBack() == true) {
                webView.goBack();
            } else {
                super.onBackPressed();
            }
        }
    
    
        public class MyJavaScriptInterface {
            Context mContext;
    
            MyJavaScriptInterface(Context c) {
                mContext = c;
            }
    
            @JavascriptInterface
            public void showToast(String toast) {
                Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
                // webView.loadUrl("javascript:document.getElementById(\"Button3\").innerHTML = \"bye\";");
            }
    
            @JavascriptInterface
            public void openAndroidDialog() {
                AlertDialog.Builder myDialog
                        = new AlertDialog.Builder(BrowserScreen.this);
                myDialog.setTitle("DANGER!");
                myDialog.setMessage("You can do what you want!");
                myDialog.setPositiveButton("ON", null);
                myDialog.show();
            }   
        }
    
        @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;
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题