调用Android相机拍照的问题

时间:2021-11-01 20:28:40

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()方法即可。