【项目中---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
- 【项目中---WebView】Webview打开本地图片文件选择解决方案
- Webview打开本地图片文件选择解决方案
- webView选择本地图片
- Webview打开本地图片选择器
- Webview打开本地文件、图片选择的解决方案。版本兼容问题
- android webview打开本地图片上传
- android使用webView打开本地html文件
- android Webview打开、上传本地图片的解决方案 支持到5.0
- WebView中使用HTML打开本地应用
- WebView中运用HTML打开本地应用
- WebView中使用HTML打开本地应用
- WebView中使用HTML打开本地应用
- WebView 打开本地相册
- webview本地打开
- webview 图片自适应解决方案
- webview图片自适应解决方案
- iOS中webview加载本地html文件
- Webview 打开本地图片库兼容问题
- 解决VM下Linux中mysql无法远程连接的问题,报错码1130,1045
- 用DMA直接驱动GPIO,实现GPIO最高输出速率
- BZOJ 1172 Balkan2007 Dream
- 源码分析 --- Context
- linphone函数video_stream_event_cb()分析
- 【项目中---WebView】Webview打开本地图片文件选择解决方案
- Relation Extraction中SVM分类样例unbalance data问题解决 -松弛变量与惩罚因子
- poj 3264
- linphone函数ms_filter_link分析
- android The specified child already has a parent. You must call removeView() on the child's parent f
- 统计数组中出现次数最多的元素并输出
- A标签尽量不用#号
- 获取当前工作目录
- 有用的工具