【发布时间】:2021-01-06 17:02:14
【问题描述】:
我正在关注这个代码实验室示例Link,了解如何在 Android 上使用 CameraX API,但是当我尝试捕获图像并将其保存到在主要活动的 Oncreate 方法中创建的外部媒体目录中时,我得到一个错误消息说:无法将捕获结果保存到指定位置
这里是创建目录的方法,在Oncreate方法中调用:
private fun getOutputDirectory(): File {
val mediaDir = externalMediaDirs.firstOrNull()?.let {
File(it, resources.getString(R.string.app_name)).apply { mkdirs() } }
return if (mediaDir != null && mediaDir.exists())
{ Log.i(TAG, mediaDir.path); mediaDir } else { filesDir }
}
根据我在Android文档中看到的externalMediaDirs在外部存储中创建了一个文件夹,虽然我的手机没有外部存储,但是在这个路径下成功创建了该文件夹:/storage/emulated/0/Android/media/com.example.camerax/cameraX
然后当点击拍照按钮时调用此方法:
private fun takePhoto() {
// Get a stable reference of the modifiable image capture use case
val imageCapture = imageCapture ?: return
// Create time-stamped output file to hold the image
val photoFile = File(
outputDirectory,
SimpleDateFormat(FILENAME_FORMAT, Locale.US
).format(System.currentTimeMillis()) + ".jpg")
// Create output options object which contains file + metadata
val outputOptions = ImageCapture.OutputFileOptions.Builder(photoFile).build()
// Set up image capture listener, which is triggered after photo has
// been taken
imageCapture.takePicture(
outputOptions,
ContextCompat.getMainExecutor(this),
object : ImageCapture.OnImageSavedCallback {
override fun onError(exc: ImageCaptureException) {
Log.e(TAG, "Photo capture failed: ${exc.message}", exc)
}
override fun onImageSaved(output: ImageCapture.OutputFileResults) {
val savedUri = Uri.fromFile(photoFile)
val msg = "Photo capture succeeded: $savedUri"
Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
Log.d(TAG, msg)
}
})
}
但是,当我单击按钮捕获并保存图像时,我收到以下错误消息: ImageCaptureException: "无法将捕获结果保存到指定位置"
我尝试了什么:
我尝试创建一个应用程序本地的文件夹并将图像保存在那里,效果很好,我使用了这个方法:
private fun takePhoto() {
.
.
.
folder: File = File(getFilesDir(), "testFolder");
if (!file.exists()) {
file.mkdir();
}
testImage = File(folder, "test.jpg");
val outputOptions = ImageCapture.OutputFileOptions.Builder(testImage).build()
.
.
.
.
.
.
我不确定可能是什么问题,感谢任何帮助。
更新: 显然问题是由于 CameraX API CameraX 1.0.0-beta09 以及相机扩展 1.0.0-alpha16 中的一个错误。当使用 CameraX 1.0.0-beta08 和相机扩展 1.0.0-alpha15 时,它工作正常。
【问题讨论】:
-
确保授予存储权限!
-
and although my phone doesn't have external storage,该路径在外部存储上。每个设备都有外部存储。可移动的micro sd卡与它无关。 -
`resources.getString(R.string.app_name) 我们怎么知道那是什么文件夹?请在stackoverflow帖子中填写真实姓名。
-
只在目录不存在时调用 mkdirs 并检查返回值。
-
@blackapps 好吧,我使用的是与 google codelabs 中完全相同的代码,这就是为什么我添加了一个日志来查看文件路径:
Log.i(TAG, mediaDir.path),我还在我的帖子中添加了路径名:@ 987654329@
标签: android kotlin android-camerax