Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android摄像头意图-内存不足错误和旋转错误_Android_Bitmap_Out Of Memory_Mediastore_Android Camera Intent - Fatal编程技术网

Android摄像头意图-内存不足错误和旋转错误

Android摄像头意图-内存不足错误和旋转错误,android,bitmap,out-of-memory,mediastore,android-camera-intent,Android,Bitmap,Out Of Memory,Mediastore,Android Camera Intent,我正在创建一个android应用程序,它利用摄像头拍照,然后根据用户输入将照片发送到服务器。我目前在照相机的意图上有一些问题。我的主要问题是: 获得一张与拍摄位置相比似乎是旋转的照片 当我试图修正这个旋转时,我得到了一个OutOfMemory错误 因此,我主要需要确保图片的方向不会改变,并且不会出现OutOfMemory错误 以下是使用相机拍摄照片的功能 private void dispatchTakePictureIntent(int actionCode) { Intent

我正在创建一个android应用程序,它利用摄像头拍照,然后根据用户输入将照片发送到服务器。我目前在照相机的意图上有一些问题。我的主要问题是:

  • 获得一张与拍摄位置相比似乎是旋转的照片

  • 当我试图修正这个旋转时,我得到了一个OutOfMemory错误

  • 因此,我主要需要确保图片的方向不会改变,并且不会出现OutOfMemory错误

    以下是使用相机拍摄照片的功能

    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()));
        }
    

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

    修复内存不足错误的方法是使用位图。工厂选项,这有一个选项,允许您将图像解码为缩放图像,这样它就不会占用太多内存。缺点是,生成的图像会稍微小一些。这是一个设置,你可以发挥和潜在的微调,使它到一个可接受的损失。此外,在创建第二个位图后,您还需要立即对第一个位图调用p.dispose()。请按照此链接查看示例: