68 lines
2.3 KiB
Kotlin
68 lines
2.3 KiB
Kotlin
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<Uri>
|
|
|
|
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
|
|
}
|
|
} |