From e75c9f5c4560d5ee3832f968ce9f9aea51fb0d8a Mon Sep 17 00:00:00 2001 From: xiajiid Date: Tue, 10 Feb 2026 18:42:25 +0800 Subject: [PATCH] feat: merge three camera modes into unified CameraActivity - Added mode toggle button to switch between photo, watermark, and compose modes - Integrated watermark functionality from WatermarkCameraActivity - Integrated simple camera functionality from SimpleCameraActivity - Updated MainActivity to launch CameraActivity directly - Cleaned up AndroidManifest.xml by removing unused activities - Updated layout with mode selection button - All three camera modes now available in single unified interface --- app/src/main/AndroidManifest.xml | 8 - .../java/com/example/app/CameraActivity.kt | 173 +++++++- .../com/example/app/CameraSelectorActivity.kt | 34 -- .../main/java/com/example/app/MainActivity.kt | 28 +- .../com/example/app/SimpleCameraActivity.kt | 320 -------------- .../example/app/WatermarkCameraActivity.kt | 391 ------------------ .../res/layout/activity_camera_selector.xml | 56 --- app/src/main/res/layout/activity_main.xml | 12 +- .../res/layout/activity_simple_camera.xml | 26 +- 9 files changed, 192 insertions(+), 856 deletions(-) delete mode 100644 app/src/main/java/com/example/app/CameraSelectorActivity.kt delete mode 100644 app/src/main/java/com/example/app/SimpleCameraActivity.kt delete mode 100644 app/src/main/java/com/example/app/WatermarkCameraActivity.kt delete mode 100644 app/src/main/res/layout/activity_camera_selector.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 49ccf89..7ffdad2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -28,14 +28,6 @@ - - { + modeButton.text = "模式: 普通" + watermarkEnabled = false + } + MODE_WATERMARK -> { + modeButton.text = "模式: 水印" + watermarkEnabled = true + } + MODE_COMPOSE -> { + modeButton.text = "模式: 合成" + watermarkEnabled = false + } + } + Toast.makeText(this, "已切换到${getModeName(mode)}", Toast.LENGTH_SHORT).show() + } + + private fun getModeName(mode: Int): String { + return when (mode) { + MODE_PHOTO -> "普通模式" + MODE_WATERMARK -> "水印模式" + MODE_COMPOSE -> "合成模式" + else -> "未知模式" + } + } + } override fun onDestroy() { @@ -330,6 +397,110 @@ class CameraActivity : AppCompatActivity() { } } ) + private fun addWatermarkAndSave(originalUri: Uri) { + try { + // 读取原始图片 + val inputStream = contentResolver.openInputStream(originalUri) + val originalBitmap = BitmapFactory.decodeStream(inputStream) + inputStream?.close() + + if (originalBitmap == null) { + Log.e(TAG, "无法读取图片: $originalUri") + return + } + + // 添加水印 + val watermarkedBitmap = addWatermark(originalBitmap) + + // 保存带水印的图片 + val timestamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date()) + val contentValues = ContentValues().apply { + put(MediaStore.MediaColumns.DISPLAY_NAME, "巡检_${timestamp}_水印.jpg") + put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg") + put(MediaStore.MediaColumns.RELATIVE_PATH, "Pictures/LogCam") + } + + val uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues) + + if (uri != null) { + val outputStream = contentResolver.openOutputStream(uri) + + if (outputStream != null) { + watermarkedBitmap.compress(Bitmap.CompressFormat.JPEG, 95, outputStream) + outputStream.close() + + // 通知相册更新 + MediaStore.Images.Media.insertImage(contentResolver, watermarkedBitmap, contentValues.getAsString(MediaStore.MediaColumns.DISPLAY_NAME), "") + + runOnUiThread { + Toast.makeText(baseContext, "图片已保存并添加水印", Toast.LENGTH_LONG).show() + addPhotoToPreview(uri) + } + } else { + Log.e(TAG, "无法打开输出流: $uri") + } + } else { + Log.e(TAG, "无法创建新文件") + } + + // 回收位图 + originalBitmap.recycle() + watermarkedBitmap.recycle() + } catch (e: Exception) { + Log.e(TAG, "添加水印失败: ${e.message}", e) + runOnUiThread { + Toast.makeText(baseContext, "添加水印失败: ${e.message}", Toast.LENGTH_LONG).show() + } + } + } + + private fun addWatermark(originalBitmap: Bitmap): Bitmap { + val timestamp = SimpleDateFormat("yyyy年-MM月-dd日 HH:mm:ss", Locale.getDefault()).format(Date()) + + // 创建可修改的位图副本 + val mutableBitmap = originalBitmap.copy(Bitmap.Config.ARGB_8888, true) + val canvas = Canvas(mutableBitmap) + + // 创建水印画笔 + val paint = Paint().apply { + color = Color.WHITE + textSize = 48f + isAntiAlias = true + typeface = Typeface.create(Typeface.DEFAULT, Typeface.BOLD) + textAlign = Paint.Align.RIGHT + } + + // 计算文本大小 + val bounds = android.graphics.Rect() + paint.getTextBounds(timestamp, 0, timestamp.length, bounds) + + // 在右下角绘制时间戳水印 + val padding = 50f + canvas.drawText( + timestamp, + mutableBitmap.width - padding, + mutableBitmap.height - padding - bounds.height(), + paint + ) + + // 绘制白色边框以提高可读性 + val borderPaint = Paint().apply { + color = Color.BLACK + strokeWidth = 4f + style = Paint.Style.STROKE + isAntiAlias = true + } + + canvas.drawText( + timestamp, + mutableBitmap.width - padding, + mutableBitmap.height - padding - bounds.height(), + borderPaint + ) + + return mutableBitmap + } + } private fun createOutputFileOptions(): ImageCapture.OutputFileOptions { diff --git a/app/src/main/java/com/example/app/CameraSelectorActivity.kt b/app/src/main/java/com/example/app/CameraSelectorActivity.kt deleted file mode 100644 index eff3ef0..0000000 --- a/app/src/main/java/com/example/app/CameraSelectorActivity.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.example.app - -import android.content.Intent -import android.os.Bundle -import android.widget.Button -import androidx.appcompat.app.AppCompatActivity - -class CameraSelectorActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_camera_selector) - - val btnSimpleCamera = findViewById