前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android 拍照功能的开发 原

Android 拍照功能的开发 原

作者头像
LeoXu
发布2018-08-15 14:30:22
8880
发布2018-08-15 14:30:22
举报
文章被收录于专栏:LeoXu的博客LeoXu的博客

最近在Android上做了拍照功能的开发。

业务场景是:点击界面(HTML5)上的拍照按钮会调用拍照的JS API,获取其返回照片文件的存储路径、扩展名以及照片文件的Base64字符串,然后在界面上显示图片。

开发时一些要点记录如下:

1、关于存储:虽然现在大部分手机的存储都是有的,安全起见,需要判断一下存储的状态。

代码语言:javascript
复制
  1. String SDState = Environment.getExternalStorageState();
  2. if (SDState.equals(Environment.MEDIA_MOUNTED)) {
  3. //TODO...
  4. } else {
  5. error("该终端没有存储设备,不能使用拍照功能...");
  6. }

2、如何将拍摄到的照片保存到存储中,而不只是生成一份缩略图数据返回。

需要在Intent中预先指定照片文件的存储Uri。

代码语言:javascript
复制
  1. private static final int ACTION_TAKE_PHOTO = 1;
  2. private Uri photoUri;
  3. /***
  4. * 需要说明一下,以下操作使用照相机拍照,拍照后的图片会存放在相册中的
  5. * 这里使用的这种方式有一个好处就是获取的图片是拍照后的原图
  6. * 如果不实用ContentValues存放照片路径的话,拍照后获取的图片为缩略图不清晰
  7. */
  8. ContentValues values = new ContentValues();
  9. photoUri = this.context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
  10. Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  11. intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, photoUri);
  12. startActivityForResult(intent, ACTION_TAKE_PHOTO);

3、如何获取图片的存储路径,以字符串的形式返回:

代码语言:javascript
复制
  1. private Uri photoUri;
  2. private String photoPath;
  3. String[] pojo = {MediaStore.Images.Media.DATA};
  4. cursor = this.context.managedQuery(photoUri, pojo, null, null,null);
  5. if (null != cursor) {
  6. int columnIndex = cursor.getColumnIndexOrThrow(pojo[0]);
  7. cursor.moveToFirst();
  8. photoPath = cursor.getString(columnIndex);
  9. }

路径获取到了,扩展名当然不在话下了。

4、如何从Uri获取到图片的Bitmap对象:

代码语言:javascript
复制
  1. private Uri photoUri;
  2. byte[] photoContent = readStream(this.context.getContentResolver().openInputStream(Uri.parse(photoUri.toString())));
  3. Bitmap photoBitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

5、如何对Bitmap进行压缩,例如压缩到原有大小的四分之一:

代码语言:javascript
复制
  1. /**
  2. * 缩小返回图片的尺寸
  3. * @param bitmap
  4. * @return
  5. */
  6. private Bitmap resizeBitmap(Bitmap bitmap) {
  7. Bitmap bitmapOrigin = bitmap;
  8. int widthOrigin = bitmapOrigin.getWidth();
  9. int heightOrigin = bitmapOrigin.getHeight();
  10. Matrix matrix = new Matrix();
  11. matrix.postScale(0.25f, 0.25f);
  12. Bitmap bitmapResized = Bitmap.createBitmap(bitmapOrigin, 0, 0, widthOrigin, heightOrigin, matrix, true);
  13. return bitmapResized;
  14. }

6、如何将Bitmap转为Base64字符串:

代码语言:javascript
复制
  1. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  2. bitmapResized.compress(Bitmap.CompressFormat.JPEG, 100, baos);
  3. byte[] data = baos.toByteArray();
  4. baos.close();
  5. return new String(Base64.encodeBase64(data), "utf-8");

7、如何在HTML页面上显示Base64数据格式的图片:

首先界面上要有一个img标记,src属性置为空。

代码语言:javascript
复制
  1. <img src="" id="resultImage" name="resultImage" title="结果图片"/>

然后用js将获取到Base64图片数据放置到img标记的src属性中。

代码语言:javascript
复制
  1. var extension = ...;//图片扩展名
  2. var base64 = ...;//Base64数据
  3. $("#resultImage").attr("src", "data:image/" + extension + ";base64," + base64.toString());

欢迎指正。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016/08/16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档