Я хочу открыть камеру и сохранить изображение как растровое изображение после того, как фотография сделана. Я нашел решение, но часть его не работает должным образом.
Кто-нибудь знает, что может вызвать это исключение?
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
}