android - 将图像选择器意图中的数据转换为位图(Kotlin)?
问题描述
我目前正在尝试将用户选择的任何图像保存到房间数据库中,看起来唯一的方法是首先将其保存为位图。但是,我不确定我会如何做到这一点。
这是我现在拥有的代码:它让用户选择一个图像并在之后将其显示在一个图像视图中。但是,我不知道如何将我data?.data
的转换为位图。
如果这不是一个很好的问题,我深表歉意,我对处理 android 应用程序中的图像和图像类型非常陌生。任何帮助将不胜感激!
// Opens gallery when image button clicked, gets image
view.image_et.setOnClickListener {
readStorageTask()
//Intent to pick image
val intent = Intent(Intent.ACTION_PICK)
intent.type = "image/*"
startActivityForResult(intent, 1001)
}
// Handle result of picked image
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (resultCode == Activity.RESULT_OK && requestCode == 1001) {
preview_image.setImageURI(data?.data)
}
}
我已经看到一些类似于我的 StackOverflow 问题在 Java 中处理相同的问题,但我尝试过的问题对我不起作用。任何帮助将不胜感激!
解决方案
您可以在缓存目录中创建一个文件,然后创建位图
if (data != null && data.data != null) {
val uri = data.data!!
val inputStream = requireContext().contentResolver.openInputStream(uri)
val cursor = requireContext().contentResolver.query(uri, null, null, null, null)
cursor?.use { c ->
val nameIndex = c.getColumnIndex(OpenableColumns.DISPLAY_NAME)
if (c.moveToFirst()) {
val name = c.getString(nameIndex)
inputStream?.let { inputStream ->
// create same file with same name
val file = File(requireContext().cacheDir, name)
val os = file.outputStream()
os.use {
inputStream.copyTo(it)
}
val bitmap = BitmapFactory.decodeFile(file.absolutePath)
}
}
}
}
推荐阅读
- python - 有没有办法使用模板匹配来检测输入的变化?
- prolog - 在 SWI-Prolog 中访问和爬取文件系统
- javascript - JavaScript“静态”方法?
- c - “for”循环中的变量范围
- discord.js - 如何向加入我服务器的新用户发送私人消息?
- java - 尝试升级 Singelton 以准确获取一个对象的两个实例
- amazon-web-services - 如何在 CDK 打字稿中创建 Dynamodb 指标
- mysql - 如何解决 Incorrect string value MySQL 错误?
- sql - 按 1,2,3,4 排序
- r - 在 flexdashboard 闪亮小部件中创建一个依赖于另一个输入变量的输入变量