Файл найден с использованием android MediaStore, но BitmapFactory не может его декодировать с помощью пути, возвращенного из MediaStore - PullRequest
0 голосов
/ 26 мая 2020

Я искал все выше и ниже и не нашел ответа на свой конкретный вопрос, надеюсь, кто-нибудь может помочь. Я разрабатываю это для Android 9 и выше, код, который я использую для старых выпусков, работает нормально.

Это довольно просто, я сохранил изображение в MediaStore, я нашел изображение в хранилище мультимедиа, я возвращаю его путь, я проверяю, что путь существует, и он есть, он также имеет правильный размер и отображается в галерее android. Итак, почему, когда я пытаюсь открыть его с помощью

val bitmap2 = BitmapFactory.decodeFile (fullPath)

bitmap2 возвращается как null - эта команда не генерирует ошибок. Функция parseAllImages была взята из Интернета и немного изменена, но, похоже, работает нормально, насколько я могу судить.

пример кода

        private fun setPic() {
        if (mediaPath.isNotEmpty()) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                val content = GalleryAdd.parseAllImages(requireActivity(), mediaPath)
                val fullPath = content
                if (File(fullPath).exists()) {
                    val tester = File(fullPath).length()
                    val bitmap2 = BitmapFactory.decodeFile(fullPath)
                    viewModel.setBitmap(bitmap2)
                }

            }
        }
    }

    fun parseAllImages(act : Activity, name : String) : String {
        try {
            val projection =
                arrayOf(MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID)
            val cursor = act.contentResolver.query(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                projection,  // Which columns to return
                null,  // Return all rows
                null,
                null
            )
            val size: Int = cursor!!.getCount()
            /*******  If size is 0, there are no images on the SD Card.  */
            if (size == 0) {
            } else {
                val thumbID = 0
                if (cursor != null) {
                    while (cursor.moveToNext()) {
                        val file_ColumnIndex: Int =
                            cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)
                        /**************** Captured image details  */
                        /*****  Used to show image on view in LoadImagesFromSDCard class  */
                        val idColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID)
                        val path: String = cursor.getString(file_ColumnIndex)
                        val fileName =
                            path.substring(path.lastIndexOf("/") + 1, path.length)
                        if (fileName == name)
                        {
                            return path
                        }
                    }
                }
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return ""
    }

Фрагмент кода, который я использую для записи в хранилище мультимедиа

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            val resolver: ContentResolver = activity.contentResolver
            val contentValues = ContentValues()
            contentValues.put(
                MediaStore.MediaColumns.DISPLAY_NAME,
                fileName
            )
            contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpg")
            contentValues.put(
                MediaStore.MediaColumns.RELATIVE_PATH,
                Environment.DIRECTORY_PICTURES + File.separator + "fishy"
            )
            val imageUri: Uri? =
                resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)

            val tester = imageUri.toString() + File.separator +  Environment.DIRECTORY_PICTURES + File.separator + "fishy" + File.separator + fileName
            scanLoc = fileName
            fos = resolver.openOutputStream(imageUri!!)!!

        val file = File(currentPhotoPath)
        val ins: InputStream = file.inputStream()
        ins.copyTo(fos)
}

Любая помощь или может кто-нибудь указать мне на образец кода, который может читать изображение jpg из медиа-магазина, учитывая его имя? Он не готов к производству, поэтому, пожалуйста, простите за отсутствие проверок ошибок.

Спасибо

Lee.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...