Android WebView选择文件

最近的项目需要和H5结合开发,其中一个功能就是要处理H5的选择文件功能,我也是第一次解决这种问题,首先就去百度看了很多博客写的处理方法,但是都没有很全面的解决方法,因为Android版本的不同,权限也相应的不一样,所以我就整理了针对不同的权限的解决方法。我主要是参考了http://download.csdn.net/detail/djcken/8776691这个博主的解决办法,并在他的基础上进行了修改。

  首先是要继承WebChromeClient这个类,WebChromeClient主要辅助WebView处理Javascript的对话框、网站图标、网站title、加载进度等。

[java] view plain copy
  1. public class MyWebChomeClient extends WebChromeClient {  
  2.   
  3.     private OpenFileChooserCallBack mOpenFileChooserCallBack;  
  4.   
  5.     public ReWebChomeClient(OpenFileChooserCallBack openFileChooserCallBack) {  
  6.         mOpenFileChooserCallBack = openFileChooserCallBack;  
  7.     }  
  8.   
  9.     //针对 Android 5.0+  
  10.     @Override  
  11.     public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> valueCallback,  
  12.   
  13.                                      android.webkit.WebChromeClient.FileChooserParams fileChooserParams) {  
  14.         mOpenFileChooserCallBack.openFileChooser5CallBack(webView, valueCallback, fileChooserParams);  
  15.         return true;  
  16.   
  17.     }  
  18.   
  19.   
  20.     //针对 Android版本 3.0+  
  21.     public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {  
  22.         mOpenFileChooserCallBack.openFileChooserCallBack(uploadMsg, acceptType);  
  23.     }  
  24.   
  25.     // 针对 Android版本 < 3.0  
  26.     public void openFileChooser(ValueCallback<Uri> uploadMsg) {  
  27.         openFileChooser(uploadMsg, "");  
  28.     }  
  29.   
  30.     //针对 Android版本  > 4.1.1  
  31.     public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {  
  32.         openFileChooser(uploadMsg, acceptType);  
  33.     }  
  34.   
  35.     //回调的接口  
  36.     public interface OpenFileChooserCallBack {  
  37.         void openFileChooserCallBack(ValueCallback<Uri> uploadMsg, String acceptType);  
  38.   
  39.         void openFileChooser5CallBack(WebView webView, ValueCallback<Uri[]> valueCallback,  
  40.                                       android.webkit.WebChromeClient.FileChooserParams fileChooserParams);  
  41.     }  
  42.   
  43.     @Override  
  44.     public boolean onJsAlert(WebView view, String url, String message, JsResult result) {  
  45.         //  return super.onJsAlert(view, url, message, result);  
  46.         return true;  
  47.     }  
  48. }  
接下来就是设置,一句代码就可以。
[java] view plain copy
  1. webView.setWebChromeClient(new ReWebChomeClient(this));  
[java] view plain copy
  1. private static final int REQUEST_CODE_PICK_IMAGE = 0;  
  2.    private static final int REQUEST_CODE_IMAGE_CAPTURE = 1;  
  3.    private Intent mSourceIntent;  
  4.    //针对5.0以下版本  
  5.   private ValueCallback<Uri> mUploadMsg;  
  6.    //这对5.0以上版本  
  7.   private ValueCallback<Uri[]> mValueCallback;  
  8.   
  9.    @Override  
  10.    public void openFileChooserCallBack(ValueCallback<Uri> uploadMsg, String acceptType) {  
  11.        mUploadMsg = uploadMsg;  
  12.        showOptions();  
  13.    }  
  14.   
  15.    @Override  
  16.    public void openFileChooser5CallBack(WebView webView, ValueCallback<Uri[]> valueCallback, WebChromeClient.FileChooserParams fileChooserParams) {  
  17.        mValueCallback = valueCallback;  
  18.        showOptions();  
  19.    }  
  20.   
  21.    @Override  
  22.    public void onActivityResult(int requestCode, int resultCode, Intent data) {  
  23.        if (resultCode == RESULT_CANCELED) {  
  24.            if (mUploadMsg != null) {  
  25.                mUploadMsg.onReceiveValue(null);  
  26.                mUploadMsg = null;  
  27.            }  
  28.            if (mValueCallback != null) {  
  29.                mValueCallback.onReceiveValue(null);  
  30.                mValueCallback = null;  
  31.            }  
  32.        }  
  33.        switch (requestCode) {  
  34.            case REQUEST_CODE_IMAGE_CAPTURE:  
  35.            case REQUEST_CODE_PICK_IMAGE: {  
  36.                try {  
  37.                    if (mUploadMsg != null) {  
  38.                       String sourcePath = ImageUtil.retrievePath(this, mSourceIntent, data);  
  39.                        if (TextUtils.isEmpty(sourcePath) || !new File(sourcePath).exists()) {  
  40.                            Log.w(TAG, "sourcePath empty or not exists.");  
  41.                            break;  
  42.                        }  
  43.                        File file = new File(PictureUtil.bitmapToPath(sourcePath));  
  44.                        Uri uri = Uri.fromFile(file);  
  45.                        mUploadMsg.onReceiveValue(uri);  
  46.                        mUploadMsg = null;  
  47.                    } else if (mValueCallback != null) {  
  48.                        Uri[] uris = new Uri[1];  
  49.   
  50.                        String sourcePath = ImageUtil.retrievePath(this, mSourceIntent, data);  
  51.                        if (TextUtils.isEmpty(sourcePath) || !new File(sourcePath).exists()) {  
  52.                            Log.w(TAG, "sourcePath empty or not exists.");  
  53.                            break;  
  54.                        }  
  55.                        File file = new File(PictureUtil.bitmapToPath(sourcePath));  
  56.                        uris[0] = Uri.fromFile(file);  
  57.                        if (uris[0] != null) {  
  58.   
  59.                            mValueCallback.onReceiveValue(uris);  
  60.   
  61.                        }  
  62.                        mValueCallback = null;  
  63.                    }  
  64.                } catch (Exception e) {  
  65.                    e.printStackTrace();  
  66.                }  
  67.                break;  
  68.            }  
  69.        }  
  70.    }  
  71.   
  72.    public void showOptions() {  
  73.        AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);  
  74.        alertDialog.setOnCancelListener(new ReOnCancelListener());  
  75.        alertDialog.setTitle(R.string.options);  
  76.        alertDialog.setItems(R.array.options, new DialogInterface.OnClickListener() {  
  77.                    @Override  
  78.                    public void onClick(DialogInterface dialog, int which) {  
  79.                        if (which == 0) {  
  80.                            mSourceIntent = ImageUtil.choosePicture();  
  81.                            startActivityForResult(mSourceIntent, REQUEST_CODE_PICK_IMAGE);  
  82.                        } else {  
  83.                            mSourceIntent = ImageUtil.takeBigPicture();  
  84.                            startActivityForResult(mSourceIntent, REQUEST_CODE_IMAGE_CAPTURE);  
  85.                        }  
  86.                    }  
  87.                }  
  88.   
  89.        );  
  90.        alertDialog.show();  
  91.    }  
  92.   
  93.    //这个必须要写,要不然第一次取消选择文件后第二次就调用不了选择文件这个功能了,所以一定要写  
  94.    private class ReOnCancelListener implements DialogInterface.OnCancelListener {  
  95.   
  96.        @Override  
  97.        public void onCancel(DialogInterface dialogInterface) {  
  98.            if (mUploadMsg != null) {  
  99.                mUploadMsg.onReceiveValue(null);  
  100.                mUploadMsg = null;  
  101.            }  
  102.            if (mValueCallback != null) {  
  103.                mValueCallback.onReceiveValue(null);  
  104.                mValueCallback = null;  
  105.            }  
  106.        }  
  107.    } 
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值