【项目中---WebView】Webview打开本地图片文件选择解决方案

来源:互联网 发布:阿里云404页面设置 编辑:程序博客网 时间:2024/05/18 12:40

Webview打开本地图片选择器解决方案

Webview打开本地图片选择器十分之麻烦,其在安卓系统3x 4x 5x上的行为都不同,处理也不同,所以之前差点崩溃。经过测试和完善,最终其在各个版本上都能完美工作,特此开源出来,希望能帮到大家

  • Webview
  • FileChooser
  • 返回键处理
  • Android3.0之前版本
  • Android3.x版本
  • Android4.x版本
  • Android5.x版本

代码块

public class BrowserActivity extends BaseActivity {    public ValueCallback<Uri> mUploadMessage;    public ValueCallback<Uri[]> mUploadMessageForAndroid5;    public final static int FILECHOOSER_RESULTCODE = 1;    public final static int FILECHOOSER_RESULTCODE_FOR_ANDROID_5 = 2;    @Bind(R.id.webview)    WebView webView;    @Bind(R.id.titleBar)    View view;    ProgressDialog progressBar;    @Override    protected void setRootView() {        super.setRootView();        setContentView(R.layout.activity_browser);    }    @Override    protected void initData() {        super.initData();    }    @Override    protected void initWidget() {        super.initWidget();        progressBar = new ProgressDialog(this);        progressBar.setProgressStyle(ProgressDialog.STYLE_SPINNER);        webView.getSettings().setJavaScriptEnabled(true);        webView.getSettings().setAppCacheEnabled(false);        webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);        webView.loadUrl(getIntent().getStringExtra(CommonKeys.url.name()));        webView.setWebViewClient(new WebViewClient() {            @Override            public boolean shouldOverrideUrlLoading(WebView view, String url) {                //handler.sendEmptyMessage(0);                view.loadUrl(url);                return true;            }        });        webView.setWebChromeClient(                new WebChromeClient() {                    public void onProgressChanged(WebView view, int progress) {// 载入进度改变而触发                        if (progress == 100) {                            //handler.sendEmptyMessage(1);// 如果全部载入,隐藏进度对话框                        }                        super.onProgressChanged(view, progress);                    }                    //扩展支持alert事件                    @Override                    public boolean onJsAlert(WebView view, String url, String message, JsResult result) {                        AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());                        builder.setTitle("xxx提示").setMessage(message).setPositiveButton("确定", null);                        builder.setCancelable(false);                        builder.setIcon(R.drawable.ic_launcher);                        AlertDialog dialog = builder.create();                        dialog.show();                        result.confirm();                        return true;                    }                    //扩展浏览器上传文件                    //3.0++版本                    public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {                        openFileChooserImpl(uploadMsg);                    }                    //3.0--版本                    public void openFileChooser(ValueCallback<Uri> uploadMsg) {                        openFileChooserImpl(uploadMsg);                    }                    public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {                        openFileChooserImpl(uploadMsg);                    }                    // For Android > 5.0                    public boolean onShowFileChooser (WebView webView, ValueCallback<Uri[]> uploadMsg, WebChromeClient.FileChooserParams fileChooserParams) {                        openFileChooserImplForAndroid5(uploadMsg);                        return true;                    }                }        );        webView.addJavascriptInterface(new BrowserInterface(this), "BrowserInterface");    }    private void openFileChooserImpl(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);    }    private void openFileChooserImplForAndroid5(ValueCallback<Uri[]> uploadMsg) {        mUploadMessageForAndroid5 = uploadMsg;        Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT);        contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE);        contentSelectionIntent.setType("image/*");        Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);        chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent);        chooserIntent.putExtra(Intent.EXTRA_TITLE, "Image Chooser");        startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE_FOR_ANDROID_5);    }    @Override    protected void initTopTitle() {        view.setVisibility(View.GONE);    }    @Override    public boolean onKeyDown(int keyCode, KeyEvent event) {        if (webView.canGoBack() && event.getKeyCode() == KeyEvent.KEYCODE_BACK) {            //获取历史列表            WebBackForwardList mWebBackForwardList = webView                    .copyBackForwardList();            //判断当前历史列表是否最顶端,其实canGoBack已经判断过            if (mWebBackForwardList.getCurrentIndex() > 0) {                webView.goBack();                return true;            }        }        return super.onKeyDown(keyCode, event);    }    @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;        } else if (requestCode == FILECHOOSER_RESULTCODE_FOR_ANDROID_5){            if (null == mUploadMessageForAndroid5)                return;            Uri result = (intent == null || resultCode != RESULT_OK) ? null: intent.getData();            if (result != null) {                mUploadMessageForAndroid5.onReceiveValue(new Uri[]{result});            } else {                mUploadMessageForAndroid5.onReceiveValue(new Uri[]{});            }            mUploadMessageForAndroid5 = null;        }    }    private Handler handler = new Handler() {        public void handleMessage(Message msg) {// 定义一个Handler,用于处理下载线程与UI间通讯            if (!Thread.currentThread().isInterrupted()){                switch (msg.what) {                    case 0:                        progressBar.show();// 显示进度对话框                        break;                    case 1:                        progressBar.hide();// 隐藏进度对话框,不可使用dismiss()、cancel(),否则再次调用show()时,显示的对话框小圆圈不会动。                        break;                }            }            super.handleMessage(msg);        }    };}


0 0