调用Android相机拍照的问题

来源:互联网 发布:win10有网络不能上网 编辑:程序博客网 时间:2024/04/20 03:27

Activity中通过如下代码可以启动相机,然后再重写的onActivityResult方法中可以获取到返回的照片数据: 

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


假设照片大小在2M左右。在Android系统中bitmap占用4个字节,3200*2400*4=?,结果大家自己算算,如果为了一张图片,耗用这么大的内存,肯定是不合理的,并且,官方文档中有说明,Android系统分配给每个应用的最大内存是16M。

所以,系统为了防止应用内存占用过大,对于在应用内通过相机拍摄的图片最终返回来的结果进行了压缩,压缩后的图片变得很小,通过之前说的getData的方式只能满足比如显示个头像这样的需求。在onActivityResult方法里通过Intent的getData方法获取的数据转换成bitmap并显示在界面上,有时候会有取不到数据,或者显示的bitmap会非常小,如果将bitmap保存到sd卡后会发现,图片的分辨率很低,并且图片大小也是经过压缩的,不管将相机的像素设置多高,最后通过这种方式返回的bitmap总是经过压缩了的。如果想获得理想的照片大小和分辨率改如何处理呢?

解决方法:

1.拍照时,将拍得的照片先保存在本地,通过修改之前的代码如下:


Uri imageUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),"image.jpg"))

 

//指定照片保存路径(SD卡),image.jpg为一个临时文件,每次拍照后这个图片都会被替换 

openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);


如何调取相机拍照,代码如下: 

/**拍照获取相片**/    private void doTakePhoto() {        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //调用系统相机                                            Uri imageUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),"image.jpg"));        //指定照片保存路径(SD卡),image.jpg为一个临时文件,每次拍照后这个图片都会被替换        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);                                            //直接使用,没有缩小        startActivityForResult(intent, PHOTO_WITH_CAMERA);  //用户点击了从相机获取    }

 

在onActivityResult方法中再将图片取出,并经过缩小处理再显示在界面上或上传给服务器(压缩比例自定义)

@Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        if (resultCode == RESULT_OK) {            switch (requestCode) {            case TAKE_PICTURE:                //将保存在本地的图片取出并缩小后显示在界面上    Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"/image.jpg");  Bitmap newBitmap = zoomBitmap(bitmap, bitmap.getWidth() / SCALE, bitmap.getHeight() / SCALE);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      //由于Bitmap内存占用较大,这里需要回收内存,否则会报out of memory异常                bitmap.recycle();                //将处理过的图片显示在界面上,并保存到本地                iv_image.setImageBitmap(newBitmap);                savePhotoToSDCard(newBitmap, Environment.getExternalStorageDirectory().getAbsolutePath(), String.valueOf(System.currentTimeMillis()));                break;            default:                break;            }        }    }

由于Androidbitmap分配的内存最大不超过8M,所以对使用完的较大的Bitmap要释放内存,调用其recycle()方法即可。



1 0
原创粉丝点击