[转]Android使用WebView从相册/拍照中添加图片
原地址:http://blog.csdn.net/djcken/article/details/46379929
解决这个问题花了很长时间搜索了解,网上大部分使用openFileChooser但都没解决一个存在的问题。就是当弹出选择图片/相机框之后,取消选择,就再也不能点击选择按钮了。这篇文章是为了记录这一点,为验证整个流程部署了后端,但是由于很久没接触后端,后端代码是网上的列子,所以后端代码和部署就不说了。单纯的说下Android端的解决方案。
自定义两个文件:
- /**
- * 自定义
- *
- * @Author KenChung
- */
- public class ReWebViewClient extends WebViewClient {
- @Override
- public void onPageStarted(WebView view, String url, Bitmap favicon) {
- super.onPageStarted(view, url, favicon);
- }
- @Override
- public void onPageFinished(WebView view, String url) {
- super.onPageFinished(view, url);
- }
- }
- /**
- * ReWebChomeClient
- *
- * @Author KenChung
- */
- public class ReWebChomeClient extends WebChromeClient {
- private OpenFileChooserCallBack mOpenFileChooserCallBack;
- public ReWebChomeClient(OpenFileChooserCallBack openFileChooserCallBack) {
- mOpenFileChooserCallBack = openFileChooserCallBack;
- }
- //For Android 3.0+
- public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
- mOpenFileChooserCallBack.openFileChooserCallBack(uploadMsg, acceptType);
- }
- // For Android < 3.0
- public void openFileChooser(ValueCallback<Uri> uploadMsg) {
- openFileChooser(uploadMsg, "");
- }
- // For Android > 4.1.1
- public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
- openFileChooser(uploadMsg, acceptType);
- }
- public interface OpenFileChooserCallBack {
- void openFileChooserCallBack(ValueCallback<Uri> uploadMsg, String acceptType);
- }
- }
选择图片弹框使用AlertDialog:
- public void showOptions() {
- AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
- alertDialog.setOnCancelListener(new ReOnCancelListener());
- alertDialog.setTitle(R.string.options);
- alertDialog.setItems(R.array.options, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- if (which == 0) {
- mSourceIntent = ImageUtil.choosePicture();
- startActivityForResult(mSourceIntent, REQUEST_CODE_PICK_IMAGE);
- } else {
- mSourceIntent = ImageUtil.takeBigPicture();
- startActivityForResult(mSourceIntent, REQUEST_CODE_IMAGE_CAPTURE);
- }
- }
- }
- );
- alertDialog.show();
- }
关键代码:(这里的意思是取消弹框之后要告诉WebView不要再等待返回结果,设置为空就等于重置了状态)
- private class ReOnCancelListener implements DialogInterface.OnCancelListener {
- @Override
- public void onCancel(DialogInterface dialogInterface) {
- if (mUploadMsg != null) {
- mUploadMsg.onReceiveValue(null);
- mUploadMsg = null;
- }
- }
- }
完整MainActivity:
- /**
- * WebViewUpload
- *
- * @Author KenChung
- */
- public class MyActivity extends Activity implements ReWebChomeClient.OpenFileChooserCallBack {
- private static final String TAG = "MyActivity";
- private static final int REQUEST_CODE_PICK_IMAGE = 0;
- private static final int REQUEST_CODE_IMAGE_CAPTURE = 1;
- private WebView mWebView;
- private Intent mSourceIntent;
- private ValueCallback<Uri> mUploadMsg;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mWebView = (WebView) findViewById(R.id.webview);
- mWebView.setWebChromeClient(new ReWebChomeClient(this));
- mWebView.setWebViewClient(new ReWebViewClient());
- fixDirPath();
- //这里加载自己部署的(也可加载本地资源)
- mWebView.loadUrl("file:///android_asset/input.html");
- }
- @Override
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (resultCode != Activity.RESULT_OK) {
- return;
- }
- switch (requestCode) {
- case REQUEST_CODE_IMAGE_CAPTURE:
- case REQUEST_CODE_PICK_IMAGE: {
- try {
- if (mUploadMsg == null) {
- return;
- }
- String sourcePath = ImageUtil.retrievePath(this, mSourceIntent, data);
- if (TextUtils.isEmpty(sourcePath) || !new File(sourcePath).exists()) {
- Log.w(TAG, "sourcePath empty or not exists.");
- break;
- }
- Uri uri = Uri.fromFile(new File(sourcePath));
- mUploadMsg.onReceiveValue(uri);
- } catch (Exception e) {
- e.printStackTrace();
- }
- break;
- }
- }
- }
- @Override
- public void openFileChooserCallBack(ValueCallback<Uri> uploadMsg, String acceptType) {
- mUploadMsg = uploadMsg;
- showOptions();
- }
- public void showOptions() {
- AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
- alertDialog.setOnCancelListener(new ReOnCancelListener());
- alertDialog.setTitle(R.string.options);
- alertDialog.setItems(R.array.options, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- if (which == 0) {
- mSourceIntent = ImageUtil.choosePicture();
- startActivityForResult(mSourceIntent, REQUEST_CODE_PICK_IMAGE);
- } else {
- mSourceIntent = ImageUtil.takeBigPicture();
- startActivityForResult(mSourceIntent, REQUEST_CODE_IMAGE_CAPTURE);
- }
- }
- }
- );
- alertDialog.show();
- }
- private void fixDirPath() {
- String path = ImageUtil.getDirPath();
- File file = new File(path);
- if (!file.exists()) {
- file.mkdirs();
- }
- }
- private class ReOnCancelListener implements DialogInterface.OnCancelListener {
- @Override
- public void onCancel(DialogInterface dialogInterface) {
- if (mUploadMsg != null) {
- mUploadMsg.onReceiveValue(null);
- mUploadMsg = null;
- }
- }
- }
- }
有些哥们反馈没有附上html无法测试,放上html到本地即可:input.html
- <!DOCTYPE html>
- <html>
- <head>
- <meta name="viewport" content="user-scalable=no">
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- </head>
- <body>
- <input id="input" type="file"/>
- </body>
- </html>
源码没有附上本地html,需自行创建。源码下载地址:CSDN下载
[转]Android使用WebView从相册/拍照中添加图片的更多相关文章
- 在RichTextBox控件中添加图片和文字
public void SetText(RichTextBox rtb) { rtb.Text = "在RichTextBox控件中添加图片和文字" + Environment.N ...
- ArcMap图层属性表中添加图片
一看标题是不是有点懵?懵就对了!刚接触到的时候我也有点懵,属性表不是都是文本啊数字啊之类的格式,怎么还可以存图片,下面就带大家来看看吧! 一.关于图层入库问题 图层进入数据库和图层以shp格式存储时, ...
- 关于在Silverlight中添加图片的问题
在Silverlight中添加图片,目前支持的Image格式有jpg和png两种,如何在目录中添加,有些什么技巧呢? <StackPanel Background="White&quo ...
- 如何在github的README.md中添加图片
如何在github的README.md中添加图片 总结: 链接引用: 简介: 1.在github上的仓库建立一个存放图片的文件夹,文件夹名字随意.如:img ...
- ag-grid 表格中添加图片
ag-grid是一种非常好用的表格,网上搜索会有各种各样的基本用法,不过对于在ag-grid 表格中添加图片我没有找到方法,看了官方的文档,当然英文的自己也是靠网页翻译,最后发现有这么一个例子,我知道 ...
- iview+vue 表格中添加图片
开门见山,话不多说,要在表格中添加图片,可以使用td: <table " width="100%"> <tr class="tr-style ...
- 如何兼容所有Android版本选择照片或拍照然后裁剪图片--基于FileProvider和动态权限的实现
我们知道, Android操作系统一直在进化. 虽然说系统是越来越安全, 可靠, 但是对于开发者而言, 开发难度是越来越大的, 需要注意的兼容性问题, 也越来越多. 就比如在Android平台上拍照或 ...
- [Android]ListView的Adapter.getView()方法中延迟加载图片的优化
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4139998.html 举个例子吧,以好友列表为例 ListVi ...
- Android 解决调用系统相册打不开图片 DecodeServices报解码错误
这是由于系统相册不知道你图片目录是一个相册.打开前需要向系统相册“注册一下”,说白了就是让系统相册知道你这个图片所在的文件夹是个相册. private static void scanImageFil ...
随机推荐
- mysql 数据库迁移
公司的视频转码服务 使用mysql作为 任务队列, 其中mysql 是我们自己维护的 单例. 后来应业务部门建议,我们计划将现有的mysql 向dba进行迁移,以下记录一下 数据库迁移过程中的东西. ...
- bash 取文件特定行
比如,想要取某文件10-20行 可以用sed sed -n '10,20p' XXX.txt 非常方便!
- hping原理、安装、使用详解介绍
[原理基础] Hping是一个命令行下使用的TCP/IP数据包组装/分析工具,其命令模式很像Unix下的ping命令,但是它不是只能发送ICMP回应请求,它还可以支持TCP.UDP.ICMP和RAW ...
- LoadRunner迭代与并发的理解
---恢复内容开始--- 四车道的马路,如果只有四辆车并排走过就是并发: 如果四辆车排成一纵队走过就是迭代: 如果有100辆车排成25行依次走过就是并发加迭代. 在以上说法中,只有并排的车是我们 ...
- javascript方法链式调用和构造函数链式调用对比
先说一下方法链:B的实例从A继承了A中的同名方法,如果B的方法重载了A中的方法,B中的重载方法可能会调用A中的重载方法,这种方法称为方法链. 构造函数链:子类的构造函数B()有时需要调用父类的构造函数 ...
- mysql 索引查询的问题
之前碰到过一个问题,本来数据量不大的一张表,查询结果反应特别慢,不知道是什么原因. 后来才得知,查询的反应速度与结果集大小有关. 结果集越小反应速度越快.
- {part2}DFN+LOW(tarjan)割边
首先非树边肯定不是割边,因为去掉它DFS树不受影响,只要还能生成一棵DFS树那么图就是连通的. 然后割掉一条树边只可能造成一个点与它的父亲不连通. 那好办,也就是说这个以这个点为根的子树就是上面所说的 ...
- 编译c
1.打开vs工具 2.弄到相同路径(同所编译文件) 3.cl(微软编译器) 生成 obj exe文件 4.system是一个通用指令 可以在windows linux mac用
- js在IE和FF下的兼容性问题
本文出自前端档案,以作学习参考之用.自己也补充了一些内容 长久以来JavaScript兼容性一直是Web开发者的一个主要问题.在正式规范.事实标准以及各种实现之间的存在的差异让许多开发者日夜煎熬.为此 ...
- Javascript模式(第五章对象创建模式)------读书笔记
一 命名空间模式 1 命名空间模式的代码格式 var MYAPP={ name:"", version:"1.0", init:function(){ } }; ...