Java 相机未保存图像并删除异常

Java 相机未保存图像并删除异常,java,android,android-fragments,camera,fileoutputstream,Java,Android,Android Fragments,Camera,Fileoutputstream,我正在创建相机应用程序。我在断断续续地做那件事。我有FrameLayout,在这里我添加了相机,还有一个用于拍摄的按钮。有两个问题 相机不保存图像 当我第二次单击捕获图像时,会删除异常java.lang.RuntimeException:takePicture失败 我不知道哪里出了问题,我第一次用的是摄像头API 我只在纵向模式下使用的相机。在清单中,我添加了摄像头和写入外部存储的权限 我有一个类正在扩展SurfaceView。让我给你看看代码 public class ShowCamera e

我正在创建相机应用程序。我在断断续续地做那件事。我有
FrameLayout
,在这里我添加了相机,还有一个用于拍摄的按钮。有两个问题

  • 相机不保存图像

  • 当我第二次单击捕获图像时,会删除异常
    java.lang.RuntimeException:takePicture失败

  • 我不知道哪里出了问题,我第一次用的是摄像头API

    我只在纵向模式下使用的相机。在清单中,我添加了摄像头和写入外部存储的权限

    我有一个类正在扩展
    SurfaceView
    。让我给你看看代码

    public class ShowCamera extends SurfaceView implements SurfaceHolder.Callback{
    
    Camera camera;
    SurfaceHolder holder;
    
    public ShowCamera(Context context, Camera camera) {
        super(context);
        this.camera = camera;
        holder = getHolder();
        holder.addCallback(this);
    }
    
    @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {
        Camera.Parameters params = camera.getParameters();
    
        List<Camera.Size> sizes = params.getSupportedPictureSizes();
        Camera.Size mSize = null;
    
        for (Camera.Size size : sizes){
            mSize = size;
        }
    
        camera.setDisplayOrientation(90);
        params.setRotation(90);
    
        params.setPictureSize(mSize.width, mSize.height);
        camera.setParameters(params);
        try {
            camera.setPreviewDisplay(surfaceHolder);
            camera.startPreview();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
    
    }
    
    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        camera.stopPreview();
        camera.release();
    }
    }
    

    您是在模拟器中测试还是在真实设备中测试?在2个真实设备中测试。
    public class CameraActivity extends BaseFragment{
    View mainView;
    FrameLayout cameraLayout;
    Camera camera;
    ShowCamera showCamera;
    ImageButton captureImage;
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        mainView = inflater.inflate(R.layout.camera_fragment, container, false);
    
        cameraLayout = (FrameLayout) mainView.findViewById(R.id.cameraContainer);
        captureImage = (ImageButton) mainView.findViewById(R.id.imageButton);
    
        camera = Camera.open();
        showCamera = new ShowCamera(getActivity(), camera);
    
        cameraLayout.addView(showCamera);
    
        capture();
    
        return mainView;
    }
    
    Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
        @Override
        public void onPictureTaken(byte[] bytes, Camera camera) {
            if(bytes != null){
                Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
                if(bitmap != null){
                    File file = new File(String.valueOf(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)));
                    if(!file.isDirectory()){
                        file.mkdir();
                    }
    
                    file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM),
                            System.currentTimeMillis() + ".jpg");
    
                    try {
                        FileOutputStream fileOutputStream = new FileOutputStream(file);
                        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);
    
                        fileOutputStream.flush();
                        fileOutputStream.close();
    
                    } catch (Exception e){
                        e.printStackTrace();
                    }
                }
            }
        }
    };
    
    public void capture(){
        captureImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(camera != null){
                    camera.takePicture(null, null, mPictureCallback);
                }
            }
        });
    
    }
    }