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

This commit is contained in:
xiajiid
2026-02-09 23:19:33 +08:00
parent 0464e235f9
commit 54aeab9760

View File

@@ -148,20 +148,175 @@ class WatermarkCameraActivity : AppCompatActivity() {
override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults) { override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults) {
val savedUri = outputFileResults.savedUri val savedUri = outputFileResults.savedUri
if (savedUri != null) { if (savedUri != null) {
// 添加水印 val msg = "照片已保存: ${savedUri.lastPathSegment}"
addWatermarkToImage(savedUri)
val msg = "照片已保存并添加水印: ${savedUri.lastPathSegment}"
Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
Log.d(TAG, msg) Log.d(TAG, msg)
// 验证文件是否真的存在
try {
val cursor = contentResolver.query(savedUri, null, null, null, null)
if (cursor != null && cursor.moveToFirst()) {
Log.d(TAG, "文件验证成功: ${savedUri}")
// 添加水印
addWatermarkToImage(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}")
// 即使验证失败,也尝试添加水印
addWatermarkToImage(savedUri)
runOnUiThread {
Toast.makeText(baseContext, "照片已保存并添加水印", Toast.LENGTH_SHORT).show()
}
}
} else { } else {
Toast.makeText(baseContext, "照片保存成功", Toast.LENGTH_SHORT).show() Log.w(TAG, "onImageSaved被调用但savedUri为null")
Log.d(TAG, "照片保存成功") runOnUiThread {
Toast.makeText(baseContext, "照片保存完成", Toast.LENGTH_SHORT).show()
}
} }
} }
override fun onError(exception: ImageCaptureException) { override fun onError(exception: ImageCaptureException) {
Log.e(TAG, "拍照失败: ${exception.message}", exception) val errorMsg = "拍照失败: ${exception.message}"
Toast.makeText(baseContext, "拍照失败: ${exception.message}", Toast.LENGTH_LONG).show() Log.e(TAG, errorMsg, exception)
// 检查错误类型
when (exception.imageCaptureError) {
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")
// 对最新文件添加水印
val latestUri = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media._ID))
val latestUriObj = Uri.parse("${MediaStore.Images.Media.EXTERNAL_CONTENT_URI}/$latestUri")
addWatermarkToImage(latestUriObj)
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")
// 对最新文件添加水印
val latestUri = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media._ID))
val latestUriObj = Uri.parse("${MediaStore.Images.Media.EXTERNAL_CONTENT_URI}/$latestUri")
addWatermarkToImage(latestUriObj)
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()
}
}
}
} }
} }
) )