【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 2170|回复: 0

*转*android 拍照上传照片(新)

[复制链接]
发表于 2013-5-2 16:59:48 | 显示全部楼层 |阅读模式

前段时间写过一片关于照片上传的文章,但是后来发现用那种方式上传的图片是经过android系统处理过的,并不是原图,也就是说经过压缩过的,图片会变得很小,今天我就是为了解决这个问题用另外一种方式实现。

        首先当我们要得到原有的照片必须为拍照后的照片指定存放的路径地址,这个地址是在Intent中指定,方法是intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));

其中file就是手机本地的对应的输出文件,这个需要在传入参数前就生成,不然会报FileNotFoundException,下面是源码:

  1.                                 destoryBimap();
  2.                                 String state = Environment.getExternalStorageState();
  3.                                 if (state.equals(Environment.MEDIA_MOUNTED)) {
  4.                                         String saveDir = Environment.getExternalStorageDirectory()
  5.                                                         + "/temple";
  6.                                         File dir = new File(saveDir);
  7.                                         if (!dir.exists()) {
  8.                                                 dir.mkdir();
  9.                                         }
  10.                                         file = new File(saveDir, "temp.jpg");
  11.                                         file.delete();
  12.                                         if (!file.exists()) {
  13.                                                 try {
  14.                                                         file.createNewFile();
  15.                                                 } catch (IOException e) {
  16.                                                         e.printStackTrace();
  17.                                                         Toast.makeText(ReportSurveyPointActivity.this,
  18.                                                                         R.string.photo_file_isnull,
  19.                                                                         Toast.LENGTH_LONG).show();
  20.                                                         return;
  21.                                                 }
  22.                                         }
  23.                                         Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  24.                                         intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
  25.                                         startActivityForResult(intent, REQUEST_CODE);
  26.                                 } else {
  27.                                         Toast.makeText(ReportSurveyPointActivity.this,
  28.                                                         R.string.common_msg_nosdcard, Toast.LENGTH_LONG)
  29.                                                         .show();
  30.                                 }
复制代码

其中destoryBimap()这个方法已经在上一篇文章中介绍过了,是为了把照片从手机内存中清楚调,不然黑容易报内存溢出异常,毕竟原图片比较大。下面就是判断手机是否装载SDCard,接下来在SDCard上生成我们照片保存的地址。

        那么接下来就是在onActivityResult()方法中加载我们的照片,这下加载照片就非常简单了,因为在拍照前我们已经给除了照片的路径,我们根据这个路径把照片加载进来就行了,下面是源码:

  1. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  2.                 super.onActivityResult(requestCode, resultCode, data);
  3.                 if (requestCode == REQUEST_CODE) {
  4.                         if (resultCode != RESULT_OK) {
  5.                                 return;
  6.                         }
  7.                         if (file != null && file.exists()) {
  8.                                 BitmapFactory.Options options = new BitmapFactory.Options();
  9.                                 options.inSampleSize = 2;
  10.                                 photo = BitmapFactory.decodeFile(file.getPath(), options);
  11.                                 photo_image.setBackgroundDrawable(new BitmapDrawable(photo));
  12.                                 pictureDir = file.getPath();
  13.                         } else {
  14.                                 Toast.makeText(this, R.string.photo_file_isnull,
  15.                                                 Toast.LENGTH_LONG).show();
  16.                         }
  17.                 }
  18.         }
复制代码

这里需要说明一下的就是,当我们要在程序预览照片的时候由于照片比较大,考虑到内存问题,所以我们要把照片进行压缩再放到控件里面,压缩照片的方法就是用BitmapFactory.Options类的inSampleSize这个属性,这个属性的意思说在原照片的大小的多少比例来展示相片,也就是个百分比。我这里是设置的2,也就是说原照片的一般的大小展示。

下面是销毁照片的方法:

  1. /**
  2.          * 销毁图片文件
  3.          */
  4.         private void destoryBimap() {
  5.                 if (photo != null && !photo.isRecycled()) {
  6.                         photo.recycle();
  7.                         photo = null;
  8.                 }
  9.         }
复制代码

这个方法我是在每次拍照前和onDestroy()方法中都调用了的,都是处于内存考虑,如果你是dialog的话还建议在dimisslistener中调。

至于大家经常问道的上传照片到后台的方法我也顺便说下,我是用的HttpClient实现的很简单,而后台就是随便什么框架都行,下面是上传照片的方法实现:

  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.                 MultipartEntity entity = new MultipartEntity();
  15.                 if (param != null && !param.isEmpty()) {
  16.                         for (Map.Entry<String, String> entry : param.entrySet()) {
  17.                                 if (entry.getValue() != null
  18.                                                 && entry.getValue().trim().length() > 0) {
  19.                                         entity.addPart(entry.getKey(),
  20.                                                         new StringBody(entry.getValue()));
  21.                                 }
  22.                         }
  23.                 }
  24.                 // 添加文件参数
  25.                 if (file != null && file.exists()) {
  26.                         entity.addPart("file", new FileBody(file));
  27.                 }
  28.                 post.setEntity(entity);
  29.                 HttpResponse response = httpClient.execute(post);
  30.                 int stateCode = response.getStatusLine().getStatusCode();
  31.                 StringBuffer sb = new StringBuffer();
  32.                 if (stateCode == HttpStatus.SC_OK) {
  33.                         HttpEntity result = response.getEntity();
  34.                         if (result != null) {
  35.                                 InputStream is = result.getContent();
  36.                                 BufferedReader br = new BufferedReader(
  37.                                                 new InputStreamReader(is));
  38.                                 String tempLine;
  39.                                 while ((tempLine = br.readLine()) != null) {
  40.                                         sb.append(tempLine);
  41.                                 }
  42.                         }
  43.                 }
  44.                 post.abort();
  45.                 return sb.toString();
  46.         }
复制代码
源码下载:http://download.csdn.net/detail/yaoyeyzq/4878649
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2024-6-17 00:25

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表