我想打开相机,并在拍照后将图像保存为位图。我找到了解决方案,但是部分解决方案无法正常工作。
有人知道导致此异常的原因吗?
getImageFromResult()
在onActivityResult
内部被调用。
结果代码是从相机意图返回的结果代码,ImageReturnedIntent
是数据(图像)。
例外:fileDescriptorErr: open failed: ENOENT (No such file or directory) (decodeBitmap)
代码:
fun getImageFromResult(
context: Context, resultCode: Int,
imageReturnedIntent: Intent?
): Bitmap? {
var bm: Bitmap? = null
val imageFile = getTempFile(context)
if (resultCode == RESULT_OK) {
val selectedImage: Uri?
val isCamera = imageReturnedIntent == null ||
imageReturnedIntent.data == null ||
imageReturnedIntent.data == Uri.fromFile(imageFile)
if (isCamera) {
/** CAMERA */
selectedImage = Uri.fromFile(imageFile)
} else {
/** ALBUM */
selectedImage = imageReturnedIntent!!.data
}
selectedPhotoName = selectedImage.toString()
bm = getImageResized(context, selectedImage)
val rotation = getRotation(context, selectedImage, isCamera)
bm = rotate(bm, rotation)
}
return bm
}
/**
* Resize to avoid using too much memory loading big images (e.g.: 4096 × 2160)
*/
private fun getImageResized(context: Context, selectedImage: Uri): Bitmap {
var bm: Bitmap
val sampleSizes = intArrayOf(5, 3, 2, 1)
var i = 0
do {
bm = decodeBitmap(context, selectedImage, sampleSizes[i])
i++
} while (bm.width < DEFAULT_MIN_WIDTH_QUALITY && i < sampleSizes.size)
return bm
}
private fun decodeBitmap(context: Context, theUri: Uri, sampleSize: Int): Bitmap {
val options = BitmapFactory.Options()
options.inSampleSize = sampleSize
var fileDescriptor: AssetFileDescriptor? = null
try {
fileDescriptor = context.contentResolver.openAssetFileDescriptor(theUri, "r")
} catch (e: FileNotFoundException) {
App.log("CameraPhoto: fileDescriptorErr: ${e.message} (decodeBitmap) ")
}
val actuallyUsableBitmap = BitmapFactory.decodeFileDescriptor(
fileDescriptor?.fileDescriptor, null, options
)
return actuallyUsableBitmap
}