Возвращенное изображение с камеры Ошибка на fileDescriptors - PullRequest
0 голосов
/ 19 июня 2019

Я хочу открыть камеру и сохранить изображение как растровое изображение после того, как фотография сделана. Я нашел решение, но часть его не работает должным образом.

Кто-нибудь знает, что может вызвать это исключение?

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
        }
...