android 拍照上传照片

转载 2013年12月04日 15:53:46

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

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


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

[java] view plaincopy
  1.                         Uri uri = data.getData();  
  2. if (uri != null) {  
  3.     photo = BitmapFactory.decodeFile(uri.getPath());  
  4. }  
  5. if (photo == null) {  
  6.     Bundle bundle = data.getExtras();  
  7.     if (bundle != null) {  
  8.         photo = (Bitmap) bundle.get("data");  
  9.     } else {  
  10.         Toast.makeText(DefectManagerActivity.this,  
  11.                 getString(R.string.common_msg_get_photo_failure),  
  12.                 Toast.LENGTH_LONG).show();  
  13.         return;  
  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的格式放入输出流中,然后大家应该明白怎么操作了吧,下面是实例代码:

[java] view plaincopy
  1.                 String pictureDir = "";  
  2. FileOutputStream fos = null;  
  3. BufferedOutputStream bos = null;  
  4. ByteArrayOutputStream baos = null;  
  5. try {  
  6.     baos = new ByteArrayOutputStream();  
  7.     bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);  
  8.     byte[] byteArray = baos.toByteArray();  
  9.     String saveDir = Environment.getExternalStorageDirectory()  
  10.             + "/temple";  
  11.     File dir = new File(saveDir);  
  12.     if (!dir.exists()) {  
  13.         dir.mkdir();  
  14.     }  
  15.     File file = new File(saveDir, "temp.jpg");  
  16.     file.delete();  
  17.     if (!file.exists()) {  
  18.         file.createNewFile();  
  19.     }  
  20.     fos = new FileOutputStream(file);  
  21.     bos = new BufferedOutputStream(fos);  
  22.     bos.write(byteArray);  
  23.     pictureDir = file.getPath();  
  24. catch (Exception e) {  
  25.     e.printStackTrace();  
  26. finally {  
  27.     if (baos != null) {  
  28.         try {  
  29.             baos.close();  
  30.         } catch (Exception e) {  
  31.             e.printStackTrace();  
  32.         }  
  33.     }  
  34.     if (bos != null) {  
  35.         try {  
  36.             bos.close();  
  37.         } catch (Exception e) {  
  38.             e.printStackTrace();  
  39.         }  
  40.     }  
  41.     if (fos != null) {  
  42.         try {  
  43.             fos.close();  
  44.         } catch (Exception e) {  
  45.             e.printStackTrace();  
  46.         }  
  47.     }  
  48. }  

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

[java] view plaincopy
  1. /** 
  2.      * 提交参数里有文件的数据 
  3.      *  
  4.      * @param url 
  5.      *            服务器地址 
  6.      * @param param 
  7.      *            参数 
  8.      * @return 服务器返回结果 
  9.      * @throws Exception 
  10.      */  
  11.     public static String uploadSubmit(String url, Map<String, String> param,  
  12.             File file) throws Exception {  
  13.         HttpPost post = new HttpPost(url);  
  14.   
  15.         MultipartEntity entity = new MultipartEntity();  
  16.         if (param != null && !param.isEmpty()) {  
  17.             for (Map.Entry<String, String> entry : param.entrySet()) {  
  18.                 entity.addPart(entry.getKey(), new StringBody(entry.getValue()));  
  19.             }  
  20.         }  
  21.         // 添加文件参数  
  22.         if (file != null && file.exists()) {  
  23.             entity.addPart("file"new FileBody(file));  
  24.         }  
  25.         post.setEntity(entity);  
  26.         HttpResponse response = httpClient.execute(post);  
  27.         int stateCode = response.getStatusLine().getStatusCode();  
  28.         StringBuffer sb = new StringBuffer();  
  29.         if (stateCode == HttpStatus.SC_OK) {  
  30.             HttpEntity result = response.getEntity();  
  31.             if (result != null) {  
  32.                 InputStream is = result.getContent();  
  33.                 BufferedReader br = new BufferedReader(  
  34.                         new InputStreamReader(is));  
  35.                 String tempLine;  
  36.                 while ((tempLine = br.readLine()) != null) {  
  37.                     sb.append(tempLine);  
  38.                 }  
  39.             }  
  40.         }  
  41.         post.abort();  
  42.         return sb.toString();  
  43.     }  

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

[java] view plaincopy
  1. /** 
  2.      * 销毁图片文件 
  3.      */  
  4.     private void destoryBimap() {  
  5.         if (photo != null && !photo.isRecycled()) {  
  6.             photo.recycle();  
  7.             photo = null;  
  8.         }  
  9.     }  



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

Android拍照,上传,预览综合【修改】

最近需要做手机拍照【两种方式:调用系统相机(博客最后);自己写照相机布局】,预览,上传功能。特地研究了下android的手机拍照。 参考地址: http://blog.csdn.net/c...
  • huang9012
  • huang9012
  • 2014年02月10日 16:59
  • 10624

Android设置拍照或者上传本地图片

效果如下: 看代码: MainActivity类中: package com.example.ceshidemo; import java.io.ByteArrayOutputStream; ...
  • onceing
  • onceing
  • 2015年07月09日 15:08
  • 6370

Android上使用camera拍照,把获取的照片上传到远程服务器

使用Java上传文件 从Apache Software Foundation下载HttpClient 4.3.4。 在工程中添加下面的jar包: 参考sample,写...
  • jdsjlzx
  • jdsjlzx
  • 2014年12月19日 14:34
  • 6707

Android 拍照 以及从本地选择图片 上传

Android 拍照以及选择本地图片上传(使用MX4没有问题,LG手机貌似不能选择本地图片,以后有时间看看),在网上找的一些资料,改写的。 activity代码 package com.yti...
  • wanglj7525
  • wanglj7525
  • 2015年06月26日 10:22
  • 28057

Android拍照获取照片路径并上传至服务器+Servlet代码

摘要: 拍照和选择本地图片上传的代码网上很多,但也有的代码在自己程序上跑不起来,所以整的有点尴尬,今天自己的拍照上传和本地图片选择上传代码都已完成。 先来客户端代码【这里只写了主要代码】 先来张...
  • yiban8084
  • yiban8084
  • 2017年07月08日 04:24
  • 601

Android拍照,选择图片,裁剪和上传服务器

类似于QQ设置头像,裁剪,然后上传服务端。我将自己在实际项目中的做过的此类功能顺便总结下,写了如下的demo,以供参考。 先看效果图: 其中第一个ImageView 是按照相册中的图片和8...
  • huang_xiao_yu
  • huang_xiao_yu
  • 2016年01月09日 18:13
  • 873

Android开发:相册读取、拍照、图片裁剪和图片上传服务器等功能的实现

修改日志 2016.05.12 之前的程序存在两个问题: 1)从相册选择的图片如果比较大,会失败; 2)无法拍照上传照片。 修改了这两个bug,之前的代码已经被覆盖掉了,留着太误人子弟了。...
  • chentravelling
  • chentravelling
  • 2016年05月03日 16:30
  • 11383

拍照上传图片与从相册中选择图片上传

手机拍照与上传图片是APP中很常用的功能。 我们先写个布局,然后代码实现。MediaStore.ACTION_IMAGE_CAPTURE); //调用相机 intent.putExtra(Media...
  • Meng_fengyang
  • Meng_fengyang
  • 2016年11月12日 11:55
  • 1987

android 拍照获取原图上传到服务器

最近做android拍照上传图片到服务器,遇到拍照后获取的图片被旋转的问题。 百度了一些资料,加上自己研究了一天终于得到解决。 1. 调用系统照相机 private originalImagePa...
  • LikeSidehu
  • LikeSidehu
  • 2016年10月24日 09:47
  • 1209

Android上传图片之调用系统拍照和从相册选择图片

现在几乎应用都会用到上传图片的功能,而要上传图片,首先得选择图片,本文不针对如何上传图片到服务器(每个项目与服务器交互的方式不同,因此不写上传图片到服务器相关代码),只是对选择图片做简单的介绍,没有涉...
  • dgs960825
  • dgs960825
  • 2016年04月06日 16:39
  • 15344
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android 拍照上传照片
举报原因:
原因补充:

(最多只允许输入30个字)