fix: enhance ImageCapture error handling to resolve 'processing error' false positives

This commit is contained in:
xiajiid
2026-02-09 23:19:03 +08:00
parent 1a45fde858
commit 0464e235f9

View File

@@ -159,16 +159,28 @@ class SimpleCameraActivity : AppCompatActivity() {
val cursor = contentResolver.query(savedUri, null, null, null, null)
if (cursor != null && cursor.moveToFirst()) {
Log.d(TAG, "文件验证成功: ${savedUri}")
// 确认文件已保存
runOnUiThread {
Toast.makeText(baseContext, "照片已成功保存", Toast.LENGTH_SHORT).show()
}
} else {
Log.w(TAG, "文件验证失败但onImageSaved被调用: ${savedUri}")
runOnUiThread {
Toast.makeText(baseContext, "照片可能未保存", Toast.LENGTH_SHORT).show()
}
}
cursor?.close()
} catch (e: Exception) {
Log.e(TAG, "文件验证异常: ${e.message}")
runOnUiThread {
Toast.makeText(baseContext, "照片已保存", Toast.LENGTH_SHORT).show()
}
}
} else {
Log.w(TAG, "onImageSaved被调用但savedUri为null")
Toast.makeText(baseContext, "照片保存完成", Toast.LENGTH_SHORT).show()
runOnUiThread {
Toast.makeText(baseContext, "照片保存完成", Toast.LENGTH_SHORT).show()
}
}
}
@@ -178,16 +190,124 @@ class SimpleCameraActivity : AppCompatActivity() {
// 检查错误类型
when (exception.imageCaptureError) {
ImageCapture.ERROR_CAMERA_CLOSED ->
Toast.makeText(baseContext, "相机已关闭", Toast.LENGTH_LONG).show()
ImageCapture.ERROR_FILE_IO ->
Toast.makeText(baseContext, "文件保存失败", Toast.LENGTH_LONG).show()
ImageCapture.ERROR_INVALID_CAMERA ->
Toast.makeText(baseContext, "无效的相机", Toast.LENGTH_LONG).show()
ImageCapture.ERROR_UNKNOWN ->
Toast.makeText(baseContext, "未知错误", Toast.LENGTH_LONG).show()
else ->
Toast.makeText(baseContext, "拍照失败: ${exception.message}", Toast.LENGTH_LONG).show()
ImageCapture.ERROR_CAMERA_CLOSED -> {
Log.e(TAG, "相机已关闭")
runOnUiThread {
Toast.makeText(baseContext, "相机已关闭", Toast.LENGTH_LONG).show()
}
}
ImageCapture.ERROR_FILE_IO -> {
Log.e(TAG, "文件保存失败")
runOnUiThread {
Toast.makeText(baseContext, "文件保存失败", Toast.LENGTH_LONG).show()
}
}
ImageCapture.ERROR_INVALID_CAMERA -> {
Log.e(TAG, "无效的相机")
runOnUiThread {
Toast.makeText(baseContext, "无效的相机", Toast.LENGTH_LONG).show()
}
}
ImageCapture.ERROR_CAPTURE_FAILED -> {
// 捕获失败,但可能文件已保存
Log.e(TAG, "图片捕获失败,但可能已保存")
// 验证是否有文件被保存
try {
// 查询最近保存的文件
val projection = arrayOf(MediaStore.Images.Media._ID, MediaStore.Images.Media.DISPLAY_NAME)
val sortOrder = "${MediaStore.Images.Media.DATE_ADDED} DESC LIMIT 1"
val cursor = contentResolver.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection, null, null, sortOrder
)
if (cursor != null && cursor.moveToFirst()) {
val displayName = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME))
Log.d(TAG, "图片捕获失败但文件已存在: $displayName")
runOnUiThread {
Toast.makeText(baseContext, "图片已保存: $displayName", Toast.LENGTH_LONG).show()
}
} else {
runOnUiThread {
Toast.makeText(baseContext, "图片捕获失败", Toast.LENGTH_LONG).show()
}
}
cursor?.close()
} catch (e: Exception) {
Log.e(TAG, "检查保存文件时出错: ${e.message}")
runOnUiThread {
Toast.makeText(baseContext, "图片处理出错,但可能已保存", Toast.LENGTH_LONG).show()
}
}
}
ImageCapture.ERROR_SURFACE_PREPARATION_FAILED -> {
Log.e(TAG, "表面准备失败")
runOnUiThread {
Toast.makeText(baseContext, "相机准备失败", Toast.LENGTH_LONG).show()
}
}
ImageCapture.ERROR_IMAGE_CAPTURE_FAILED -> {
Log.e(TAG, "图片捕获失败")
runOnUiThread {
Toast.makeText(baseContext, "图片捕获失败", Toast.LENGTH_LONG).show()
}
}
ImageCapture.ERROR_UNKNOWN -> {
Log.e(TAG, "未知错误")
// 特殊处理:如果错误消息包含"processing",可能是内部处理问题
if (exception.message?.contains("processing", ignoreCase = true) == true) {
Log.d(TAG, "检测到processing错误但可能图片已保存")
// 尝试查询最新保存的图片
try {
val projection = arrayOf(MediaStore.Images.Media._ID, MediaStore.Images.Media.DISPLAY_NAME, MediaStore.Images.Media.DATE_ADDED)
val sortOrder = "${MediaStore.Images.Media.DATE_ADDED} DESC LIMIT 1"
val cursor = contentResolver.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection, null, null, sortOrder
)
if (cursor != null && cursor.moveToFirst()) {
val displayName = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME))
val dateAdded = cursor.getLong(cursor.getColumnIndex(MediaStore.Images.Media.DATE_ADDED))
val currentTime = System.currentTimeMillis() / 1000
// 检查是否在最近几秒内保存了文件
if (Math.abs(currentTime - dateAdded) <= 5) {
Log.d(TAG, "processing错误但图片已保存: $displayName")
runOnUiThread {
Toast.makeText(baseContext, "图片已保存: $displayName", Toast.LENGTH_LONG).show()
}
} else {
runOnUiThread {
Toast.makeText(baseContext, "图片处理错误", Toast.LENGTH_LONG).show()
}
}
} else {
runOnUiThread {
Toast.makeText(baseContext, "图片处理错误", Toast.LENGTH_LONG).show()
}
}
cursor?.close()
} catch (e: Exception) {
Log.e(TAG, "检查保存文件时出错: ${e.message}")
runOnUiThread {
Toast.makeText(baseContext, "图片处理错误", Toast.LENGTH_LONG).show()
}
}
} else {
runOnUiThread {
Toast.makeText(baseContext, "未知错误", Toast.LENGTH_LONG).show()
}
}
}
else -> {
Log.e(TAG, "其他错误: ${exception.imageCaptureError}")
runOnUiThread {
Toast.makeText(baseContext, "拍照失败: ${exception.message}", Toast.LENGTH_LONG).show()
}
}
}
}
}