我是檔案存盤的新手。我的主要目標是用相機拍照,以高質量存盤,然后在 ImageView 中顯示。我想避免請求用戶許可(使用相機和外部存盤),并希望盡可能簡單。
要拍照,我正在使用
val capturePicture = registerForActivityResult(ActivityResultContracts.TakePicture()) { it: Boolean -> }. 我不知道如何從這個函式中獲取位圖,或者我是否應該。據我了解,我應該在呼叫時發送 uri capturePicture.launch(uri)。
我的問題是這是否正確,以及如何獲取 URI,將其保存到內部存盤(.openFileOutput()),然后從內部存盤加載它。
我更喜歡 Kotlin 中的答案,但 Java 也很好。關于路徑如何在內部存盤中作業的解釋也可能會有所幫助。
uj5u.com熱心網友回復:
我按照這篇中等文章教程進行了調整,并為我的用例添加了更多功能。
保存在快取目錄中的影像
拍照:
private val takeImageResult =
registerForActivityResult(ActivityResultContracts.TakePicture()) { isSuccess ->
if (isSuccess) {
latestTmpUri?.let { uri ->
loadPhotosFromInternalStorageIntoRecyclerView()
}
}
}
要呼叫拍照,保存并獲取 uri:
private var latestTmpUri: Uri? = null
private fun takeImage() {
lifecycleScope.launchWhenStarted {
getTmpFileUri().let { uri ->
latestTmpUri = uri
takeImageResult.launch(uri)
}
}
}
private fun getTmpFileUri(): Uri {
val tmpFile = File.createTempFile("tmp_image_file", ".jpg", requireActivity().cacheDir).apply {
createNewFile()
deleteOnExit()
}
return FileProvider.getUriForFile(requireActivity().applicationContext, "${BuildConfig.APPLICATION_ID}.provider", tmpFile)
}
加載圖片(加載圖片串列中的第一張圖片):
private fun loadPhotosFromInternalStorage(): List<InternalStoragePhoto> {
val files = requireActivity().cacheDir.listFiles()
return files?.filter {
it.canRead() && it.isFile && it.name.endsWith(".jpg")
}?.map {
InternalStoragePhoto(it.name, it.toUri())
} ?: listOf()
}
private fun displayImage() {
Glide.with(photoImg.context)
.load(loadPhotosFromInternalStorage()[0].uri)
.into(photoImg)
}
這是影像的自定義物件:
data class InternalStoragePhoto(
val name: String,
val uri: Uri?
)
這是我的代碼的簡化版本,這里是測驗應用github repo的源代碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/475585.html
