为什么ACTION_IMAGE_CAPTURE意图不返回已保存图像的URI?

时间:2019-05-21 17:57:57

标签: android android-intent

我正在尝试遵循Android代码here中的逻辑,该逻辑说明了如何实现“从相机获取图像”的意图。我希望你们中的一个聪明人能帮助我理解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. 添加文件名作为意图
  5. 开始意图
  6. Intent回调OnActivityResult返回,但返回了NULL数据。
  7. 请记住,您之前保存的URI仅用作返回数据。

回调数据为null似乎很奇怪,我发现它确实令人困惑。我还有其他意图吗?为什么意图不返回我一些有用的数据,例如刚刚创建的文件的URI?

1 个答案:

答案 0 :(得分:0)

如果您指定MediaStore.EXTRA_OUTPUT,则所拍摄的图像将被写入该路径,并且不会将任何数据提供给o​​nActivityResult。 您可以从指定的位置读取图像。

也请检查您的权限。