package com.sw.dualscreen.utils import android.content.Context import android.net.Uri import android.provider.OpenableColumns import android.widget.Toast import androidx.activity.result.ActivityResultCaller import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.core.content.FileProvider import java.io.File import java.io.FileOutputStream /** * 简洁相机工具类 * 调用系统相机拍照并返回照片路径 */ class CameraHelper( private val context: Context, caller: ActivityResultCaller, private val authority: String, private val onResult: (uri: Uri, filePath: String?) -> Unit ) { private lateinit var imageUri: Uri private val takePictureLauncher: ActivityResultLauncher init { takePictureLauncher = caller.registerForActivityResult(ActivityResultContracts.TakePicture()) { success -> if (success) { val path = getRealPathFromUri(context, imageUri) onResult(imageUri, path) } else { Toast.makeText(context, "拍照取消", Toast.LENGTH_SHORT).show() } } } /** 打开系统相机 */ fun openCamera() { // 1. 创建存储图片的文件 val photoFile = File(context.externalCacheDir, "IMG_${System.currentTimeMillis()}.jpg") photoFile.parentFile?.mkdirs() // 确保目录存在 // 2. 生成 content:// Uri imageUri = FileProvider.getUriForFile(context, authority, photoFile) // 3. 启动相机 takePictureLauncher.launch(imageUri) } /** 可选:将 content:// 转为实际路径 */ private fun getRealPathFromUri(context: Context, uri: Uri): String? { var filePath: String? = null context.contentResolver.query(uri, null, null, null, null)?.use { cursor -> val nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME) cursor.moveToFirst() val fileName = cursor.getString(nameIndex) val file = File(context.cacheDir, fileName) context.contentResolver.openInputStream(uri)?.use { input -> FileOutputStream(file).use { output -> input.copyTo(output) } } filePath = file.absolutePath } return filePath } }