带有cameraX的Mediastore不会覆盖保存的照片

问题描述 投票:0回答:1

我想要覆盖照片,但每张照片旁边都出现 (2)、(3) 等

我尝试设置永久保存位置,但没有成功。这是我用来捕获和保存照片的代码:

voidbindPreview(@NonNullProcessCameraProvidercameraProvider){ 预览预览 = new Preview.Builder().build(); CameraSelectorcameraSelector = new CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build(); ImageAnalysis imageAnalysis = new ImageAnalysis.Builder().build(); ImageCapture.Builder 构建器 = new ImageCapture.Builder();

    final ImageCapture imageCapture = builder.setTargetRotation(this.getWindowManager().getDefaultDisplay().getRotation()).build();

    preview.setSurfaceProvider(binding.cameraPreviewView.getSurfaceProvider());
    cameraProvider.bindToLifecycle((LifecycleOwner) this, lensFacing, preview, imageAnalysis, imageCapture);
    String relativePath = Environment.DIRECTORY_PICTURES + File.separator + "Photometer" + File.separator + "captured_image";
    // Create temporary file
    ContentValues contentValues = new ContentValues();
    contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, "captured_image");
    contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg");
    contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, relativePath);

    // Use ContentResolver to insert the image and get the content URI
    ContentResolver contentResolver = getContentResolver();
    imageUri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);

    if (buttonState == 1) {
        Timer my_timer = new Timer();
        my_timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                ImageCapture.OutputFileOptions outputFileOptions = new ImageCapture.OutputFileOptions.Builder(
                        contentResolver, imageUri, null
                ).build();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if (buttonState == 0) {
                            return;
                        }
                        try {
                            imageCapture.takePicture(outputFileOptions, executor, new ImageCapture.OnImageSavedCallback() {
                                @Override
                                public void onImageSaved(@NonNull ImageCapture.OutputFileResults outputFileResults) {
                                }

                                @Override
                                public void onError(@NonNull ImageCaptureException error) {
                                    error.printStackTrace();
                                }
                            });
                            FastAnalyzePhoto();
                            if (timerCancel == 1) {
                                cameraProvider.unbindAll();
                                my_timer.cancel();
                                binding.realtimeProgress.setVisibility(GONE);
                                startCamera();
                            }
                        } catch (Exception ex) {
                            ex.printStackTrace();
                        }
                    }
                });
            }
        }, 0, IMAGE_ANALYSE_REFRESH_DELAY_MS);
    }
}
android mediastore android-camerax
1个回答
0
投票

您仍在通过

contentResolver.insert
调用插入新图像。

要更新现有图像,请获取 OutputStream 并用它构建 OutputFileOptions:

ContentResolver contentResolver = getContentResolver();

try {
    // Open an OutputStream to write into the existing image's Uri
    OutputStream outputStream = contentResolver.openOutputStream(existingImageUri);
...
    
© www.soinside.com 2019 - 2024. All rights reserved.