OnImageSavedCallback 返回的 OutputFileResults 具有无效的 Uri
OutputFileResults returned by OnImageSavedCallback has an invalid Uri
我正在使用 CameraX 在我的 android 应用程序中拍照,保存它们然后从它们的路径显示它们。在之前的 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();
}
});
所以我终于用另一种方法(尤其是另一种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 将始终为空。
从 CameraX alpha 10 开始,ImageCapture 支持 3 种类型的保存位置:文件、MediaStore URI 和 OutputStream,具体取决于使用的 OutputFileOptions.Builder()
。
仅当 OutputFileOptions
是 MediaStore URI 类型时,OutputFileResults
中的 Uri
字段才会被填充。对于File
类型,调用者应该已经有保存位置,不需要return信息;对于 OutputStream 类型,CameraX 不知道保存位置。请参阅 JavaDoc:
public Uri getSavedUri ()
Returns the Uri of the saved file.
This field is only returned if the ImageCapture.OutputFileOptions is
backed by MediaStore constructed with #Builder(ContentResolver, Uri,
ContentValues).
有关更多信息,请查看 developer doc。
我正在使用 CameraX 在我的 android 应用程序中拍照,保存它们然后从它们的路径显示它们。在之前的 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();
}
});
所以我终于用另一种方法(尤其是另一种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 将始终为空。
从 CameraX alpha 10 开始,ImageCapture 支持 3 种类型的保存位置:文件、MediaStore URI 和 OutputStream,具体取决于使用的 OutputFileOptions.Builder()
。
仅当 OutputFileOptions
是 MediaStore URI 类型时,OutputFileResults
中的 Uri
字段才会被填充。对于File
类型,调用者应该已经有保存位置,不需要return信息;对于 OutputStream 类型,CameraX 不知道保存位置。请参阅 JavaDoc:
public Uri getSavedUri ()
Returns the Uri of the saved file.
This field is only returned if the ImageCapture.OutputFileOptions is backed by MediaStore constructed with #Builder(ContentResolver, Uri, ContentValues).
有关更多信息,请查看 developer doc。