![](/img/trans.png)
[英]Accessing Gallery using ActivityResultContracts.GetContent
[英]Save image to internal storage using ActivityResultContracts.GetContent(). - (Kotlin/Java/Android)
我是文件存儲的新手。 我的主要目標是用相機拍照,以高質量存儲,然后在 ImageView 中顯示。 我想避免請求用戶許可(使用相機和外部存儲),並希望盡可能簡單。
要拍照,我正在使用
val capturePicture = registerForActivityResult(ActivityResultContracts.TakePicture()) { it: Boolean -> }
。 我不知道如何從這個函數中獲取位圖,或者我是否應該。 據我了解,我應該在調用capturePicture.launch(uri)
時發送 uri。
我的問題是這是否正確,以及如何獲取 URI,將其保存到內部存儲( .openFileOutput()
),然后從內部存儲加載它。
我更喜歡 Kotlin 中的答案,但 Java 也很好。 關於路徑如何在內部存儲中工作的解釋也可能會有所幫助。
我按照這篇中等文章教程進行了調整,並為我的用例添加了更多功能。
保存在緩存目錄中的圖像
拍照:
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的源代碼
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.