【问题标题】:The image uri didn't update after I first call the camera in my app我第一次在我的应用程序中调用相机后,图像 uri 没有更新
【发布时间】:2018-08-07 03:13:16
【问题描述】:

当我在拍摄照片后想要获取图像 uri 时,它总是什么也没有,但是在我再次拍摄后,它返回第一个,而不是当前的。似乎它总是在最新的之前得到一个。以下是我的相机预览代码:

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
    private static final String TAG = "CameraPreview";
    private SurfaceHolder mHolder;
    private Camera mCamera;

    public static final int MEDIA_TYPE_IMAGE = 1;
    private Uri outputMediaFileUri;
    private String outputMediaFileType;
    public File pic;
    public Uri uri;


    public CameraPreview(Context context) {
        super(context);
        mHolder = getHolder();
        mHolder.addCallback(this);
    }

    private static Camera getCameraInstance() {
        Camera c = null;
        try {
            c = Camera.open();
        } catch (Exception e) {
            Log.d(TAG, "camera is not available");
        }
        return c;
    }

    public void surfaceCreated(SurfaceHolder holder) {
        mCamera = getCameraInstance();
        try {
            mCamera.setPreviewDisplay(holder);
            mCamera.startPreview();
        } catch (IOException e) {
            Log.d(TAG, "Error setting camera preview: " + e.getMessage());
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        mHolder.removeCallback(this);
        mCamera.setPreviewCallback(null);
        mCamera.stopPreview();
        mCamera.release();
        mCamera = null;
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        int rotation = getDisplayOrientation();
        mCamera.setDisplayOrientation(90);
    }




    private File getOutputMediaFile(int type) {
        File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES), TAG);
        if (!mediaStorageDir.exists()) {
            if (!mediaStorageDir.mkdirs()) {
                Log.d(TAG, "failed to create directory");
                return null;
            }
        }
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        File mediaFile;
        if (type == MEDIA_TYPE_IMAGE) {
            mediaFile = new File(mediaStorageDir.getPath() + File.separator +
                    "prescription" + ".jpg");
            outputMediaFileType = "image/*";
        } else {
            return null;
        }
        outputMediaFileUri = Uri.fromFile(mediaFile);
        return mediaFile;
    }

    public Uri getOutputMediaFileUri() {
        return outputMediaFileUri;
    }

    public String getOutputMediaFileType() {
        return outputMediaFileType;
    }


    public void takePicture() {
        mCamera.takePicture(null, null, new Camera.PictureCallback() {
            @Override
            public void onPictureTaken(byte[] data, Camera camera) {
                File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
                Log.i("camera", "file done");
                if (pictureFile == null) {
                    Log.d(TAG, "Error creating media file, check storage permissions");
                    return;
                }
                try {
                    Log.i("camera", "do outputstream");
                    FileOutputStream fos = new FileOutputStream(pictureFile);
                    Log.i("camera", "after outputstream");
                    s = getOutputMediaFileUri().toString();
                    fos.write(data);
                    fos.close();



                } catch (FileNotFoundException e) {
                    Log.d(TAG, "File not found: " + e.getMessage());
                } catch (IOException e) {
                    Log.d(TAG, "Error accessing file: " + e.getMessage());
                }
            }
        });

    }



    public int getDisplayOrientation() {
        Display display = ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
        int rotation = display.getRotation();
        int degrees = 0;
        switch (rotation) {
            case Surface.ROTATION_0:
                degrees = 0;
                break;
            case Surface.ROTATION_90:
                degrees = 90;
                break;
            case Surface.ROTATION_180:
                degrees = 180;
                break;
            case Surface.ROTATION_270:
                degrees = 270;
                break;
        }

        android.hardware.Camera.CameraInfo camInfo =
                new android.hardware.Camera.CameraInfo();
        android.hardware.Camera.getCameraInfo(Camera.CameraInfo.CAMERA_FACING_BACK, camInfo);

        int result = (camInfo.orientation - degrees + 360) % 360;
        return result;
    }

}

调用 camerapreview.takepicture() 后,我尝试调用 camerapreview.outputMediaFileUri.toString(),但它不起作用。有人可以帮我吗?

更新: 我发现在主要活动中,mPreview.takePicture() 总是在所有程序结束时运行:

Button buttonCapturePhoto = (Button) findViewById(R.id.button_capture_photo);

        buttonCapturePhoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mPreview.takePicture();
                path = mPreview.geturi;
                goToFourthActivity(path);
             }
            }
        });

每次,“路径”都会先读取图像uri,然后执行mPreview.takePicture()。所以总是以前的uri,不知道为什么,怎么解决?

【问题讨论】:

    标签: java android camera uri photo


    【解决方案1】:

    你的代码

    mediaFile = new File(mediaStorageDir.getPath() + File.separator +
                    "prescription" + ".jpg");
    

    无条件地重复使用相同的文件名。难怪你会得到相同的 URI。

    【讨论】:

    • 我认为这不是问题,我已经更新了一些导致问题的东西。
    • 当然,更新的代码不好。它做什么,它开始捕获,并设置路径。相机将在很久以后调用 onPictureTaken()。但是,您可能不想重复使用相同的固定文件名。
    • 那么如果我想获取更新后的uri,我应该怎么做呢?既然你说 onPictureTaken() 会在很久以后运行,我该如何解决?感谢您提醒我重复的文件名。
    • 您可能应该在 onPictureTaken() 回调中 goToFourthActivity(path)
    猜你喜欢
    • 2017-03-24
    • 2021-02-08
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    相关资源
    最近更新 更多