Failed to save hand image: Processing failed.
我尝试了很多尝试,但它们都没有奏效 如果有人能帮助我解决这个问题,我会很感激 谢谢
这是功能代码:
private fun captureAndSaveImage(context: Context, folderPath: String) {
if (isCameraInitialized) return
val cameraProviderFuture = ProcessCameraProvider.getInstance(context)
cameraProviderFuture.addListener({
val cameraProvider = cameraProviderFuture.get()
val preview = Preview.Builder().build()
val imageCapture = ImageCapture.Builder().build()
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
try {
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
context as androidx.lifecycle.LifecycleOwner,
cameraSelector,
preview,
imageCapture
)
isCameraInitialized = true
val photoFile = ContentValues().apply {
put(MediaStore.MediaColumns.DISPLAY_NAME, "Detected_Hand_Image.jpg")
put(MediaStore.MediaColumns.RELATIVE_PATH, folderPath)
put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg")
}
val resolver = context.contentResolver
val outputOptions = ImageCapture.OutputFileOptions.Builder(
resolver,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
photoFile
).build()
if (!cameraProvider.isBound(preview) || !cameraProvider.isBound(imageCapture)) {
Log.e("CameraX", "Camera is not ready or already closed.")
}
Handler(Looper.getMainLooper()).postDelayed({
imageCapture.takePicture(
outputOptions,
ContextCompat.getMainExecutor(context),
object : ImageCapture.OnImageSavedCallback {
override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults) {
Log.d("MediaStore", "Hand image saved successfully.")
}
override fun onError(exception: ImageCaptureException) {
Log.e("MediaStore", "Failed to save hand image: ${exception.message}")
}
}
)
}, 2000)
} catch (exc: Exception) {
Log.e("CameraX", "Failed to bind camera use cases", exc)
}
}, ContextCompat.getMainExecutor(context))
}
使用降级的相机依赖性版本:
def camerax_version = "1.2.2"
implementation "androidx.camera:camera-core:${camerax_version}"
implementation "androidx.camera:camera-camera2:${camerax_version}"
implementation "androidx.camera:camera-lifecycle:${camerax_version}"
implementation "androidx.camera:camera-video:${camerax_version}"
implementation "androidx.camera:camera-view:${camerax_version}"
implementation "androidx.camera:camera-extensions:${camerax_version}"
plapease从这三个功能中参考:private fun startCamera() {
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
// Used to bind the lifecycle of cameras to the lifecycle owner
val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()
// Preview
val preview = Preview.Builder()
.build()
.also {
it.setSurfaceProvider(binding.viewFinder.surfaceProvider)
}
imageCapture = ImageCapture.Builder()
.build()
// Select back camera as a default
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
try {
// Unbind use cases before rebinding
cameraProvider.unbindAll()
// Bind use cases to camera
cameraProvider.bindToLifecycle(
this, cameraSelector, preview, imageCapture)
} catch(exc: Exception) {
Log.e(WebUtils.TAG, "Use case binding failed", exc)
}
}, ContextCompat.getMainExecutor(this))
}
private fun getOutPutDirectory():File
{
val mediaDir=externalMediaDirs.firstOrNull()?.let {mFile->
File(mFile, resources.getString(R.string.app_name)).apply {
mkdirs()
}
}
return if(mediaDir!=null&& mediaDir.exists())
mediaDir else filesDir
}
private fun takePhoto() {
// Get a stable reference of the modifiable image capture use case
val imageCapture = imageCapture ?: return
val photofile=File(outputdirectory,SimpleDateFormat(WebUtils.FILE_NAME_FORMAt, Locale.getDefault())
.format(System.currentTimeMillis())+".jpg")
val outputOptions = ImageCapture.OutputFileOptions
.Builder(photofile)
.build()
imageCapture.takePicture(
outputOptions,
ContextCompat.getMainExecutor(this),
object : ImageCapture.OnImageSavedCallback {
override fun onError(exc: ImageCaptureException) {
Log.e(WebUtils.TAG, "Photo capture failed: ${exc.message}", exc)
}
override fun onImageSaved(output: ImageCapture.OutputFileResults){
val msg = "Photo capture succeeded: ${output.savedUri}"
val resultIntent = Intent()
resultIntent.putExtra("key", Uri.fromFile(photofile)) // Replace "key" and "your_result_data" with the actual data to send back
setResult(Activity.RESULT_OK, resultIntent);
finish()
}
}
)
}