android 拍照上传照片

摘要:
1目标Bimap();2Stringstate=环境。获取外部存储状态();3if{4intent=newIntent;5startActivityForResult;6}否则{7Toast.makeText.show();9}拍照后,您需要在onActivityResult方法中获取捕获的图片。Android将捕获的图片打包到捆绑包中,并将其转回。然而,根据不同的机器,获取图片的方式是不同的,因此您可能会认为获取图片的一种方式是空的。解决方法是做出判断,当一种方法无法获得时,另一种方法是使用它。这里有两种获取照片的方法:查看源代码和print=Null){42try{43fos.close();44}catch{45e.printStackTrace();46}47}48}然后用于上传图像。这里我使用Apache HttpClient中的MultipartEntity来上传文件。具体代码如下:查看源代码打印?

废话不多说,直接进入主题,想要在android中实现拍照最简单饿方法就是New 一个 Intent 设置Action为android.media.action.IMAGE_CAPTURE 然后使用startActivityForResult(intent,REQUEST_CODE)方法进入相机。当然还有很多方式可以实现,大家可以在网上查找。但是要注意的是在进入相机前最好判断下sdcard是否可用,代码如下:

1destoryBimap();
2String state = Environment.getExternalStorageState();
3if(state.equals(Environment.MEDIA_MOUNTED)) {
4intent = newIntent("android.media.action.IMAGE_CAPTURE");
5startActivityForResult(intent, REQUEST_CODE);
6} else{
7Toast.makeText(DefectManagerActivity.this,
8R.string.common_msg_nosdcard, Toast.LENGTH_LONG).show();
9}

当拍照完成以后需要在onActivityResult(int requestCode, int resultCode, Intent data)方法中获取拍摄的图片,android把拍摄的图片封装到bundle中传递回来,但是根据不同的机器获得相片的方式不太一样,所以会出现某一种方式获取图片为null的想象,解决办法就是做一个判断,当一种方式不能获取,就是用另一种方式,下面是分别获取相片的两种方式:

01Uri uri = data.getData();
02if(uri != null) {
03photo = BitmapFactory.decodeFile(uri.getPath());
04}
05if(photo == null) {
06Bundle bundle = data.getExtras();
07if(bundle != null) {
08photo = (Bitmap) bundle.get("data");
09} else{
10Toast.makeText(DefectManagerActivity.this,
11getString(R.string.common_msg_get_photo_failure),
12Toast.LENGTH_LONG).show();
13return;
14}
15}

第一种方式是用方法中传回来的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的格式放入输出流中,然后大家应该明白怎么操作了吧,下面是实例代码:

01String pictureDir = "";
02FileOutputStream fos = null;
03BufferedOutputStream bos = null;
04ByteArrayOutputStream baos = null;
05try{
06baos = newByteArrayOutputStream();
07bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
08byte[] byteArray = baos.toByteArray();
09String saveDir = Environment.getExternalStorageDirectory()
10+ "/temple";
11File dir = newFile(saveDir);
12if(!dir.exists()) {
13dir.mkdir();
14}
15File file = newFile(saveDir, "temp.jpg");
16file.delete();
17if(!file.exists()) {
18file.createNewFile();
19}
20fos = newFileOutputStream(file);
21bos = newBufferedOutputStream(fos);
22bos.write(byteArray);
23pictureDir = file.getPath();
24} catch(Exception e) {
25e.printStackTrace();
26} finally{
27if(baos != null) {
28try{
29baos.close();
30} catch(Exception e) {
31e.printStackTrace();
32}
33}
34if(bos != null) {
35try{
36bos.close();
37} catch(Exception e) {
38e.printStackTrace();
39}
40}
41if(fos != null) {
42try{
43fos.close();
44} catch(Exception e) {
45e.printStackTrace();
46}
47}
48}

然后就是实现图片的上传功能,我这里是是用的apache的HttpClient里面的MultipartEntity实现文件上传具体代码如下:

01/**
02* 提交参数里有文件的数据
03*
04* @param url
05* 服务器地址
06* @param param
07* 参数
08* @return 服务器返回结果
09* @throws Exception
10*/
11publicstaticString uploadSubmit(String url, Map<String, String> param,
12File file) throwsException {
13HttpPost post = newHttpPost(url);
14
15MultipartEntity entity = newMultipartEntity();
16if(param != null&& !param.isEmpty()) {
17for(Map.Entry<String, String> entry : param.entrySet()) {
18entity.addPart(entry.getKey(), newStringBody(entry.getValue()));
19}
20}
21// 添加文件参数
22if(file != null&& file.exists()) {
23entity.addPart("file", newFileBody(file));
24}
25post.setEntity(entity);
26HttpResponse response = httpClient.execute(post);
27intstateCode = response.getStatusLine().getStatusCode();
28StringBuffer sb = newStringBuffer();
29if(stateCode == HttpStatus.SC_OK) {
30HttpEntity result = response.getEntity();
31if(result != null) {
32InputStream is = result.getContent();
33BufferedReader br = newBufferedReader(
34newInputStreamReader(is));
35String tempLine;
36while((tempLine = br.readLine()) != null) {
37sb.append(tempLine);
38}
39}
40}
41post.abort();
42returnsb.toString();
43}

这里就基本上对图片上传就差不多了,但是还有一个问题就是图片上传完以后bitmap还在内存中,而且大家都知道如果,高清的图片比较大,而手机内存本来就有限,如果不进行处理很容易报内存溢出,所以我们应该把处理完的bitmap从内存中释放掉,这时候就需要调用bitmap的recycle();方法,调用这个方法的时候需要注意不能太早也不能太晚,不然会报异常,一般可以放在下一张图片生成前或者没有任何view引用要销毁的图片的时候下面是实例代码:

1/**
2* 销毁图片文件
3*/
4privatevoiddestoryBimap() {
5if(photo != null&& !photo.isRecycled()) {
6photo.recycle();
7photo = null;
8}
9}

转自:http://blog.csdn.net/yaoyeyzq/article/details/7254679

免责声明:文章转载自《android 拍照上传照片》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇分享如何使用PHP将URL地址参数进行加密传输提高网站安全性后渗透工具Empire使用教程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Springcloud 学习笔记04-Springboot连接数据库

一、打开user-service微服务 启动类右键Run’UserServiceApplication’或者点击右上方启动 2 Springboot连接Mysql数据库 (1)首先我们将需要的包导入,这几个包都是我们稍后要用到的: <dependency> <groupId>mysql<...

C++ 解析Json——jsoncpp

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,和xml类似,本文主要对VS2008中使用Jsoncpp解析json的方法做一下记录。Jsoncpp是个跨平台的开源库,下载地址:http://sourceforge.net/projects/jsoncpp/。 方法一:使用Jsoncpp生成的lib文件 解压上...

Protobuf API安全测试启示 admin

ProtoBuf介绍 protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。 Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。 因此具有以下特点: 语言...

提取网页中的超链接(C#)

using System;using System.Xml;using System.Text;using System.Net;using System.IO;using System.Collections;using System.Text.RegularExpressions; public class App{public static voi...

python ORM框架:SqlAlchemy

  ORM,对象关系映射,即Object Relational Mapping的简称,通过ORM框架将编程语言中的对象模型与数据库的关系模型建立映射关系,这样做的目的:简化sql语言操作数据库的繁琐过程(原生sql的编写及拼接等),转而直接使用对象模型来操作数据库做替代 第一部分       SqlAlchemy本身无法直接操作数据库,它是建立在第三...

java后台中处理图片辅助类汇总(上传图片到服务器,从服务器下载图片保存到本地,缩放图片,copy图片,往图片添加水印图片或者文字,生成二维码,删除图片等)

最近工作中处理小程序宝箱活动,需要java画海报,所以把这块都快百度遍了,记录一下处理的方法,百度博客上面也有不少坑! 获取本地图片路径: String bgPath = Thread.currentThread().getContextClassLoader().getResource("/").getPath().replaceAll("WEB-INF...