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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

查看: 1991|回复: 0

android 拍照上传照片

[复制链接]
发表于 2013-5-2 16:56:37 | 显示全部楼层 |阅读模式
废话不多说,直接进入主题,想要在android中实现拍照最简单饿方法就是New 一个 Intent 设置Action为android.media.action.IMAGE_CAPTURE 然后使用startActivityForResult(intent,REQUEST_CODE)方法进入相机。当然还有很多方式可以实现,大家可以在网上查找。但是要注意的是在进入相机前最好判断下sdcard是否可用,代码如下:
  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的想象,解决办法就是做一个判断,当一种方式不能获取,就是用另一种方式,下面是分别获取相片的两种方式:
  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的格式放入输出流中,然后大家应该明白怎么操作了吧,下面是实例代码:

  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实现文件上传具体代码如下:
  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.                                 entity.addPart(entry.getKey(), new StringBody(entry.getValue()));
  18.                         }
  19.                 }
  20.                 // 添加文件参数
  21.                 if (file != null && file.exists()) {
  22.                         entity.addPart("file", new FileBody(file));
  23.                 }
  24.                 post.setEntity(entity);
  25.                 HttpResponse response = httpClient.execute(post);
  26.                 int stateCode = response.getStatusLine().getStatusCode();
  27.                 StringBuffer sb = new StringBuffer();
  28.                 if (stateCode == HttpStatus.SC_OK) {
  29.                         HttpEntity result = response.getEntity();
  30.                         if (result != null) {
  31.                                 InputStream is = result.getContent();
  32.                                 BufferedReader br = new BufferedReader(
  33.                                                 new InputStreamReader(is));
  34.                                 String tempLine;
  35.                                 while ((tempLine = br.readLine()) != null) {
  36.                                         sb.append(tempLine);
  37.                                 }
  38.                         }
  39.                 }
  40.                 post.abort();
  41.                 return sb.toString();
  42.         }
复制代码
这里就基本上对图片上传就差不多了,但是还有一个问题就是图片上传完以后bitmap还在内存中,而且大家都知道如果,高清的图片比较大,而手机内存本来就有限,如果不进行处理很容易报内存溢出,所以我们应该把处理完的bitmap从内存中释放掉,这时候就需要调用bitmap的recycle();方法,调用这个方法的时候需要注意不能太早也不能太晚,不然会报异常,一般可以放在下一张图片生成前或者没有任何view引用要销毁的图片的时候下面是实例代码:
  1. /**
  2.          * 销毁图片文件
  3.          */
  4.         private void destoryBimap() {
  5.                 if (photo != null && !photo.isRecycled()) {
  6.                         photo.recycle();
  7.                         photo = null;
  8.                 }
  9.         }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-6-17 02:19

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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