我正在使用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"。
这是我的代码:
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();
}
});发布于 2020-02-16 20:15:33
因此,我最终通过使用另一种方法(特别是其他的ImageCapture )来保存由ImageCapture.OutputFileOptions.Builde拍摄的图像。我没有使用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。
发布于 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支持时,才返回此字段。
有关更多信息,请查看开发者文档。
https://stackoverflow.com/questions/60225806
复制相似问题