首页 > 解决方案 > Android CameraX 返回成功但不保存图片

问题描述

我已经实现了 android camerax 但它没有正确捕获图像,回调返回成功但无法找到或查看图像。

我的实现:

private void startCamera(){
    final ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(this);
    cameraProviderFuture.addListener(new Runnable() {
        @Override
        public void run() {
            try {
                ProcessCameraProvider provider = cameraProviderFuture.get();
                bindPreview(provider);
            } catch (Exception e){
                e.printStackTrace();
            }
        }
    }, ContextCompat.getMainExecutor(this));
}

private void bindPreview(@NonNull ProcessCameraProvider cameraProvider){
    Preview preview = new Preview.Builder().build();
    CameraSelector selector = new CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_FRONT).build();
    ImageCapture.Builder builder = new ImageCapture.Builder();
    final ImageCapture imageCapture = builder.setTargetRotation(this.getWindowManager().getDefaultDisplay().getRotation()).build();
    preview.setSurfaceProvider(cameraView.createSurfaceProvider());
    cameraProvider.bindToLifecycle(this,selector,preview,imageCapture);
    btnCapture.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            selfieFile = new File(getFilesDir(),"attendance.jpg");
            OutputFileOptions outputFileOptions = new OutputFileOptions.Builder(selfieFile).build();
            imageCapture.takePicture(outputFileOptions, executor, new ImageCapture.OnImageSavedCallback() {
                @Override
                public void onImageSaved(@NonNull ImageCapture.OutputFileResults outputFileResults) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Glide.with(CameraActivity.this).load(outputFileResults.getSavedUri()).into(capturedImage);
                            //updateUI(false);
                        }
                    });
                }

                @Override
                public void onError(@NonNull ImageCaptureException exception) {

                }
            });
        }
    });
}

我尝试加载 Uri.fromFile() 并尝试获取 imageproxy 并转换为位图,但仍然存在这些问题。任何帮助将不胜感激...

标签: androidandroid-cameraandroid-camerax

解决方案


PerImageCapture.OutputFileResults.getSavedUri()的文档中,此方法仅在ImageCapture.OutputFileOptionsMediaStore 支持时返回一个值,即当您使用ImageCapture.OutputFileOptions.Builder(ContentResolver, Uri, ContentValues).

您正在使用ImageCapture.OutputFileOptions.Builder(File),这意味着您应该期望null在调用时收到ImageCapture.OutputFileResults.getSavedUri()

我对 Glide 不够熟悉,所以我不确定为什么使用加载图像Uri.fromFile()不起作用。您可以尝试直接在 ImageView 上设置图像,但看看您是否误用了 Glide:

capturedImage.setImageURI(Uri.fromFile(selfieFile))

推荐阅读