我知道这似乎是一个非常基本的问题,但它专门针对Android Q。
我只想从图库获取图像,将其压缩并发送到服务器。但由于Android Q的Scoped Storage,它比我想象的要困难。我首先会解释我用代码做了什么:
首先,我发送意图来选择图像。
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中将外部存储器中的图像作为文件使用。
注意:我已经获得了所有必要的权限,所以这不是问题所在。