【发布时间】:2021-04-26 03:08:57
【问题描述】:
我发现了很多关于这个主题的问题,但没有一个有完整的工作示例。
我的情况很简单:
- 获取选取的图像
- 压缩图片
- 将压缩图像上传到 Firebase 存储
我当前的代码(未压缩):
片段:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when (requestCode) {
RC_PICK_IMAGE ->
if (resultCode == Activity.RESULT_OK)
data?.data?.let { viewModel.updateUserPicture(it) }
}
}
视图模型:
fun updatePhotoUrl(photoUrl: Uri?): Task<Void> =
Storage.uploadFile("/$PS_USERS/$uid", photoUrl)
.continueWithTask { ... }
存储:(包装 Firebase 交互的对象)
fun uploadFile(path: String, uri: Uri): Task<Uri> {
val imageRef = storageRef.child(path)
val uploadTask = imageRef.putFile(uri)
// Return the task getting the download URL
return uploadTask.continueWithTask { task ->
if (!task.isSuccessful) {
task.exception?.let {
throw it
}
}
imageRef.downloadUrl
}
}
这很好用。
现在我的问题是:在这个过程中添加压缩的正确方法是什么?
- 我找到了许多指向Compressor 库的答案(如here 和here)并尝试了它,但它不适用于图库结果uris。我找到了从中获取实际 uri 的方法(例如 here),但它们感觉像很多样板代码,所以感觉不是最佳实践。
- 我还使用
bitmap.compress(如here 和here)找到了许多答案并尝试过,但它要求提供位图。使用MediaStore.Images.Media.getBitmap获取位图很容易,但它已被弃用,this 解决方案让我怀疑它是否是正确的方向。此外,将位图保存在我的 LiveData 对象中(在屏幕上显示直到实际保存,在编辑屏幕中)而不是 uri,感觉很奇怪(我使用 Glide 来呈现图像)。
最重要的是,这两种解决方案都需要上下文。我认为压缩是一个应该属于后端(或 Repository 类。在我的例子中是 Storage 对象)的过程,所以他们感觉有点不对劲。
有人可以分享这个简单用例的完整工作示例吗?
【问题讨论】:
标签: android kotlin image-gallery image-compression imagepicker