首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >由OutputFileResults返回的OnImageSavedCallback具有无效的Uri

由OutputFileResults返回的OnImageSavedCallback具有无效的Uri
EN

Stack Overflow用户
提问于 2020-02-14 11:51:52
回答 2查看 3.9K关注 0票数 8

我正在使用CameraX API在我的安卓应用程序中拍摄照片,保存它们,然后从它们的路径上显示它们。有了上一个版本的alpha-09,我就能够用onImageSaved(File file)做到这一点。但是,对于alpha-10,我必须使用onImageSaved(OutputFileResults outputFileResults),然后从由outputFileResults检索的uri获取路径。但是我得到的Uri总是错误的。例如,当我的图像保存在:"/external/images/media/1581680878237.jpg"时,我得到uri的路径:"/external/images/media/113758"

这是我的代码:

代码语言:javascript
复制
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();
                        }
                    });
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-16 20:15:33

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

代码语言:javascript
复制
                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。

票数 8
EN

Stack Overflow用户

发布于 2020-03-08 01:38:17

从CameraX alpha 10开始,ImageCapture支持3种类型的保存位置:文件、MediaStore URI和OutputStream,这取决于使用的是哪种OutputFileOptions.Builder()

只有当Uri是MediaStore URI类型时,才会填充OutputFileResults中的MediaStore字段。对于File类型,调用方应该已经拥有保存位置,不需要返回信息;对于OutputStream类型,CameraX不知道保存位置。请参阅JavaDoc:

公共Uri getSavedUri () 返回保存文件的Uri。 只有在ImageCapture.OutputFileOptions由#Builder(ContentResolver、Uri、ContentValues)构造的MediaStore支持时,才返回此字段。

有关更多信息,请查看开发者文档

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60225806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档