Почему ACTION_IMAGE_CAPTURE Intent не возвращает URI для сохраненного изображения? - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь следовать логике в коде Android здесь , который объясняет, как выполнить намерение «Получить изображение с камеры».Я надеюсь, что один из вас, умных людей из SO, сможет помочь мне понять, ПОЧЕМУ Google разработал намерение таким образом.Сначала функция, которая запускает Intent:

val REQUEST_TAKE_PHOTO = 1

private fun dispatchTakePictureIntent() {
    Intent(MediaStore.ACTION_IMAGE_CAPTURE).also { takePictureIntent ->
        // Ensure that there's a camera activity to handle the intent
        takePictureIntent.resolveActivity(packageManager)?.also {
            // Create the File where the photo should go
            val photoFile: File? = try {
                createImageFile()
            } catch (ex: IOException) {
                // Error occurred while creating the File
                ...
                null
            }
            // Continue only if the File was successfully created
            photoFile?.also {
                val photoURI: Uri = FileProvider.getUriForFile(
                        this,
                        "com.example.android.fileprovider",
                        it
                )
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI)
                startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO)
            }
        }
    }
}

Обратите внимание, что этот код ссылается на другую функцию, которая создает файл и имя файла:

var currentPhotoPath: String

@Throws(IOException::class)
private fun createImageFile(): File {
    // Create an image file name
    val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
    val storageDir: File = getExternalFilesDir(Environment.DIRECTORY_PICTURES)
    return File.createTempFile(
            "JPEG_${timeStamp}_", /* prefix */
            ".jpg", /* suffix */
            storageDir /* directory */
    ).apply {
        // Save a file: path for use with ACTION_VIEW intents
        currentPhotoPath = absolutePath
    }
}

Наконец, если у вас есть намерениеи разработал для Android, прежде чем вы знаете, что вам нужна функция OnActivityResult, поэтому вот одна из них:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        val imageBitmap = data.extras.get("data") as Bitmap
        imageView.setImageBitmap(imageBitmap)
    }
}

Так что, если вы запустите этот код, он потерпит неудачу, что является источником моего вопроса, и я надеюсь, что кто-то,возможно, кто-то из команды разработчиков Android может объяснить мне, почему это популярное намерение возвращает нулевые данные.

Очевидный логический ход для этого следующий:

  1. Запустите намерение ACTION_IMAGE_CAPTURE
  2. Создайте файл для сохранения изображения в
  3. Сохраните URI этого файла в свою собственную переменную, потому что он понадобится вам позже
  4. Добавьте имя файла в качестве дополнительного кintent
  5. Начать намерение
  6. Интеллектуальный обратный вызов OnActivityResult возвращает, но с ним передаются данные NULL.
  7. Помните, что URI, который вы сохранили из eaпросто используйте это как свои возвращаемые данные.

Просто кажется странным, что данные обратного вызова являются нулевыми, и я нашел это действительно запутанным.Есть ли другое намерение, которое я должен использовать?Почему намерение не возвращает мне некоторые полезные данные, такие как URI для только что созданного файла?

1 Ответ

0 голосов
/ 22 мая 2019

Если вы указали MediaStore.EXTRA_OUTPUT, полученное изображение будет записано в этот путь, и данные onActivityResult не будут переданы.Вы можете прочитать изображение из того, что вы указали.

Также, пожалуйста, проверьте ваши разрешения.

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