android - 我希望用户从设备中选择图像然后自己将其作为位图处理,我如何在内容提供商的帮助下实现这一点?
问题描述
我找到了几种方法来实现这一点,但这些方法似乎都不是直截了当的,而且我不理解其中许多方法的代码。我最近阅读了一些关于内容解析器、内容提供者和光标的内容,这似乎是从用户那里获取存储在设备上的文件的最佳实践。现在我正在使用它,但它看起来很奇怪:
val selectedImageUri: Uri = data.data!!
val inputStream = contentResolver.query(selectedImageUri, Android.provider)
bitmap = BitmapFactory.decodeStream(inputStream)
它使用 contnt resovler 但带有输入流?我认为这是 Java 的事情,而不是在 android 上实现这一目标的最佳实践。还有这个功能
fun getBitmapFromURI(uri: Uri): Bitmap? {
val filePathColumn = arrayOf(MediaStore.Images.Media.DATA)
val cursor: Cursor? =
this.contentResolver.query(uri, filePathColumn, null, null, null)
if (cursor != null) {
cursor.moveToFirst()
val columnIndex = cursor.getColumnIndex(filePathColumn[0])
val fImage = File(cursor.getString(columnIndex))
cursor.close()
val o2 = BitmapFactory.Options()
return BitmapFactory.decodeFile(fImage.absolutePath, o2)
}
return null
}
我从 SO 上的另一个线程复制了这个,但感觉很奇怪,因为我不明白为什么我们要求光标转到第一个,不管为什么其余参数都以 null 形式传递。someoen 可以为我提供遵循所有最佳实践并以非常有效的方式做事的最佳代码吗?
解决方案
推荐阅读
- r - 使用 forcats 包而不是基础 R
- mongodb - 如何将 FastAPI 路由器与 FastAPI-Users 和 MongoDB 一起使用?
- azure-devops - Azure devops 交互式代理作为管理员
- python - Python 解释器不在环境中,但 conda 报告它在环境中
- excel - Excel 中禁用了已签名的宏
- laravel - 部署 Heroku/Laravel - 禁止 - Sem Permissão
- python - 如何通过 xlwt 将总和行转换为 xls
- firebase-hosting - Firebase CLI 无法登录
- javascript - 在 jQuery 中访问 freemaker 变量
- excel - 用于 VBA 编码的 Hessian 矩阵