代码之家  ›  专栏  ›  技术社区  ›  pankaj

WebView文件上载控件中的“选择文件”按钮不起作用

  •  0
  • pankaj  · 技术社区  · 6 年前

    我在网页上有一个文件上载控件,并将其显示在WebView中。但选择的文件不起作用。它没有效果。我正在为此使用以下代码:

    webView = (WebView) findViewById(R.id.wbvw);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.loadUrl(url);
    
        webView.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/*");
                WebviewActivity.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("*/*");
                WebviewActivity.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/*");
                WebviewActivity.this.startActivityForResult( Intent.createChooser( i, "File Chooser" ), WebviewActivity.FILECHOOSER_RESULTCODE );
    
            }
    
        });
    

    我试图用调试器运行代码,但是里面的方法 webView.setWebChromeClient 别工作。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Siros Baghban    6 年前

    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 java.io.*;
    import android.util.*;
    import java.text.*;
    import android.annotation.*;
    import java.util.*;
    import android.app.*;
    import android.provider.*;
    import android.os.*;
    import android.webkit.*;
    
    public class MainActivity extends Activity {
    
        public static final int REQUEST_CODE_LOLIPOP = 1;
        private final static int RESULT_CODE_ICE_CREAM = 2;
        private WebView webView;
        private ValueCallback<Uri[]> mFilePathCallback;
        private String mCameraPhotoPath;
        private ValueCallback<Uri> mUploadMessage;
    
        private String url ="http://up.example.com";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
    
            webView = (WebView) findViewById(R.id.wbvw);
            setUpWebViewDefaults(webView);
            webView.loadUrl(url);
    
    
    
            webView.setWebChromeClient(new WebChromeClient() {
                    private String TAG;
                    // 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"),
                                               RESULT_CODE_ICE_CREAM);
    
                    }
                    // 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"),
                                               RESULT_CODE_ICE_CREAM);
                    }
                    //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"),
                                               RESULT_CODE_ICE_CREAM);
    
                    }
                    //For Android5.0+
                    public boolean onShowFileChooser(
                        WebView webView, ValueCallback<Uri[]> filePathCallback,
                        FileChooserParams fileChooserParams) {
                        if (mFilePathCallback != null) {
                            mFilePathCallback.onReceiveValue(null);
                        }
                        mFilePathCallback = filePathCallback;
                        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                        if (takePictureIntent.resolveActivity(MainActivity.this.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, REQUEST_CODE_LOLIPOP);
    
                        return true;
                    }
                });
        }
        private File createImageFile() throws IOException {
            // Create an image file name
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
            String imageFileName = "JPEG_" + timeStamp + "_";
            File storageDir = Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES);
            File imageFile = File.createTempFile(
                imageFileName,  /* prefix */
                ".jpg",         /* suffix */
                storageDir      /* directory */
            );
            return imageFile;
        }
        @TargetApi(Build.VERSION_CODES.HONEYCOMB)
        private void setUpWebViewDefaults(WebView webView) {
            WebSettings settings = webView.getSettings();
            // Enable Javascript
            settings.setJavaScriptEnabled(true);
            // Use WideViewport and Zoom out if there is no viewport defined
            settings.setUseWideViewPort(true);
            settings.setLoadWithOverviewMode(true);
            // Enable pinch to zoom without the zoom buttons
            settings.setBuiltInZoomControls(true);
            if (Build.VERSION.SDK_INT > Build.VERSION_CODES.HONEYCOMB) {
                // Hide the zoom controls for HONEYCOMB+
                settings.setDisplayZoomControls(false);
            }
            // Enable remote debugging via chrome://inspect
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                WebView.setWebContentsDebuggingEnabled(true);
            }
            // We set the WebViewClient to ensure links are consumed by the WebView rather
            // than passed to a browser if it can
            webView.setWebViewClient(new WebViewClient());
        }
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            switch (requestCode) {
                case RESULT_CODE_ICE_CREAM:
                    Uri uri = null;
                    if (data != null) {
                        uri = data.getData();
                    }
                    mUploadMessage.onReceiveValue(uri);
                    mUploadMessage = null;
                    break;
                case REQUEST_CODE_LOLIPOP:
                    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;
                    break;
            }
        }
    }
    

    Github