首页 > 解决方案 > 我希望用户从设备中选择图像然后自己将其作为位图处理,我如何在内容提供商的帮助下实现这一点?

问题描述

我找到了几种方法来实现这一点,但这些方法似乎都不是直截了当的,而且我不理解其中许多方法的代码。我最近阅读了一些关于内容解析器、内容提供者和光标的内容,这似乎是从用户那里获取存储在设备上的文件的最佳实践。现在我正在使用它,但它看起来很奇怪:

            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 可以为我提供遵循所有最佳实践并以非常有效的方式做事的最佳代码吗?

标签: androidandroid-contentproviderandroid-bitmapandroid-contentresolverandroid-cursorloader

解决方案


推荐阅读