簡體   English   中英

使用 ActivityResultContracts.GetContent() 將圖像保存到內部存儲。 - (科特林/Java/Android)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM