我正在使用CameraX在我的android应用中拍照,保存它们,然后从它们的路径显示它们。在早期版本的alpha-09中,我可以使用onImageSaved(File file)来实现。但是对于alpha-10,我必须使用onImageSaved(OutputFileResults outputFileResults),然后从由outputFileResults检索的uri获取路径。但是我得到的乌里总是错的。例如,当我的图像保存在“ /external/images/media/1581680878237.jpg”时,我得到了uri的路径:“ / external / images / media / 113758”。

这是我的代码:

                ContentValues contentValues = new ContentValues();
                contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, "NEW_IMAGE");
                contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpg");

                ImageCapture.OutputFileOptions outputFileOptions = new ImageCapture.OutputFileOptions.Builder(
                        activity.getContentResolver(),
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                        contentValues).build();

                imageCapture.takePicture(outputFileOptions, Runnable::run, new ImageCapture.OnImageSavedCallback() {
                    @Override
                    public void onImageSaved(@NonNull ImageCapture.OutputFileResults outputFileResults) {
                        Uri uri = outputFileResults.getSavedUri();
                        if(uri != null){
                            System.out.println("URI PATH" + uri.getPath());
                            System.out.println("URI PATH" + uri.toString());
                            activity.runOnUiThread(cameraProvider::unbindAll);
                            galleryAddPic(uri);
                            Bundle params = new Bundle();
                            params.putString("FILE_PATH", uri.getPath());
                            Navigation.findNavController(root).navigate(R.id.navigation_edit_image, params);
                        }
                    }

                    @Override
                    public void onError(@NonNull ImageCaptureException exception) {
                        exception.printStackTrace();
                    }
                });

最佳答案

因此,我最终设法通过使用其他方法(尤其是另一个ImageCapture.OutputFileOptions.Builde)来保存ImageCapture拍摄的图像。我没有使用Uri对象保存图像,而是使用了File对象。

                File mImageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "YOUR_DIRECTORY");
                boolean isDirectoryCreated = mImageDir.exists() || mImageDir.mkdirs();
                if(isDirectoryCreated){
                    File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/YOUR_DIRECTORY", "YOUR_IMAGE.jpg");
                    ImageCapture.OutputFileOptions.Builder outputFileOptionsBuilder =
                            new ImageCapture.OutputFileOptions.Builder(file);
                    imageCapture.takePicture(outputFileOptionsBuilder.build(), Runnable::run, new ImageCapture.OnImageSavedCallback() {
                        @Override
                        public void onImageSaved(@NonNull ImageCapture.OutputFileResults outputFileResults) {
                            Bundle params = new Bundle();
                            params.putString("FILE_PATH", file.getPath());
                            Navigation.findNavController(root).navigate(R.id.navigation_edit_image, params);
                        }

                        @Override
                        public void onError(@NonNull ImageCaptureException exception) {
                            exception.printStackTrace();
                        }
                    });
                }


请注意,如果将此方法与outputFileResults.getSavedUri()一起使用,则uri始终为空。

08-05 20:28