- 浏览: 232401 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (70)
- Spring (5)
- J2EE (5)
- Android (21)
- JavaSe (12)
- JmagicK (1)
- Eclipse (3)
- 重构 (1)
- Struts2 (2)
- 项目经验 (2)
- UML (1)
- 设计模式 (3)
- TDD (1)
- 极限编程 (1)
- 敏捷编程 (1)
- Json (1)
- Java web (1)
- ejb (1)
- mongodb (1)
- Mylyn (1)
- git (1)
- oracle (2)
- 操作系统 (1)
- 数据结构与算法 (2)
- C (1)
- 效率参考 (1)
- Java基础 (3)
- 开源框架 (1)
- 阿里云 (2)
- linux (1)
- html5开发框架 (3)
- ios开发 (2)
- webapp (0)
- 我的创业 (1)
- Java (1)
- IDE (1)
- Java虚拟机 (2)
- 区块链 (2)
最新评论
-
BlueSkyXin:
你真的很厉害,懂得不懂得,都跟我们讲清楚了。你这才叫学知识,透 ...
Struts2值栈的理解 -
wiseyl:
第一种方法: 过滤器不太好,建议在service层时 由于se ...
hibernate+spring mvc,解决hibernate对象懒加载,json序列化失败 -
u012256814:
您好,看了您的这个教程受益不小,我就是想问问您在sha1后面加 ...
Google Map API V2 密钥申请 详细图解 -
ahau10:
OGNL表达式,context, valueStack都讲清楚 ...
Struts2值栈的理解 -
yaolan:
Struts2值栈的理解
废话不多说,直接进入主题,想要在android中实现拍照最简单饿方法就是New 一个 Intent 设置Action为android.media.action.IMAGE_CAPTURE 然后使用startActivityForResult(intent,REQUEST_CODE)方法进入相机。当然还有很多方式可以实现,大家可以在网上查找。但是要注意的是在进入相机前最好判断下sdcard是否可用,代码如下:
destoryBimap(); String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED)) { intent = new Intent("android.media.action.IMAGE_CAPTURE"); startActivityForResult(intent, REQUEST_CODE); } else { Toast.makeText(DefectManagerActivity.this, R.string.common_msg_nosdcard, Toast.LENGTH_LONG).show(); }
当拍照完成以后需要在onActivityResult(int requestCode, int resultCode, Intent data)方法中获取拍摄的图片,android把拍摄的图片封装到bundle中传递回来,但是根据不同的机器获得相片的方式不太一样,所以会出现某一种方式获取图片为null的想象,解决办法就是做一个判断,当一种方式不能获取,就是用另一种方式,下面是分别获取相片的两种方式:
Uri uri = data.getData(); if (uri != null) { photo = BitmapFactory.decodeFile(uri.getPath()); } if (photo == null) { Bundle bundle = data.getExtras(); if (bundle != null) { photo = (Bitmap) bundle.get("data"); } else { Toast.makeText(DefectManagerActivity.this, getString(R.string.common_msg_get_photo_failure), Toast.LENGTH_LONG).show(); return; } }
第一种方式是用方法中传回来的intent调用getData();方法获取数据的Uri,然后再根据uri获取数据的路径,然后根据路径封装成一个bitmap就行了.
第二种方式也是用法中传回来的intent对象但是不再是调用getData();方法而是调用getExtras();方法获取intent里面所有参数的一个对象集合bundle,然后是用bundle对象得到键为data的值也就是一个bitmap对象.
通过上面两种方式就能获取相片的bitmap对象,然后就可以在程序中是用,如果你想把相片保存到自己指定的目录可以是用如下步骤即可:
首先bitmap有个一compress(Bitmap.CompressFormat.JPEG, 100, baos)方法,这个方法有三个参数,第一个是指定将要保存的图片的格式,第二个是图片保存的质量,值是0-100,比如像PNG格式的图片这个参数你可以随便设置,因为PNG是无损的格式。第三个参数是你一个缓冲输出流ByteArrayOutputStream();,这个方法的作用就是把bitmap的图片转换成jpge的格式放入输出流中,然后大家应该明白怎么操作了吧,下面是实例代码:
String pictureDir = ""; FileOutputStream fos = null; BufferedOutputStream bos = null; ByteArrayOutputStream baos = null; try { baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte[] byteArray = baos.toByteArray(); String saveDir = Environment.getExternalStorageDirectory() + "/temple"; File dir = new File(saveDir); if (!dir.exists()) { dir.mkdir(); } File file = new File(saveDir, "temp.jpg"); file.delete(); if (!file.exists()) { file.createNewFile(); } fos = new FileOutputStream(file); bos = new BufferedOutputStream(fos); bos.write(byteArray); pictureDir = file.getPath(); } catch (Exception e) { e.printStackTrace(); } finally { if (baos != null) { try { baos.close(); } catch (Exception e) { e.printStackTrace(); } } if (bos != null) { try { bos.close(); } catch (Exception e) { e.printStackTrace(); } } if (fos != null) { try { fos.close(); } catch (Exception e) { e.printStackTrace(); } } }
然后就是实现图片的上传功能,我这里是是用的apache的HttpClient里面的MultipartEntity实现文件上传具体代码如下:
/** * 提交参数里有文件的数据 * * @param url * 服务器地址 * @param param * 参数 * @return 服务器返回结果 * @throws Exception */ public static String uploadSubmit(String url, Map<String, String> param, File file) throws Exception { HttpPost post = new HttpPost(url); MultipartEntity entity = new MultipartEntity(); if (param != null && !param.isEmpty()) { for (Map.Entry<String, String> entry : param.entrySet()) { entity.addPart(entry.getKey(), new StringBody(entry.getValue())); } } // 添加文件参数 if (file != null && file.exists()) { entity.addPart("file", new FileBody(file)); } post.setEntity(entity); HttpResponse response = httpClient.execute(post); int stateCode = response.getStatusLine().getStatusCode(); StringBuffer sb = new StringBuffer(); if (stateCode == HttpStatus.SC_OK) { HttpEntity result = response.getEntity(); if (result != null) { InputStream is = result.getContent(); BufferedReader br = new BufferedReader( new InputStreamReader(is)); String tempLine; while ((tempLine = br.readLine()) != null) { sb.append(tempLine); } } } post.abort(); return sb.toString(); }
这里就基本上对图片上传就差不多了,但是还有一个问题就是图片上传完以后bitmap还在内存中,而且大家都知道如果,高清的图片比较大,而手机内存本来就有限,如果不进行处理很容易报内存溢出,所以我们应该把处理完的bitmap从内存中释放掉,这时候就需要调用bitmap的recycle();方法,调用这个方法的时候需要注意不能太早也不能太晚,不然会报异常,一般可以放在下一张图片生成前或者没有任何view引用要销毁的图片的时候下面是实例代码:
/** * 销毁图片文件 */ private void destoryBimap() { if (photo != null && !photo.isRecycled()) { photo.recycle(); photo = null; } }
发表评论
-
Java实现文件加密传输和快速解密读取
2018-06-29 15:29 4190在运营某些项目时,我们可能需要使用到第三方的服务器来存储数据 ... -
Java实现文件加密传输和快速解密读取
2018-06-29 15:37 1在运营某些项目时,我们可能需要使用到第三方的服务器来存储数 ... -
Android4.4来了
2013-11-01 13:59 0Beautiful & Immersive A ... -
Android应用开机自动启动
2013-09-28 19:58 1708背景知识:当Android启动时,会发出一个系统广播,内容为 ... -
Java基础 之软引用、弱引用、虚引用
2013-09-28 19:55 1063在JDK1.2以前的版本中,当一个对象不被任何变 ... -
adb server无法启动方法,结束占用端口的进程
2013-08-05 13:38 8284adb server is out of date. ki ... -
ListViewPager,ListView分页最轻量解决方案
2013-08-05 12:41 0import java.util.concurrent.at ... -
【Android】升级ADT 22 引发的错误
2013-07-05 17:24 992言 今天心血来潮,又把ADT升级了一下,升级到了ADT 2 ... -
Google I/O大会发布Android Studio,安装与不能运行解决
2013-05-16 15:25 20031.下载地址: https://developer.an ... -
Google I/O大会发布Android Studio,安装与不能运行解决等错误解决。
2013-05-16 15:23 1199下载地址: https://developer.andro ... -
使用Git之后出现android library引用失败
2013-04-06 00:04 5417今天在做android项目的使用,因为使用了git做代码托管 ... -
提高Android在eclipse下的编译速度
2013-04-02 15:46 3075大家都知道用eclipse安装adt来进行Android程序 ... -
android no target available 解决
2013-04-02 15:33 10305在安装最新版本的ADT之后,版本21.1.启动eclipse ... -
android学习和广告平台赚钱
2013-01-30 09:29 1612前言: 2011年11月份我开始学习andr ... -
android4.0 使用百度地图不能自动刷新问题
2013-01-21 10:38 2015百度地图,4.0以下的可以正常使用。 但是4.0的就会出 ... -
Google Map API V2 密钥申请 详细图解
2013-01-13 11:03 19415前一阵公司给配了个Mac 谁想项目运行后地图没了,怎么办 ... -
Json转换为Java对象
2012-11-04 19:56 1634package com.chinatech.common ... -
Android Query使用教程
2012-08-05 01:39 7511在android程序设计中,很多是要要实现异步任务,缓存,获取 ... -
设置Activity全屏
2012-08-05 01:27 1282*全屏 在Android下如何实现一个Activit ... -
Android资源
2012-07-14 13:10 1270Android Platform 3.0 SDK和 ...
相关推荐
android 拍照上传照片(新)源码,需要的可以下载下去看看。
android调用摄像机拍照并通过httpservlet将图片上传至Pc端的服务器,此代码可以改造成上传文件的程序
调用Android系统自带拍照功能对发票进行拍照存储; 使用DES算法加密照片; 基于Socket的上传发票照片及相关信息至服务器并解密; 将发票基本信息存至SqlServer数据库
Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等 - 享受技术带来的快乐! - 博客频道 - CSDN.NET_files
Android设置拍照或者上传本地图片,很好的例子已经测试过完全可以使用
android拍照后将照片上传至web服务器,服务器端使用servlet+tomcat实现,拍照时实现自动对焦,并且可以调整相机焦距
android 拍照上传源码
Android选择系统相册或拍照上传源码 类似于社交网站的一个照片上传的功能。简单源码
Android拍照功能和照片包含参数一起上传服务器,网上很多教程拍照的图片,都是缩略图不是很清晰,所以需要在调用照相机的时候,事先生成一个地址,用于标识拍照的图片URI
安卓7.0拍照权限适配解决安卓本地图片选择或者拍照更换头像上传后台,
unity android 照片读取保存 截取 拍照获取手机上的图片
android 拍照特定框内的照片,并载剪保存在本地,可以做成类似微信扫一扫,然后上传框内的照片到服务器,读取照片内容,有不明白的欢迎交流。。
自己写的android 拍照或从本地相册多次添加多张图片亲测可用
Android11 适配,拍照问题。兼容Android11 targetSDk 31。有拍照功能和从相册选择图片,获取图片路径,保存图片。关联文章https://blog.csdn.net/u013778491/article/details/125638960
Android, 拍照,选择相册,裁剪,上传照片
调用系统照相机拍照,采用图片框里库预览图片,采用okhttp上传文件至后台。
Android自定义身份证相机-IDCardCamera 效果图: 功能特点 自定义相机界面 支持开启闪光灯 支持手动触摸屏幕对焦 支持自动对焦 支持图片自动裁剪 支持图片手动不规则裁剪 2 使用 Step 1. 添加JitPack仓库 在...
android仿微信发朋友圈,调用系统拍照和选择照片activity.
android仿微信朋友圈上传照片
拍照或者图片上传 拍照或者图片上传 拍照或者图片上传