diff --git a/app/src/main/java/com/example/app/WatermarkCameraActivity.kt b/app/src/main/java/com/example/app/WatermarkCameraActivity.kt index 6cf2726..78e4f7e 100644 --- a/app/src/main/java/com/example/app/WatermarkCameraActivity.kt +++ b/app/src/main/java/com/example/app/WatermarkCameraActivity.kt @@ -148,20 +148,175 @@ class WatermarkCameraActivity : AppCompatActivity() { override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults) { val savedUri = outputFileResults.savedUri if (savedUri != null) { - // 添加水印 - addWatermarkToImage(savedUri) - val msg = "照片已保存并添加水印: ${savedUri.lastPathSegment}" - Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show() + val msg = "照片已保存: ${savedUri.lastPathSegment}" 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 { - Toast.makeText(baseContext, "照片保存成功", Toast.LENGTH_SHORT).show() - Log.d(TAG, "照片保存成功") + Log.w(TAG, "onImageSaved被调用但savedUri为null") + runOnUiThread { + Toast.makeText(baseContext, "照片保存完成", Toast.LENGTH_SHORT).show() + } } } override fun onError(exception: ImageCaptureException) { - Log.e(TAG, "拍照失败: ${exception.message}", exception) - Toast.makeText(baseContext, "拍照失败: ${exception.message}", Toast.LENGTH_LONG).show() + val errorMsg = "拍照失败: ${exception.message}" + 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() + } + } + } } } )