Android调用系统相机拍照像素太低以及内存溢出问题

来源:互联网 发布:淘宝首页模板制作 编辑:程序博客网 时间:2024/05/03 06:33

在Android移动开发过程中,如果直接按照原生方式进行拍照经常会出现像素太低(可能只有几十KB),照片非常模糊的问题。
Activity中启动相机的代码:

Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForResult(openCameraIntent, RESUEST_PHOTO);

在返回结果的onActivityResult中直接通过Bitmap bm = (Bitmap) data.getExtras().get(“data”)获取相片:

protected void onActivityResult(int requestCode, int resultCode, Intent data){    super.onActivityResult(requestCode, resultCode, data);    if (requestCode==RESUEST_PHOTO ) {    switch (requestCode) {        case RESUEST_PHOTO:         if (resultCode == RESULT_OK) {             String fileName = String.valueOf(System.currentTimeMillis());            Bitmap bm = (Bitmap) data.getExtras().get("data");                                  break;                          default:            break;                }            }        }

对于这个问题,有一种解决方式是按照xcymorningsun的方法,先将拍得的照片临时保存在本地,在onActivityResult方法中再将图片取出,并经过缩小处理再显示在界面上或将原图上传给服务器。
这种方法对于单张相片有比较好的效果,但对于多张相片则会报出OutOfMemory异常问题。关于OutOfMemory异常问题,cctcc的博客有过比较详细的介绍,有三个需要注意的地方:第一,加载缩略图的时候不要直接使用原始图片;第二,图片使用后要通过recycle()进行资源回收。
回到最初的问题,如果我们想要像微信朋友圈一样连续拍摄多张图片并进行展示的话,应该怎么做呢?
一种解决思路是拍照的时候就将照片保存在本地,并且留出相片的保存地址。之后要展示缩略图或者上传原图就直接调用该地址,此时用到的方法就和在相册中选取相片的方法一样了。具体代码如下。
现定义照片存放的路径:

private String path = "";

启动相机:

Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);        File file = new File(Environment.getExternalStorageDirectory()                + "/myimage/", String.valueOf(System.currentTimeMillis())                + ".jpg");        path = file.getPath();        Uri imageUri = Uri.fromFile(file);        openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);        startActivityForResult(openCameraIntent, TAKE_PICTURE);

最后在onActivityResult中将照片路径添加到照片路径集中即可。

protected void onActivityResult(int requestCode, int resultCode, Intent data) {        switch (requestCode) {        case TAKE_PICTURE:            if (Bimp.drr.size() < 9 && resultCode == -1) {                Bimp.drr.add(path);            }            break;        }    }

其中Bimp.drr是ArrayList类型变量。有了照片路径,之后想要对照片进行什么操作就很容易了。照片使用完后如果不再需要的话记得将其删除。

0 2