gpt4 book ai didi

安卓 Q : Get image from gallery and process it

转载 作者:行者123 更新时间:2023-11-29 00:52:03 28 4
gpt4 key购买 nike

我知道这似乎是一个非常基本的问题,但它专门针对 Android Q。

我只想从Gallery 中获取一张图片并将其压缩并发送到服务器。但是由于 Android Q 的 Scoped Storage,它比我想象的要难。我将首先解释我用代码做了什么:

首先,我发出选择图像的 Intent 。

fun openGallery(fragment: Fragment){
val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
intent.type = "*/*"
val mimeTypes = arrayOf("image/*")
intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes)
fragment.startActivityForResult(intent, REQUEST_IMAGE_PICK)
}

它工作正常,我可以在 onActivityResult 方法中获取图像

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {

if (requestCode == REQUEST_IMAGE_PICK && resultCode == Activity.RESULT_OK && null != data) {
val selectedImage = data.data

val source = ImageDecoder.createSource(activity!!.contentResolver, selectedImage)
val bitmap = ImageDecoder.decodeBitmap(source)
mBinding.circularProfileImage.setImageBitmap(bitmap)
}
}

现在的问题是如何以文件格式访问此图像,以便进一步处理/压缩它。

以下是我尝试过的:

val mImagePath = getImagePathFromUri(activity!!, selectedImage)

这是我得到的路径:

/storage/emulated/0/DCIM/Camera/IMG_20191022_152437.jpg

我通过以下方式从中创建了一个文件:

val file = File(mImagePath)

下面是我压缩和上传图片的自定义逻辑:

val mNewFile = MediaCompressor.compressCapturedImage(activity!!, file, "ProfilePictures")
uploadProfile(mNewFile)

在这个自定义逻辑中,我有一个方法来处理图像的采样和旋转,如下所示:

fun handleSamplingAndRotationBitmap(context: Context, selectedImage: File, reqWidth: Int, reqHeight: Int): Bitmap {

val mUri = Uri.fromFile(selectedImage)

// First decode with inJustDecodeBounds=true to check dimensions
val options = BitmapFactory.Options()
options.inJustDecodeBounds = true
var imageStream = context.contentResolver.openInputStream(mUri)
BitmapFactory.decodeStream(imageStream, null, options)
imageStream!!.close()

// Calculate inSampleSize
options.inSampleSize =
calculateInSampleSize(options, reqWidth, reqHeight)

// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false
imageStream = context.contentResolver.openInputStream(mUri)

var img = BitmapFactory.decodeStream(imageStream, null, options)

img = rotateImageIfRequired(context, img!!, mUri)
return img
}

但是当我尝试使用 context.contentResolver.openInputStream 打开流时我收到以下错误:

java.io.FileNotFoundException: /storage/emulated/0/DCIM/Camera/IMG_20191022_152437.jpg: open failed: EACCES (Permission denied)

我知道我收到这个是因为在 Android 10 中我们没有直接访问外部存储文件的权限。

所以,请帮我解决这个问题,如何在 Android 10 中将外部存储中的图像用作文件。

注意:我拥有所有必需的权限,所以这不是问题

最佳答案

Following things I've tried:

没有可靠的 getImagePathFromUri() 实现。

In this custom logic, I have a method to handle sampling and rotation of the image as follows:

在该函数中不需要 File。毕竟,您在该函数中的第一条语句 会从该 File 创建一个 Uri。因此,将 File 参数替换为您拥有的 Uri,并跳过 Uri.fromFile() 调用。

how can I use the image from external storage as a file in Android 10.

你不能。而且,如上所示,您不需要它来完成您正在做的事情。

如果您发现自己在某些情况下无法使用某些绝对肯定必须具有文件的库或API:

  • 像今天一样,使用 contentResolver.openInputStream() 在内容上打开一个 InputStream
  • InputStream 中的字节复制到您可以读/写的文件中的某些 FileOutputStream(例如,getCacheDir() 上下文)
  • 将您的副本与需要文件的库或 API 一起使用

关于安卓 Q : Get image from gallery and process it,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58539583/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com