Android相机意图 - 内存不足错误和旋转错误

时间:2012-11-02 22:01:27

标签: android bitmap out-of-memory mediastore android-camera-intent

我正在创建一个Android应用程序,利用相机拍照,然后根据用户输入将它们发送到服务器。我目前在相机意图方面遇到了一些问题。我的主要问题是:

  1. 获取与拍摄位置相比似乎旋转的照片。

  2. 当我尝试修复此轮播时,我得到一个OutOfMemoryError

  3. 所以主要是我需要确保图片的方向不会改变,并且我没有得到OutOfMemoryError。

    这是使用相机Intent拍摄照片的功能。

    private void dispatchTakePictureIntent(int actionCode) {
            Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            File f = new File(Environment.getExternalStorageDirectory(),"/ServerApp/test.jpg");
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
            startActivityForResult(takePictureIntent, actionCode);
        }
    

    此功能用于旋转图像并将其保存在该旋转处。

    private void getRotate() {
    
            String imagePath ="";
            int rotate = 0;
            File f = null;
            try {
                 f = new File(Environment.getExternalStorageDirectory(),"/ServerApp/test.jpg");
                 imagePath = f.getAbsolutePath();
                File imageFile = new File(imagePath);
                ExifInterface exif = new ExifInterface(
                        imageFile.getAbsolutePath());
                int orientation = exif.getAttributeInt(
                        ExifInterface.TAG_ORIENTATION,
                        ExifInterface.ORIENTATION_NORMAL);
    
                switch (orientation) {
                case ExifInterface.ORIENTATION_ROTATE_270:
                    rotate = 270;
                    break;
                case ExifInterface.ORIENTATION_ROTATE_180:
                    rotate = 180;
                    break;
                case ExifInterface.ORIENTATION_ROTATE_90:
                    rotate = 90;
                    break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            Bitmap p = BitmapFactory.decodeFile(imagePath);
    
            Matrix m = new Matrix();
            m.setRotate(rotate);
            Bitmap _bitmapScaled = Bitmap.createBitmap(p, 0, 0, p.getWidth()/2,p.getHeight(), m, false);
            f.delete();
    
    
    
            ByteArrayOutputStream bytes = new ByteArrayOutputStream();
            _bitmapScaled.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
    
    
    
    
    
            //you can create a new file name "test.jpg" in sdcard folder.
            File f1 = new File(Environment.getExternalStorageDirectory()
                                    + File.separator + "test.jpg");
            try {
                f1.createNewFile();
                FileOutputStream fo = new FileOutputStream(f1);
                fo.write(bytes.toByteArray());
    
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //write the bytes in file
    
        }
    

    最后,这是我的onActivityResult方法:

    protected void onActivityResult(int requestCode, int resultCode, Intent data){
            getRotate();
            File f = new File(Environment.getExternalStorageDirectory(),"/ServerApp/test.jpg");
            mImageView.setImageBitmap(BitmapFactory.decodeFile(f.getAbsolutePath()));
        }
    

    我一直试图解决这个问题很长一段时间,如果我能得到一些帮助,我将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:5)

修复内存不足错误的一种方法是使用Bitmap.Factory Options,它有一个选项,允许你将图像解码为缩放图像,这样就不会使用相当多的内存,缺点是对此,结果图像会稍微小些。它是一个你可以玩的设置,可能会微调,以使其达到可接受的损失。此外,您还需要在创建第二个位图后立即在第一个位图上调用p.dispose()。请点击此链接获取示例:http://tutorials-android.blogspot.co.il/2011/11/outofmemory-exception-when-decoding.html